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 2009/12/19 23:40:01 UTC

svn commit: r892520 - in /myfaces/extensions/scripting/trunk/core: core/ core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/ core/src/main/java/org/apache/myfaces/scripting/refresh/ core/src/test/java/org/apache/myfaces/extensions/scri...

Author: werpu
Date: Sat Dec 19 22:40:00 2009
New Revision: 892520

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

works on the depenency scanning..., the core has been implemented but not the connection to the tainting yet!

Added:
    myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/
    myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/ClassLogUtils.java   (with props)
    myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/ClassScanVisitor.java   (with props)
    myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/DependencyScanner.java   (with props)
    myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/MethodScanVisitor.java   (with props)
    myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/
    myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/DependencyScannerTest.java   (with props)
    myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/probes/
    myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/probes/Probe.java   (with props)
    myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/probes/Probe2.java   (with props)
    myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/probes/Probe3.java   (with props)
    myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/probes/Probe4.java   (with props)
Modified:
    myfaces/extensions/scripting/trunk/core/core/pom.xml
    myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/refresh/RefreshContext.java
    myfaces/extensions/scripting/trunk/core/myfaces12-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/ApplicationProxy.java
    myfaces/extensions/scripting/trunk/core/myfaces12-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/RenderkitProxy.java

Modified: myfaces/extensions/scripting/trunk/core/core/pom.xml
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/pom.xml?rev=892520&r1=892519&r2=892520&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/pom.xml (original)
+++ myfaces/extensions/scripting/trunk/core/core/pom.xml Sat Dec 19 22:40:00 2009
@@ -51,6 +51,13 @@
             <version>1.8.0</version>
         </dependency>
 
+        <!-- asm dependency readded for class scanning -->
+        <dependency>
+            <groupId>asm</groupId>
+            <artifactId>asm</artifactId>
+            <version>3.2</version>
+            
+        </dependency>
 
         <dependency>
             <groupId>junit</groupId>

