You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by we...@apache.org on 2010/03/04 23:07:10 UTC

svn commit: r919200 - in /myfaces/extensions/scripting/trunk: core/core/src/main/java/org/apache/myfaces/scripting/api/ core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/ examples/myfaces20-example...

Author: werpu
Date: Thu Mar  4 22:07:09 2010
New Revision: 919200

URL: http://svn.apache.org/viewvc?rev=919200&view=rev
Log:
https://issues.apache.org/jira/browse/EXTSCRIPT-84

https://issues.apache.org/jira/browse/EXTSCRIPT-85

The dynamic system events now work like a breeze it needs a little bit further testing
but I guess it is time for another commit.

Added:
    myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/SystemEventListenerProxy.java   (with props)
    myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/eventTest/
    myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/eventTest/TestListener.java   (with props)
Modified:
    myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/ScriptingConst.java
    myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/ApplicationProxy.java
    myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/faces-config.xml
    myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/TaintHistory.java
    myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/TaintHistoryRenderer.java
    myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/complexBean.xhtml
    myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/resources/styles/main.css

Modified: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/ScriptingConst.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/ScriptingConst.java?rev=919200&r1=919199&r2=919200&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/ScriptingConst.java (original)
+++ myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/ScriptingConst.java Thu Mar  4 22:07:09 2010
@@ -66,6 +66,7 @@
     public static final int ARTIFACT_TYPE_RESPONSESTREAM = 19;
     public static final int ARTIFACT_TYPE_RESOURCEHANDLER = 19;
     public static final int ARTIFACT_TYPE_CLIENTBEHAVIORRENDERER = 20;
+    public static final int ARTIFACT_TYPE_SYSTEMEVENTLISTENER = 21;
 
     public static final String CTX_REQUEST_CNT = "RequestCnt";
     public static final String CTX_CONFIGURATION = "ExtScriptingConfig";

Modified: myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/ApplicationProxy.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/ApplicationProxy.java?rev=919200&r1=919199&r2=919200&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/ApplicationProxy.java (original)
+++ myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/ApplicationProxy.java Thu Mar  4 22:07:09 2010
@@ -20,7 +20,6 @@
 
 import org.apache.myfaces.scripting.api.Decorated;
 import org.apache.myfaces.scripting.api.ScriptingConst;
-import org.apache.myfaces.scripting.core.util.ReflectUtil;
 import org.apache.myfaces.scripting.core.util.WeavingContext;
 import org.apache.myfaces.scripting.jsf2.annotation.purged.*;
 
@@ -34,7 +33,6 @@
 import javax.faces.el.*;
 import javax.faces.event.*;
 import javax.faces.validator.Validator;
-import java.lang.annotation.Annotation;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 
@@ -59,7 +57,74 @@
     * we have to do a double bookkeeping
     * here
     */
-    Map<String, String> _behaviors = new ConcurrentHashMap();
+    Map<String, String> _behaviors = new ConcurrentHashMap<String, String>();
+
+    /**
+     * special data structure to save our
+     * object -> proxy references
+     */
+    class EventHandlerProxyEntry {
+        Class event;
+        Decorated proxy;
+
+        EventHandlerProxyEntry(Class event, Decorated proxy) {
+            this.event = event;
+            this.proxy = proxy;
+        }
+
+        public Class getEvent() {
+            return event;
+        }
+
+        public void setEvent(Class event) {
+            this.event = event;
+        }
+
+        public Decorated getProxy() {
+            return proxy;
+        }
+
+        public void setProxy(Decorated proxy) {
+            this.proxy = proxy;
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+
+            EventHandlerProxyEntry that = (EventHandlerProxyEntry) o;
+
+            if (event != null ? !event.equals(that.event) : that.event != null) return false;
+            if (proxy != null ? !proxy.getDelegate().getClass().getName().equals(that.proxy.getDelegate().getClass().getName()) : that.proxy != null)
+                return false;
+
+            return true;
+        }
+
+        @Override
+        public int hashCode() {
+            int result = event.hashCode();
+            result = 31 * result + proxy.getDelegate().getClass().getName().hashCode();
+            return result;
+        }
+    }
+
+    /**
+     * now at the first look this looks like a weird construct
+     * but the standard java set imposes this limit since
+     * we have to iterate over the entire set to reach the correct element
+     * the trick is to save the same object in as both key and value
+     * and now if we generate a new key on an object
+     * we can fetch our proxy which might already contain
+     * the same object in a refreshed state from the value
+     * part of the set, in our case
+     * using hashmaps should speed things up
+     * <p/>
+     * since we only have few write operations but access
+     * the map multithready we use concurrentHashMap here
+     */
+    Map<EventHandlerProxyEntry, EventHandlerProxyEntry> _eventHandlerIdx = new ConcurrentHashMap<EventHandlerProxyEntry, EventHandlerProxyEntry>();
 
     public ApplicationProxy(Application delegate) {
         _delegate = delegate;
@@ -653,25 +718,50 @@
     @Override
     public void subscribeToEvent(Class<? extends SystemEvent> eventClass, Class<?> aClass, SystemEventListener systemEventListener) {
         weaveDelegate();
+        systemEventListener = makeEventProxy(eventClass, systemEventListener);
         _delegate.subscribeToEvent(eventClass, aClass, systemEventListener);
     }
 
+    private SystemEventListener makeEventProxy(Class<? extends SystemEvent> eventClass, SystemEventListener systemEventListener) {
+        if (WeavingContext.isDynamic(systemEventListener.getClass())) {
+            systemEventListener = new SystemEventListenerProxy(systemEventListener);
+            EventHandlerProxyEntry entry = new EventHandlerProxyEntry(eventClass, (Decorated) systemEventListener);
+            _eventHandlerIdx.put(entry, entry);
+        }
+        return systemEventListener;
+    }
+
     @Override
-    public void subscribeToEvent(Class<? extends SystemEvent> aClass, SystemEventListener systemEventListener) {
+    public void subscribeToEvent(Class<? extends SystemEvent> eventClass, SystemEventListener systemEventListener) {
         weaveDelegate();
-        _delegate.subscribeToEvent(aClass, systemEventListener);
+        systemEventListener = makeEventProxy(eventClass, systemEventListener);
+        _delegate.subscribeToEvent(eventClass, systemEventListener);
     }
 
     @Override
     public void unsubscribeFromEvent(Class<? extends SystemEvent> eventClass, Class<?> aClass, SystemEventListener systemEventListener) {
         weaveDelegate();
+        systemEventListener = resolveEventProxy(eventClass, systemEventListener);
         _delegate.unsubscribeFromEvent(eventClass, aClass, systemEventListener);
     }
 
+    private SystemEventListener resolveEventProxy(Class<? extends SystemEvent> eventClass, SystemEventListener systemEventListener) {
+        if (WeavingContext.isDynamic(systemEventListener.getClass())) {
+            systemEventListener = new SystemEventListenerProxy(systemEventListener);
+            EventHandlerProxyEntry entry = new EventHandlerProxyEntry(eventClass, (Decorated) systemEventListener);
+            entry = _eventHandlerIdx.remove(entry);
+            if (entry != null) {
+                systemEventListener = (SystemEventListener) entry.getProxy().getDelegate();
+            }
+        }
+        return systemEventListener;
+    }
+
     @Override
-    public void unsubscribeFromEvent(Class<? extends SystemEvent> aClass, SystemEventListener systemEventListener) {
+    public void unsubscribeFromEvent(Class<? extends SystemEvent> eventClass, SystemEventListener systemEventListener) {
         weaveDelegate();
-        _delegate.unsubscribeFromEvent(aClass, systemEventListener);
+        systemEventListener = resolveEventProxy(eventClass, systemEventListener);
+        _delegate.unsubscribeFromEvent(eventClass, systemEventListener);
     }
 
     public Object getDelegate() {

Added: myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/SystemEventListenerProxy.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/SystemEventListenerProxy.java?rev=919200&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/SystemEventListenerProxy.java (added)
+++ myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/SystemEventListenerProxy.java Thu Mar  4 22:07:09 2010
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.myfaces.scripting.jsf.dynamicdecorators.implemetations;
+
+import org.apache.myfaces.scripting.api.Decorated;
+import org.apache.myfaces.scripting.api.ScriptingConst;
+import org.apache.myfaces.scripting.core.util.WeavingContext;
+
+import javax.faces.event.SystemEvent;
+import javax.faces.event.SystemEventListener;
+
+/**
+ * a method level reloading proxy class
+ * we do not use auto proxies here because
+ * this class needs special treatment
+ * over our decorated interface
+ *
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ */
+
+public class SystemEventListenerProxy implements Decorated, SystemEventListener {
+
+    SystemEventListener _delegate;
+
+    public SystemEventListenerProxy(SystemEventListener delegate) {
+        _delegate = delegate;
+    }
+
+    public boolean isListenerForSource(Object source) {
+        weaveDelegate();
+        return _delegate.isListenerForSource(source);
+    }
+
+    public void processEvent(SystemEvent event) {
+        weaveDelegate();
+        _delegate.processEvent(event);
+    }
+
+    @Override
+    public Object getDelegate() {
+        return _delegate;
+    }
+
+    private void weaveDelegate() {
+        //TODO add a speed optimization here by pushing something in the request map
+        if (_delegate != null) {
+            _delegate = (SystemEventListener) WeavingContext.getWeaver().reloadScriptingInstance(_delegate, ScriptingConst.ARTIFACT_TYPE_SYSTEMEVENTLISTENER);
+        }
+    }
+}

Propchange: myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/SystemEventListenerProxy.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/SystemEventListenerProxy.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Modified: myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/faces-config.xml
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/faces-config.xml?rev=919200&r1=919199&r2=919200&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/faces-config.xml (original)
+++ myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/faces-config.xml Thu Mar  4 22:07:09 2010
@@ -67,7 +67,7 @@
     </application>
 
 
-    
+
 
     <lifecycle>
         <phase-listener>
@@ -114,4 +114,10 @@
             <renderer-class>org.apache.myfaces.groovyloader.test.TestRenderer</renderer-class>
         </renderer>
     </render-kit>
+    <application>
+        <system-event-listener>
+            <system-event-listener-class>org.apache.myfaces.javaloader.eventTest.TestListener</system-event-listener-class>
+            <system-event-class>javax.faces.event.PreRenderViewEvent</system-event-class>
+        </system-event-listener>
+    </application>
 </faces-config>
\ No newline at end of file

Modified: myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/TaintHistory.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/TaintHistory.java?rev=919200&r1=919199&r2=919200&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/TaintHistory.java (original)
+++ myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/TaintHistory.java Thu Mar  4 22:07:09 2010
@@ -21,13 +21,26 @@
 
 import javax.faces.component.FacesComponent;
 import javax.faces.component.UIOutput;
+import javax.faces.event.*;
+import java.util.logging.Logger;
 
 /**
  * @author Werner Punz (latest modification by $Author$)
  * @version $Revision$ $Date$
  */
 @FacesComponent("org.apache.myfaces.scripting.components.TaintHistory")
-public class TaintHistory extends UIOutput {
+@ListenersFor( value = {
+        @ListenerFor(systemEventClass = PostAddToViewEvent.class),
+        @ListenerFor(systemEventClass = PreRenderComponentEvent.class)
+    }
+)
+public class TaintHistory extends UIOutput implements ComponentSystemEventListener {
+    static Logger _log = Logger.getLogger(TaintHistory.class.getName());
+
+    public void processEvent(ComponentSystemEvent event) {
+        _log.info("processing event"+event.getClass().getName());
+    }
+    
 
     static final int DEFAULT_NO_ENTRIES = 10;
 
@@ -45,6 +58,7 @@
         getStateHelper().put(PropertyKeys.noEntries, entries);
     }
 
+    
     public int getNoEntries() {
         Integer retVal = (Integer) getStateHelper().eval(PropertyKeys.noEntries);
         if (retVal == null) {

Modified: myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/TaintHistoryRenderer.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/TaintHistoryRenderer.java?rev=919200&r1=919199&r2=919200&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/TaintHistoryRenderer.java (original)
+++ myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/componentTest/TaintHistoryRenderer.java Thu Mar  4 22:07:09 2010
@@ -29,6 +29,7 @@
 import javax.faces.component.UIComponent;
 import javax.faces.context.FacesContext;
 import javax.faces.context.ResponseWriter;
+import javax.faces.event.*;
 import javax.faces.render.FacesRenderer;
 import java.io.IOException;
 import java.text.DateFormat;
@@ -43,18 +44,18 @@
  * @version $Revision$ $Date$
  */
 @FacesRenderer(componentFamily = "javax.faces.Output", rendererType = "org.apache.myfaces.scripting.components.TaintHistoryRenderer")
-public class TaintHistoryRenderer extends HtmlTextRendererBase {
-    static Logger _log = Logger.getLogger(JavaTestRenderer1.class.getName());
+public class TaintHistoryRenderer extends HtmlTextRendererBase  {
+    static Logger _log = Logger.getLogger(TaintHistoryRenderer.class.getName());
 
-  @Override
+
+    @Override
     public void encodeBegin(FacesContext context, UIComponent component) throws IOException {
         super.encodeBegin(context, component);
 
         ResponseWriter wrtr = FacesContext.getCurrentInstance().getResponseWriter();
 
         startDiv(component, wrtr, "historyBox");
-        int lastTainted = ((TaintHistory)component).getNoEntries();
-
+        int lastTainted = ((TaintHistory) component).getNoEntries();
 
         Collection<ReloadingMetadata> result = WeavingContext.getRefreshContext().getLastTainted(lastTainted);
         if (result == null || result.isEmpty()) {
@@ -70,10 +71,10 @@
 
     private void writeHistory(UIComponent component, ResponseWriter wrtr, Collection<ReloadingMetadata> result) throws IOException {
         startDiv(component, wrtr, "history");
-        for(ReloadingMetadata entry: result) {
+        for (ReloadingMetadata entry : result) {
             startDiv(component, wrtr, "line");
-                writeDiv(component, wrtr, "timestamp", DateFormat.getInstance().format(new Date(entry.getTimestamp())));
-                writeDiv(component, wrtr, "changedFile", entry.getFileName());
+            writeDiv(component, wrtr, "timestamp", DateFormat.getInstance().format(new Date(entry.getTimestamp())));
+            writeDiv(component, wrtr, "changedFile", entry.getFileName());
             endDiv(wrtr);
         }
 

Added: myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/eventTest/TestListener.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/eventTest/TestListener.java?rev=919200&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/eventTest/TestListener.java (added)
+++ myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/eventTest/TestListener.java Thu Mar  4 22:07:09 2010
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.myfaces.javaloader.eventTest;
+
+import javax.faces.component.UIViewRoot;
+import javax.faces.event.PreRenderViewEvent;
+import javax.faces.event.SystemEvent;
+import javax.faces.event.SystemEventListener;
+import java.util.logging.Logger;
+
+/**
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ */
+
+public class TestListener implements SystemEventListener {
+    static final Logger _log = Logger.getLogger(Logger.class.getName());
+
+    @Override
+    public boolean isListenerForSource(Object source) {
+        return (source instanceof UIViewRoot);  
+    }
+
+    
+    @Override
+    public void processEvent(SystemEvent event) {
+        _log.info("Processing event from a dynamic class: "+event.toString());
+    }
+}

Propchange: myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/eventTest/TestListener.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/WEB-INF/java/org/apache/myfaces/javaloader/eventTest/TestListener.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Modified: myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/complexBean.xhtml
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/complexBean.xhtml?rev=919200&r1=919199&r2=919200&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/complexBean.xhtml (original)
+++ myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/complexBean.xhtml Thu Mar  4 22:07:09 2010
@@ -2,14 +2,15 @@
         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
       xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html">
-<head>
+<h:head>
     <title>Hello World</title>
-</head>
+</h:head>
 <h:body>
 
 
         <h1> this example tests complex bean relationships for refreshing</h1>
         <h:form id="myForm">
+            <!--
             <h:outputScript name="jsf.js" library="javax.faces" target="head"/>
 
 
@@ -21,6 +22,18 @@
             
             <h:outputText value="#{receiver.myBean.hello}" />
             <h:outputText value="#{receiver.myBean.secondaryBean.hello}" />
+            -->
+
+            <h:inputText value="#{myBean.test}">
+                <f:ajax render="myText" event="keyup"/>
+            </h:inputText>
+            <h:panelGroup id="myText">
+                <h:inputText  value="#{myBean.test}" binding="#{myBean.bindingMyTest}"/>
+                <script type="text/javascript">
+                    alert("hello");
+                </script>
+            </h:panelGroup>
+
 
 
         </h:form>

Modified: myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/resources/styles/main.css
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/resources/styles/main.css?rev=919200&r1=919199&r2=919200&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/resources/styles/main.css (original)
+++ myfaces/extensions/scripting/trunk/examples/myfaces20-example/src/main/webapp/resources/styles/main.css Thu Mar  4 22:07:09 2010
@@ -88,6 +88,11 @@
 /*==================================================
     Basic CSS information for our
     taint history component
+    we do not use the compound
+    css for error and history
+    for readability reasons
+    although we have  load
+    of duplication here
 ====================================================*/
 
 div.historyBox {
@@ -141,7 +146,6 @@
     float: left;
 }
 
-
 /*==================================================
     Basic CSS information for our compiler
     output component