Added: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/ClassLogUtils.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/ClassLogUtils.java?rev=892520&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/ClassLogUtils.java (added)
+++ myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/ClassLogUtils.java Sat Dec 19 22:40:00 2009
@@ -0,0 +1,124 @@
+/*
+ * 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.core.dependencyScan;
+
+import java.util.Collection;
+
+/**
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ *          Utils which store the shared code
+ */
+class ClassLogUtils {
+    public static final String BINARY_PACKAGE = "\\/";
+
+
+    private static final String DOMAIN_JAVA = "java.";
+    private static final String DOMAIN_JAVAX = "javax.";
+    private static final String DOMAIN_COM_SUN = "com.sun";
+
+
+    /**
+     * checks if a given package or class
+     * belongs to a standard namespaces which is
+     * untouchable by an implementor
+     *
+     * @param in the page or fully qualified classname
+     * @return true if it belongs to one of the standard namespaces, false if not
+     */
+    public static final boolean isStandard(String in) {
+        //We dont use a regexp here, because an test has shown that direct startsWith is 5 times as fast as applying
+        //a precompiled regexp with match
+        return in.startsWith(DOMAIN_JAVA) || in.startsWith(DOMAIN_JAVAX) || in.startsWith(DOMAIN_COM_SUN);
+    }
+
+    /**
+     * checks for an allowed namespaces from a given namespace list
+     * if the class or package is in the list of allowed namespaces
+     * a true is returned otherwise a false
+     *
+     * @param classOrPackage
+     * @param nameSpaces
+     * @return
+     */
+    public static final boolean allowedNamespaces(String classOrPackage, String[] nameSpaces) {
+
+        //ok this is probably the fastest way to iterate hence we use this old construct
+        //a direct or would be faster but we cannot do it here since we are not dynamic here
+        int len = nameSpaces.length;
+        for (int cnt = 0; cnt < len; cnt++) {
+            if (classOrPackage.startsWith(nameSpaces[cnt])) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * renames the internal member class descriptors of L<qualified classnamewith />; to its source name
+     *
+     * @param parm the internal class name
+     * @return the changed classname in its sourceform
+     */
+    public static final String internalClassDescriptorToSource(String parm) {
+        //we strip the meta information which is not needed
+        //aka start mit ( alles strippen bis )
+
+        //([A-Za-u]{0,1})
+        if (parm.startsWith("(")) {
+            parm = parm.substring(parm.lastIndexOf(')') + 1);
+        }
+
+        //()I for single datatypes
+        if (parm.equals("") || parm.length() == 1) {
+            return null;
+        }
+
+        //fully qualified name with meta information
+        if (parm.endsWith(";")) {
+            //we can skip all the other meta information, a class identifier on sub class level
+            //has to start with L the format is <META ATTRIBUTES>L<CLASS QUALIFIED NAME>;
+            //The meta attributes can be for instance [ for array
+            parm = parm.substring(parm.indexOf('L') + 1, parm.length() - 1);
+        }
+
+
+        //normal fully qualified name with no meta info attached
+        parm = parm.replaceAll(BINARY_PACKAGE, ".");
+        return parm;
+    }
+
+    /**
+     * logs a dependency if it does not belong to the standard namespaces
+     *
+     * @param dependencies the target which has to recieve the dependency in source format
+     * @param parms        the list of dependencies which have to be added
+     */
+    public static final void logParmList(Collection<String> dependencies, String... parms) {
+        for (String parm : parms) {
+            if (parm == null) continue;
+            if (parm.equals("")) continue;
+            parm = internalClassDescriptorToSource(parm);
+            if (parm == null || isStandard(parm)) continue;
+
+            dependencies.add(parm);
+        }
+    }
+
+}

Propchange: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/ClassLogUtils.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/ClassLogUtils.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/ClassScanVisitor.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/ClassScanVisitor.java?rev=892520&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/ClassScanVisitor.java (added)
+++ myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/ClassScanVisitor.java Sat Dec 19 22:40:00 2009
@@ -0,0 +1,107 @@
+/*
+ * 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.core.dependencyScan;
+
+import org.objectweb.asm.*;
+
+import java.util.*;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ */
+
+class ClassScanVisitor implements ClassVisitor {
+
+    Set<String> dependencies;
+    //static final Logger log = Logger.getLogger("ClassScanVisitor");
+
+    public ClassScanVisitor() {
+
+    }
+
+    public ClassScanVisitor(Set<String> dependencies) {
+        super();
+        this.dependencies = dependencies;
+    }
+
+
+    public void setDependencyTarget(Set<String> dependencyTarget) {
+        dependencies = dependencyTarget;
+    }
+
+    public void visit(int version, int access, String name,
+                      String signature, String superName, String[] interfaces) {
+        //log.log(Level.INFO, "{0} extends {1} ", new String[]{name, superName});
+
+        ClassLogUtils.logParmList(dependencies, superName);
+    }
+
+    public void visitSource(String source, String debug) {
+        //log.log(Level.INFO, "source: {0}", source);
+    }
+
+    public void visitOuterClass(String owner, String name, String desc) {
+        //nothing has to be done here I guess because
+        //we only try to fetch the dependencies
+    }
+
+    public AnnotationVisitor visitAnnotation(String desc,
+                                             boolean visible) {
+        return null;
+    }
+
+    public void visitAttribute(Attribute attr) {
+        //log.log(Level.INFO, "Attribute: {0}", attr.type);
+
+    }
+
+    public void visitInnerClass(String name, String outerName,
+                                String innerName, int access) {
+        //same as outer class
+    }
+
+    public FieldVisitor visitField(int access, String name, String desc,
+                                   String signature, Object value) {
+        //log.log(Level.INFO, "Field:{0} {1} ", new Object[]{desc, name});
+        ClassLogUtils.logParmList(dependencies, desc);
+
+        return null;
+    }
+
+    public MethodVisitor visitMethod(int access, String name,
+                                     String desc, String signature, String[] exceptions) {
+        //log.log(Level.INFO, "Method {0} {1} ", new Object[]{name, desc});
+        //String subDesc = desc.substring(desc.indexOf('(') + 1, desc.lastIndexOf(")"));
+        //String[] parms = subDesc.split(";");
+
+        //ClassLogUtils.logParmList(dependencies, parms);
+
+        //we now have to dig into the method to cover more, the parms are covered by our method scanner
+        return new MethodScanVisitor(dependencies);
+    }
+
+    public void visitEnd() {
+        //log.info("}");
+    }
+
+}
+

Propchange: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/ClassScanVisitor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/ClassScanVisitor.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/DependencyScanner.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/DependencyScanner.java?rev=892520&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/DependencyScanner.java (added)
+++ myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/DependencyScanner.java Sat Dec 19 22:40:00 2009
@@ -0,0 +1,59 @@
+/*
+ * 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.core.dependencyScan;
+
+import org.objectweb.asm.ClassReader;
+
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ * 
+ * A dependency scanner for
+ * our classes
+ */
+public class DependencyScanner {
+
+    static final ClassScanVisitor cp = new ClassScanVisitor();
+
+    /**
+     * @param className
+     * @return
+     */
+    public static final Set<String> fetchDependencies(String className) {
+        Set<String> retVal = new HashSet<String>();
+
+        cp.setDependencyTarget(retVal);
+        ClassReader cr = null;
+
+        try {
+            cr = new ClassReader("org.apache.myfaces.extensions.scripting.dependencyScan.probes.Probe");
+            cr.accept(cp, 0);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        return retVal;
+    }
+
+}

Propchange: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/DependencyScanner.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/DependencyScanner.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/MethodScanVisitor.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/MethodScanVisitor.java?rev=892520&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/MethodScanVisitor.java (added)
+++ myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/MethodScanVisitor.java Sat Dec 19 22:40:00 2009
@@ -0,0 +1,149 @@
+/*
+ * 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.core.dependencyScan;
+
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.Attribute;
+import org.objectweb.asm.Label;
+
+import java.util.logging.Logger;
+import java.util.logging.Level;
+import java.util.Set;
+
+/**
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ */
+
+class MethodScanVisitor implements MethodVisitor {
+
+    //static final Logger log = Logger.getLogger("MethodScanVisitor");
+
+    final Set<String> dependencies;
+
+    public MethodScanVisitor(Set<String> dependencies) {
+        this.dependencies = dependencies;
+    }
+
+
+    public AnnotationVisitor visitAnnotationDefault() {
+        return null;  
+    }
+
+    public AnnotationVisitor visitAnnotation(String s, boolean b) {
+        return null;  
+    }
+
+    public AnnotationVisitor visitParameterAnnotation(int i, String s, boolean b) {
+        return null;  
+    }
+
+    public void visitAttribute(Attribute attribute) {
+        //log.log(Level.INFO, "MethodAttr {0}:", attribute.type);
+        
+    }
+
+    public void visitCode() {
+        //log.log(Level.INFO, "Method code");
+    }
+
+    public void visitFrame(int i, int i1, Object[] objects, int i2, Object[] objects1) {
+    }
+
+    public void visitInsn(int i) {
+    }
+
+    public void visitIntInsn(int i, int i1) {
+    }
+
+    public void visitVarInsn(int i, int i1) {
+    }
+
+    public void visitTypeInsn(int i, String castType) {
+        //cast
+        //log.log(Level.INFO, "TypeInsn: {0} ", new String[]{castType});
+        ClassLogUtils.logParmList(dependencies, castType);
+    }
+
+    public void visitFieldInsn(int i, String s, String s1, String s2) {
+        //log.log(Level.INFO, "visitFieldInsn {0} {1} {2}", new Object[]{s, s1, s2});
+        //ClassLogUtils.logParmList(dependencies, castType);
+        ClassLogUtils.logParmList(dependencies, s2);
+    }
+
+    public void visitMethodInsn(int i, String s, String s1, String s2) {
+        //log.log(Level.INFO, "visitMethodIsn {0} {1} {2}", new Object[]{s, s1, s2});
+        ClassLogUtils.logParmList(dependencies, s2);
+    }
+
+    public void visitJumpInsn(int i, Label label) {
+
+    }
+
+    public void visitLabel(Label label) {
+        
+    }
+
+    public void visitLdcInsn(Object o) {
+        
+    }
+
+    public void visitIincInsn(int i, int i1) {
+        
+    }
+
+    public void visitTableSwitchInsn(int i, int i1, Label label, Label[] labels) {
+        
+    }
+
+    public void visitLookupSwitchInsn(Label label, int[] ints, Label[] labels) {
+        
+    }
+
+    public void visitMultiANewArrayInsn(String s, int i) {
+        //log.log(Level.INFO, "visitMultiANewArrayInsn: {0}", new Object[]{s});
+    }
+
+    public void visitTryCatchBlock(Label label, Label label1, Label label2, String catchType) {
+        //try catch block type information in the last string
+        //log.log(Level.INFO, "visitTryCatchBlock: {0} {1} {2} {3}", new Object[]{label.toString(), label1.toString(), label2.toString(), catchType});
+        ClassLogUtils.logParmList(dependencies, catchType);
+
+    }
+
+    public void visitLocalVariable(String s, String referenceType, String s2, Label label, Label label1, int i) {
+        //local variable on method level
+        //log.log(Level.INFO, "LocalVar: {0} {1} {2}", new String[]{s, referenceType, s2});
+        ClassLogUtils.logParmList(dependencies, referenceType);
+
+    }
+
+    public void visitLineNumber(int i, Label label) {
+        
+    }
+
+    public void visitMaxs(int i, int i1) {
+        
+    }
+
+    public void visitEnd() {
+        
+    }
+}

Propchange: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/MethodScanVisitor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/MethodScanVisitor.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Modified: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/refresh/RefreshContext.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/refresh/RefreshContext.java?rev=892520&r1=892519&r2=892520&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/refresh/RefreshContext.java (original)
+++ myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/refresh/RefreshContext.java Sat Dec 19 22:40:00 2009
@@ -20,6 +20,9 @@
 
 import org.apache.myfaces.scripting.core.util.WeavingContext;
 
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
 /**
  * @author Werner Punz (latest modification by $Author$)
  * @version $Revision$ $Date$
@@ -42,16 +45,40 @@
      * application scoped beans are refreshed at the first refresh cycle
      * by the calling request issuing the compile
      */
-    private long personalScopedBeanRefresh = -1l;
+    private volatile long personalScopedBeanRefresh = -1l;
 
     /**
      * the daemon thread which marks the scripting classes
      * depending on the state, changed => tainted == true, not changed
      * tainted == false!
      */
-    FileChangedDaemon daemon = FileChangedDaemon.getInstance();
-    public static Boolean BEAN_SYNC_MONITOR = new Boolean(true);
-    public static Boolean RELOAD_SYNC_MONITOR = new Boolean(true);
+    volatile FileChangedDaemon daemon = FileChangedDaemon.getInstance();
+
+    /*
+     * we have to keep the component data as shadow data reachable
+     * from various parts of the system to resolve
+     * the component <-> renderer dependencies
+     * we do not resolve the dependencies between the tag handlers
+     * and the components for now
+     *
+     * resolving those dependencies means
+     * renderer changes <-> taint all component classes which use
+     * the renderer
+     *
+     * component changes <-> taint all renderer classes as well
+     *
+     * This is needed to avoid intra component <-> renderer
+     * classcast exceptions
+     *
+     * the content of this map is the component class
+     * and the value is the renderer class
+     */
+    private volatile Map<String, String> _componentRendererDependencies = new ConcurrentHashMap<String, String>();
+    private volatile Map<String, String> _rendererComponentDependencies = new ConcurrentHashMap<String, String>();
+
+
+    public volatile static Boolean BEAN_SYNC_MONITOR = new Boolean(true);
+    public volatile static Boolean RELOAD_SYNC_MONITOR = new Boolean(true);
 
     public long getPersonalScopedBeanRefresh() {
         return personalScopedBeanRefresh;
@@ -113,4 +140,13 @@
         return true;
     }
 
+    public Map<String, String> getComponentRendererDependencies() {
+        return _componentRendererDependencies;
+    }
+
+
+    public Map<String, String> getRendererComponentDependencies() {
+        return _rendererComponentDependencies;
+    }
+
 }

Added: myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/DependencyScannerTest.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/DependencyScannerTest.java?rev=892520&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/DependencyScannerTest.java (added)
+++ myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/DependencyScannerTest.java Sat Dec 19 22:40:00 2009
@@ -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.extensions.scripting.dependencyScan;
+
+import org.apache.myfaces.scripting.core.dependencyScan.DependencyScanner;
+import org.junit.Test;
+
+import java.util.Set;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ */
+public class DependencyScannerTest {
+
+    @Test
+    public void testScan() {
+        Set<String> retVal = DependencyScanner.fetchDependencies("org.apache.myfaces.extensions.scripting.dependencyScan.probes.Probe");
+        assertTrue(retVal.size() > 0);
+
+        assertFalse(retVal.contains("java.lang.String"));
+
+        assertTrue(retVal.contains("org.apache.myfaces.extensions.scripting.dependencyScan.probes.Probe2"));
+        assertTrue(retVal.contains("org.apache.myfaces.extensions.scripting.dependencyScan.probes.Probe3"));
+        assertTrue(retVal.contains("org.apache.myfaces.extensions.scripting.dependencyScan.probes.Probe4"));
+    }
+}

Propchange: myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/DependencyScannerTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/DependencyScannerTest.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/probes/Probe.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/probes/Probe.java?rev=892520&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/probes/Probe.java (added)
+++ myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/probes/Probe.java Sat Dec 19 22:40:00 2009
@@ -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.extensions.scripting.dependencyScan.probes;
+
+import org.junit.Ignore;
+
+/**
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ *          <p/>
+ *          Probe for class scanning
+ */
+@Ignore
+public class Probe {
+    String prop1;
+
+    public static int myTest(StringBuilder myBuilder, Object val2) {
+        return (Integer) 1;
+    }
+
+    public Object myTest2(Object parm) {
+        try {
+            Probe4 [] probes = new Probe4[1];
+            return (Probe2) parm;
+        } catch (RuntimeException ex) {
+            return (Probe3) parm;
+        }
+    }
+
+}

Propchange: myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/probes/Probe.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/probes/Probe.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/probes/Probe2.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/probes/Probe2.java?rev=892520&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/probes/Probe2.java (added)
+++ myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/probes/Probe2.java Sat Dec 19 22:40:00 2009
@@ -0,0 +1,29 @@
+/*
+ * 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.extensions.scripting.dependencyScan.probes;
+
+import org.junit.Ignore;
+
+/**
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ */
+@Ignore
+public interface Probe2 {
+}

Propchange: myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/probes/Probe2.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/probes/Probe2.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/probes/Probe3.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/probes/Probe3.java?rev=892520&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/probes/Probe3.java (added)
+++ myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/probes/Probe3.java Sat Dec 19 22:40:00 2009
@@ -0,0 +1,29 @@
+/*
+ * 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.extensions.scripting.dependencyScan.probes;
+
+import org.junit.Ignore;
+
+/**
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ */
+@Ignore
+public interface Probe3 {
+}

Propchange: myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/probes/Probe3.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/probes/Probe3.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/probes/Probe4.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/probes/Probe4.java?rev=892520&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/probes/Probe4.java (added)
+++ myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/probes/Probe4.java Sat Dec 19 22:40:00 2009
@@ -0,0 +1,29 @@
+/*
+ * 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.extensions.scripting.dependencyScan.probes;
+
+import org.junit.Ignore;
+
+/**
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ */
+@Ignore
+public class Probe4 {
+}

Propchange: myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/probes/Probe4.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/probes/Probe4.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Modified: myfaces/extensions/scripting/trunk/core/myfaces12-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/ApplicationProxy.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/myfaces12-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/ApplicationProxy.java?rev=892520&r1=892519&r2=892520&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/myfaces12-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/ApplicationProxy.java (original)
+++ myfaces/extensions/scripting/trunk/core/myfaces12-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/ApplicationProxy.java Sat Dec 19 22:40:00 2009
@@ -37,17 +37,34 @@
 import javax.servlet.ServletRequest;
 import java.lang.reflect.Proxy;
 import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * our decorating applicstion
  * which should resolve our bean issues within a central
  * bean processing interceptor
  *
+ *
+ * component
+ *
+ *   komponente A Šndert sich
+ *   Renderer Šndert sich nicht
+ *
+ *   class Renderer {
+ *          public method (UIComponent myComp) {
+ *                  ((MyComponent)myComp)
+ }
+ }
+ *
+ *
+ *
  * @author Werner Punz
  */
 public class ApplicationProxy extends Application implements Decorated {
 
-    Application _delegate = null;
+    volatile Application _delegate;
+
+
 
     public ApplicationProxy(Application delegate) {
         _delegate = delegate;
@@ -86,6 +103,7 @@
     }
 
     //TOD add a weaving for resource bundles
+
     public ResourceBundle getResourceBundle(FacesContext facesContext, String s) throws FacesException, NullPointerException {
         weaveDelegate();
         return _delegate.getResourceBundle(facesContext, s);
@@ -270,9 +288,11 @@
         _delegate.setStateManager(stateManager);
     }
 
-    public void addComponent(String s, String s1) {
+    public void addComponent(String componentType, String componentClass) {
         weaveDelegate();
-        _delegate.addComponent(s, s1);
+        _delegate.addComponent(componentType, componentClass);
+        //TODO handle this properly
+       // WeavingContext.getRefreshContext().getComponentRendererDependencies(componentClass, "");
     }
 
     public UIComponent createComponent(String s) throws FacesException {

Modified: myfaces/extensions/scripting/trunk/core/myfaces12-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/RenderkitProxy.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/myfaces12-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/RenderkitProxy.java?rev=892520&r1=892519&r2=892520&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/myfaces12-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/RenderkitProxy.java (original)
+++ myfaces/extensions/scripting/trunk/core/myfaces12-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/RenderkitProxy.java Sat Dec 19 22:40:00 2009
@@ -49,17 +49,24 @@
     }
 
 
-    public void addRenderer(String s, String s1, Renderer renderer) {
+    public void addRenderer(String componentFamily, String rendererType, Renderer renderer) {
         weaveDelegate();
         //wo do it brute force here because we have sometimes casts and hence cannot rely on proxies
         //renderers itself are flyweight patterns which means they are shared over objects
         renderer = (Renderer) reloadInstance(renderer, ScriptingConst.ARTEFACT_TYPE_RENDERER);
-        _delegate.addRenderer(s, s1, renderer);
+        _delegate.addRenderer(componentFamily, rendererType, renderer);
+
+        /**
+         * we save the component family and the renderer class name
+         * so that if a component of
+         */
+
+        WeavingContext.getRefreshContext().getRendererComponentDependencies().put(renderer.getClass().getName(), componentFamily);
     }
 
-    public Renderer getRenderer(String s, String s1) {
+    public Renderer getRenderer(String componentFamily, String rendererType) {
         weaveDelegate();
-        return  (Renderer) reloadInstance(_delegate.getRenderer(s, s1), ScriptingConst.ARTEFACT_TYPE_RENDERER);
+        return  (Renderer) reloadInstance(_delegate.getRenderer(componentFamily, rendererType), ScriptingConst.ARTEFACT_TYPE_RENDERER);
     }
 
     public ResponseStateManager getResponseStateManager() {