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/25 15:24:14 UTC

svn commit: r893856 - in /myfaces/extensions/scripting/trunk: core/core/src/main/groovy/org/apache/myfaces/groovyloader/core/ core/core/src/main/java/org/apache/myfaces/scripting/api/ core/core/src/main/java/org/apache/myfaces/scripting/core/ core/core...

Author: werpu
Date: Fri Dec 25 14:24:13 2009
New Revision: 893856

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

integration of the class dependency scanning into the startup process

Added:
    myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/ClassScanListener.java   (with props)
    myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/ClassScanner.java   (contents, props changed)
      - copied, changed from r892981, myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/AnnotationScanner.java
    myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/ClassScanStrategy.java   (with props)
    myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/loaders/java/JavaDependencyScanner.java   (with props)
    myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/loaders/java/util/PackageStrategy.java   (with props)
Removed:
    myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/AnnotationScanner.java
Modified:
    myfaces/extensions/scripting/trunk/core/core/src/main/groovy/org/apache/myfaces/groovyloader/core/GroovyWeaver.groovy
    myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/AnnotationScanListener.java
    myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/BaseWeaver.java
    myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/ScriptingWeaver.java
    myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/CoreWeaver.java
    myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/DummyWeaver.java
    myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/loaders/java/JavaScriptingWeaver.java
    myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/refresh/FileChangedDaemon.java
    myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/servlet/StartupServletContextPluginChainLoader.java
    myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/ApplicationProxy.java
    myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/ELResolverProxy.java
    myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/RenderkitProxy.java
    myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/GenericAnnotationScanner.java
    myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/startup/IntialScanAnnotationListener.java
    myfaces/extensions/scripting/trunk/examples/myfaces12-example/src/main/webapp/WEB-INF/web.xml

Modified: myfaces/extensions/scripting/trunk/core/core/src/main/groovy/org/apache/myfaces/groovyloader/core/GroovyWeaver.groovy
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/groovy/org/apache/myfaces/groovyloader/core/GroovyWeaver.groovy?rev=893856&r1=893855&r2=893856&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/main/groovy/org/apache/myfaces/groovyloader/core/GroovyWeaver.groovy (original)
+++ myfaces/extensions/scripting/trunk/core/core/src/main/groovy/org/apache/myfaces/groovyloader/core/GroovyWeaver.groovy Fri Dec 25 14:24:13 2009
@@ -18,19 +18,16 @@
  */
 package org.apache.myfaces.groovyloader.core
 
-import org.apache.myfaces.groovyloader.core.Groovy2GroovyObjectReloadingProxy
 import org.apache.myfaces.scripting.api.ScriptingConst
 import org.apache.myfaces.scripting.api.ScriptingWeaver
 import org.codehaus.groovy.runtime.InvokerHelper
 import org.apache.myfaces.scripting.api.BaseWeaver
 import org.apache.myfaces.scripting.loaders.groovy.DynamicClassIdentifier
-import org.apache.myfaces.scripting.api.BaseWeaver
-import org.apache.myfaces.scripting.refresh.FileChangedDaemon
+
 import org.apache.myfaces.scripting.core.util.WeavingContext
-import org.apache.myfaces.groovyloader.core.GroovyGlobalReloadingStrategy
-import org.apache.myfaces.scripting.api.AnnotationScanner
-import org.apache.myfaces.scripting.core.util.Cast
-import org.apache.myfaces.scripting.core.util.ReflectUtil
+
+import org.apache.myfaces.scripting.api.ClassScanner
+
 import org.apache.myfaces.scripting.core.util.ClassUtils
 
 /**
@@ -52,7 +49,7 @@
 
     static ThreadLocal _groovyClassLoaderHolder = new ThreadLocal();
     DynamicClassIdentifier identifier = new DynamicClassIdentifier()
-    AnnotationScanner _scanner = null;
+    ClassScanner _scanner = null;
 
 
 
@@ -75,7 +72,7 @@
             Class[] params = new Class[1];
             params[0] = ScriptingWeaver.class;
             this._scanner = scanner.getConstructor(params).newInstance(this);
-            //this._scanner = (AnnotationScanner) ReflectUtil.instantiate(scanner, params);
+            //this._scanner = (ClassScanner) ReflectUtil.instantiate(scanner, params);
 
         } catch (ClassNotFoundException e) {
             //we do nothing here
@@ -165,7 +162,7 @@
     }
 
 
-    public void fullAnnotationScan() {
+    public void fullClassScan() {
         if (_scanner == null) {
             return;
         }

Modified: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/AnnotationScanListener.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/AnnotationScanListener.java?rev=893856&r1=893855&r2=893856&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/AnnotationScanListener.java (original)
+++ myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/AnnotationScanListener.java Fri Dec 25 14:24:13 2009
@@ -30,7 +30,7 @@
  *          meta data in the correct registry entries
  */
 
-public interface AnnotationScanListener {
+public interface AnnotationScanListener extends ClassScanListener {
 
     /**
      * returns true if the annotation marked by the incoming parameter is supported by this scanner

Modified: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/BaseWeaver.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/BaseWeaver.java?rev=893856&r1=893855&r2=893856&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/BaseWeaver.java (original)
+++ myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/BaseWeaver.java Fri Dec 25 14:24:13 2009
@@ -244,7 +244,7 @@
         return null;
     }
 
-    public void fullAnnotationScan() {
+    public void fullClassScan() {
     }
 
 
@@ -277,6 +277,7 @@
 
     private void recompileRefresh() {
         fullRecompile();
+        
         refreshAllManagedBeans();
     }
 

Added: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/ClassScanListener.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/ClassScanListener.java?rev=893856&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/ClassScanListener.java (added)
+++ myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/ClassScanListener.java Fri Dec 25 14:24:13 2009
@@ -0,0 +1,11 @@
+package org.apache.myfaces.scripting.api;
+
+/**
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ *          <p/>
+ *          We use a  code artefact observer here to register the
+ *          meta data in the correct registry entries
+ */
+public interface ClassScanListener {
+}

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

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

Copied: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/ClassScanner.java (from r892981, myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/AnnotationScanner.java)
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/ClassScanner.java?p2=myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/ClassScanner.java&p1=myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/AnnotationScanner.java&r1=892981&r2=893856&rev=893856&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/AnnotationScanner.java (original)
+++ myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/ClassScanner.java Fri Dec 25 14:24:13 2009
@@ -4,20 +4,20 @@
  * @author Werner Punz (latest modification by $Author$)
  * @version $Revision$ $Date$
  *          <p/>
- *          Generic annotation scanner interface
- *          which is a helper to plug in external annotation scanners
- *          as adapters for the annotation handling
+ *          Generic class scanner interface
+ *          which is a helper to plug in external  scanners
+ *          as adapters for the annotation and dependency handling
  *          we cannot deal with annotations directly in the core
  *          because we are bound by the jsf 1.2 lower threshold limit
  *          hence this indirection
  */
-public interface AnnotationScanner {
+public interface ClassScanner {
 
     public void scanPaths();
 
     public void clearListeners();
 
-    public void addListener(AnnotationScanListener listener);
+    public void addListener(ClassScanListener listener);
 
     public void addScanPath(String scanPath);
 

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

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

Modified: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/ScriptingWeaver.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/ScriptingWeaver.java?rev=893856&r1=893855&r2=893856&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/ScriptingWeaver.java (original)
+++ myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/ScriptingWeaver.java Fri Dec 25 14:24:13 2009
@@ -102,7 +102,7 @@
      * full annotation scan
      * at startup once the system is initialized
      */
-    public void fullAnnotationScan();
+    public void fullClassScan();
 
 
     /**

Modified: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/CoreWeaver.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/CoreWeaver.java?rev=893856&r1=893855&r2=893856&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/CoreWeaver.java (original)
+++ myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/CoreWeaver.java Fri Dec 25 14:24:13 2009
@@ -110,9 +110,9 @@
         return null;
     }
 
-    public void fullAnnotationScan() {
+    public void fullClassScan() {
         for (ScriptingWeaver weaver : _weavers) {
-            weaver.fullAnnotationScan();
+            weaver.fullClassScan();
         }
     }
 

Modified: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/DummyWeaver.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/DummyWeaver.java?rev=893856&r1=893855&r2=893856&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/DummyWeaver.java (original)
+++ myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/DummyWeaver.java Fri Dec 25 14:24:13 2009
@@ -65,7 +65,7 @@
         return this;  //To change body of implemented methods use File | Settings | File Templates.
     }
 
-    public void fullAnnotationScan() {
+    public void fullClassScan() {
     }
 
     public void fullRecompile() {

Added: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/ClassScanStrategy.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/ClassScanStrategy.java?rev=893856&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/ClassScanStrategy.java (added)
+++ myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/ClassScanStrategy.java Fri Dec 25 14:24:13 2009
@@ -0,0 +1,38 @@
+package org.apache.myfaces.scripting.core.dependencyScan;
+
+import org.apache.myfaces.scripting.core.util.ClassUtils;
+import org.apache.myfaces.scripting.core.util.Strategy;
+import org.apache.myfaces.scripting.core.util.WeavingContext;
+
+import java.io.File;
+import java.util.Set;
+import java.util.regex.Matcher;
+
+/**
+ * A scan strategy for scanning class files within our api
+ */
+public class ClassScanStrategy implements Strategy {
+    Set<String> _whiteList;
+    DependencyScanner _scanner;
+    String _rootDir;
+
+
+    public ClassScanStrategy(String rootDir, Set<String> whiteList, DependencyScanner scanner) {
+        this._scanner = scanner;
+        this._rootDir = rootDir;
+        this._whiteList = whiteList;
+    }
+
+    public void apply(Object element) {
+        File foundFile = (File) element;
+        String fileName = foundFile.getName().toLowerCase();
+        if (!fileName.endsWith(".class")) return;
+
+        String className = ClassUtils.relativeFileToClassName(fileName.substring(_rootDir.length() + 1));
+        Set<String> classDependencies = _scanner.fetchDependencies(className, _whiteList);
+
+        WeavingContext.getFileChangedDaemon().getDependencyMap().addDependencies(className, classDependencies);
+    }
+
+
+}

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

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

Added: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/loaders/java/JavaDependencyScanner.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/loaders/java/JavaDependencyScanner.java?rev=893856&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/loaders/java/JavaDependencyScanner.java (added)
+++ myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/loaders/java/JavaDependencyScanner.java Fri Dec 25 14:24:13 2009
@@ -0,0 +1,83 @@
+/*
+ * 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.loaders.java;
+
+import org.apache.myfaces.scripting.api.ClassScanListener;
+import org.apache.myfaces.scripting.api.ClassScanner;
+import org.apache.myfaces.scripting.api.ScriptingWeaver;
+import org.apache.myfaces.scripting.core.dependencyScan.ClassScanStrategy;
+import org.apache.myfaces.scripting.core.dependencyScan.DefaultDependencyScanner;
+import org.apache.myfaces.scripting.core.dependencyScan.DependencyScanner;
+import org.apache.myfaces.scripting.core.util.FileUtils;
+import org.apache.myfaces.scripting.core.util.Strategy;
+import org.apache.myfaces.scripting.core.util.WeavingContext;
+import org.apache.myfaces.scripting.loaders.java.util.PackageStrategy;
+
+import java.io.File;
+import java.util.*;
+
+/**
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ *          <p/>
+ *          A  dependency scanner which utilizes the scan infrastructure
+ *          from the core
+ */
+public class JavaDependencyScanner implements ClassScanner {
+
+    List<String> _scanPaths = new LinkedList<String>();
+    DependencyScanner dependencyScanner = new DefaultDependencyScanner();
+
+    ScriptingWeaver _weaver;
+
+
+    public JavaDependencyScanner(ScriptingWeaver weaver) {
+        this._weaver = weaver;
+    }
+
+    public synchronized void scanPaths() {
+        Set<String> possibleDynamicClasses = new HashSet<String>(_weaver.loadPossibleDynamicClasses());
+        //TODO we have to probably set the context classloader upfront
+        //otherwise the classes are not found
+        try {
+            for (String dynamicClass : possibleDynamicClasses) {
+                Set<String> referrers = dependencyScanner.fetchDependencies(dynamicClass, possibleDynamicClasses);
+                WeavingContext.getFileChangedDaemon().getDependencyMap().addDependencies(dynamicClass, referrers);
+            }
+        } finally {
+
+        }
+    }
+
+
+    public void clearListeners() {
+    }
+
+    public void addListener(ClassScanListener listener) {
+
+    }
+
+    public void addScanPath(String scanPath) {
+        _scanPaths.add(scanPath);
+    }
+
+    public synchronized void scanClass(Class clazz) {
+        //not needed anymore since we only rely on full scans and full recompile now
+    }
+}

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

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

Modified: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/loaders/java/JavaScriptingWeaver.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/loaders/java/JavaScriptingWeaver.java?rev=893856&r1=893855&r2=893856&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/loaders/java/JavaScriptingWeaver.java (original)
+++ myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/loaders/java/JavaScriptingWeaver.java Fri Dec 25 14:24:13 2009
@@ -18,22 +18,16 @@
  */
 package org.apache.myfaces.scripting.loaders.java;
 
-import org.apache.commons.beanutils.BeanUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.myfaces.scripting.api.*;
 import org.apache.myfaces.scripting.core.util.*;
-import org.apache.myfaces.scripting.refresh.FileChangedDaemon;
-import org.apache.myfaces.scripting.refresh.ReloadingMetadata;
-import org.apache.myfaces.config.element.ManagedBean;
-import org.apache.myfaces.config.RuntimeConfig;
 //import org.apache.myfaces.scripting.loaders.java.jsr199.ReflectCompilerFacade;
 
 import javax.servlet.ServletContext;
 import javax.faces.context.FacesContext;
 import java.io.File;
 import java.io.Serializable;
-import java.lang.reflect.InvocationTargetException;
 import java.util.*;
 
 /**
@@ -63,7 +57,9 @@
     private static final String JSR199_COMPILER = "org.apache.myfaces.scripting.loaders.java.jsr199.JSR199Compiler";
     private static final String JAVA5_COMPILER = "org.apache.myfaces.scripting.loaders.java.jdk5.CompilerFacade";
 
-    AnnotationScanner _scanner = null;
+    ClassScanner _annotationScanner = null;
+    ClassScanner _dependencyScanner = null;
+
     DynamicCompiler compiler = null;
 
     /**
@@ -77,20 +73,24 @@
         //url classloader at the time myfaces is initialized
         try {
             Class scanner = ClassUtils.getContextClassLoader().loadClass("org.apache.myfaces.scripting.jsf2.annotation.GenericAnnotationScanner");
-            this._scanner = (AnnotationScanner) ReflectUtil.instantiate(scanner, new Cast(ScriptingWeaver.class, this));
-
+            this._annotationScanner = (ClassScanner) ReflectUtil.instantiate(scanner, new Cast(ScriptingWeaver.class, this));
+            
         } catch (ClassNotFoundException e) {
             //we do nothing here
         }
 
+        this._dependencyScanner = new JavaDependencyScanner(this);
+        
+
     }
 
     @Override
     public void appendCustomScriptPath(String scriptPath) {
         super.appendCustomScriptPath(scriptPath);
-        if (_scanner != null) {
-            _scanner.addScanPath(scriptPath);
+        if (_annotationScanner != null) {
+            _annotationScanner.addScanPath(scriptPath);
         }
+        _dependencyScanner.addScanPath(scriptPath);
     }
 
     public JavaScriptingWeaver() {
@@ -110,7 +110,7 @@
     @Override
     protected Class loadScriptingClassFromFile(String sourceRoot, String file) {
         //we load the scripting class from the given className
-        
+
         File currentClassFile = new File(sourceRoot + File.separator + file);
         if (!currentClassFile.exists()) {
             return null;
@@ -131,7 +131,7 @@
             }
             retVal = compiler.compileFile(sourceRoot, classPath, file);
 
-            if(retVal == null) {
+            if (retVal == null) {
                 return retVal;
             }
         } catch (ClassNotFoundException e) {
@@ -154,8 +154,8 @@
          * //we only deal with class level reloading here
          * //the deregistration notification should happen on artefact level (which will be the next subtask)
          */
-        if (_scanner != null && retVal != null) {
-            _scanner.scanClass(retVal);
+        if (_annotationScanner != null && retVal != null) {
+            _annotationScanner.scanClass(retVal);
         }
 
         return retVal;
@@ -183,11 +183,15 @@
     /**
      * full scan, scans for all artefacts in all files
      */
-    public void fullAnnotationScan() {
-        if (_scanner == null) {
+    public void fullClassScan() {
+        _dependencyScanner.scanPaths();
+        
+        if (_annotationScanner == null) {
             return;
         }
-        _scanner.scanPaths();
+
+        _annotationScanner.scanPaths();
+
     }
 
     public void fullRecompile() {

Added: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/loaders/java/util/PackageStrategy.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/loaders/java/util/PackageStrategy.java?rev=893856&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/loaders/java/util/PackageStrategy.java (added)
+++ myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/loaders/java/util/PackageStrategy.java Fri Dec 25 14:24:13 2009
@@ -0,0 +1,63 @@
+package org.apache.myfaces.scripting.loaders.java.util;
+
+import org.apache.commons.io.FilenameUtils;
+import org.apache.myfaces.scripting.core.util.Strategy;
+
+import java.io.File;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ *          <p/>
+ *          Java strategy pattern to filter out all fully qualified classes
+ *          under a given dir (excluding the inner classes)
+ */
+
+public class PackageStrategy
+        implements Strategy
+
+{
+    String rootDir = "";
+    Set<String> _foundFiles;
+    Pattern rePattern;
+
+
+    public PackageStrategy(Set<String> target, String pattern) {
+        pattern = pattern.trim().replaceAll("\\.", "\\\\.");
+        pattern = "." + pattern;
+
+        _foundFiles = target;
+
+        rePattern = Pattern.compile(pattern);
+
+    }
+
+    //only directories with classes in it apply to be valid
+    //namespaces!
+
+    public void apply(Object element) {
+        File foundFile = (File) element;
+        String fileName = foundFile.getName().toLowerCase();
+        Matcher matcher = rePattern.matcher(fileName);
+
+        if (!matcher.matches()) return;
+
+        if (!foundFile.isDirectory()) {
+            String relativePath = foundFile.getPath().substring(rootDir.length() + 1);
+            relativePath = FilenameUtils.separatorsToUnix(relativePath);
+            _foundFiles.add(relativePath.replaceAll("\\/", "."));
+        }
+    }
+
+    public Set<String> getFoundFiles() {
+        return _foundFiles;
+    }
+
+    public void setFoundFiles(Set<String> foundFiles) {
+        _foundFiles = foundFiles;
+    }
+}

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

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

Modified: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/refresh/FileChangedDaemon.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/refresh/FileChangedDaemon.java?rev=893856&r1=893855&r2=893856&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/refresh/FileChangedDaemon.java (original)
+++ myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/refresh/FileChangedDaemon.java Fri Dec 25 14:24:13 2009
@@ -22,6 +22,7 @@
 import org.apache.commons.logging.LogFactory;
 import org.apache.myfaces.scripting.api.ScriptingConst;
 import org.apache.myfaces.scripting.api.ScriptingWeaver;
+import org.apache.myfaces.scripting.core.dependencyScan.ClassDependencies;
 
 import java.io.File;
 import java.util.*;
@@ -43,6 +44,8 @@
     static FileChangedDaemon instance = null;
 
     Map<String, ReloadingMetadata> classMap = new ConcurrentHashMap<String, ReloadingMetadata>(8, 0.75f, 1);
+    ClassDependencies dependencyMap = new ClassDependencies();
+
 
     /**
      * this map is a shortcut for the various scripting engines
@@ -163,5 +166,9 @@
     public void setWeavers(ScriptingWeaver weavers) {
         _weavers = weavers;
     }
+
+    public ClassDependencies getDependencyMap() {
+        return dependencyMap;
+    }
 }
 

Modified: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/servlet/StartupServletContextPluginChainLoader.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/servlet/StartupServletContextPluginChainLoader.java?rev=893856&r1=893855&r2=893856&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/servlet/StartupServletContextPluginChainLoader.java (original)
+++ myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/servlet/StartupServletContextPluginChainLoader.java Fri Dec 25 14:24:13 2009
@@ -60,6 +60,7 @@
         WeavingContext.setRefreshContext(rContext);
         log.info("[EXT-SCRIPTING] Compiling all sources for the first time");
         weaver.requestRefresh();
+        weaver.fullClassScan();
         //TODO do a first full recompile here at startup time before the bean etc... instantiation can kick in
     }
 

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=893856&r1=893855&r2=893856&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 Fri Dec 25 14:24:13 2009
@@ -339,7 +339,7 @@
         weaveDelegate();
         if (converterClass.equals(PurgedConverter.class.getName())) {
             //purged case we do a full rescane
-            WeavingContext.getWeaver().fullAnnotationScan();
+            WeavingContext.getWeaver().fullClassScan();
             Converter componentToChange = _delegate.createConverter(converterId);
             if (componentToChange instanceof PurgedConverter) {
                 //Null not allowed here, but we set a purted converter to make
@@ -418,7 +418,7 @@
         weaveDelegate();
         if (validatorClass.equals(PurgedValidator.class.getName())) {
             //purged case we do a full rescane
-            WeavingContext.getWeaver().fullAnnotationScan();
+            WeavingContext.getWeaver().fullClassScan();
             Validator componentToChange = _delegate.createValidator(validatorId);
             if (componentToChange instanceof PurgedValidator) {
                 //Null not allowed here, but we set a purted validator to make
@@ -460,7 +460,7 @@
 
         if (behaviorClass.equals(PurgedValidator.class.getName())) {
             //purged case we do a full rescane
-            WeavingContext.getWeaver().fullAnnotationScan();
+            WeavingContext.getWeaver().fullClassScan();
             Behavior behavior = (Behavior) _delegate.createBehavior(behaviorId);
             _behaviors.put(behaviorId, behaviorClass);
             if (behavior instanceof PurgedBehavior) {
@@ -618,7 +618,7 @@
         _delegate.setResourceHandler(resourceHandler);
         ResourceHandler handler = _delegate.getResourceHandler();
         if (handler instanceof PurgedResourceHandler) {
-            WeavingContext.getWeaver().fullAnnotationScan();
+            WeavingContext.getWeaver().fullClassScan();
         }
     }
 
@@ -676,7 +676,7 @@
     private UIComponent handeAnnotationChange(UIComponent oldComponent, ValueExpression valueExpression, FacesContext facesContext, String componentType) {
         UIComponent componentToChange = _delegate.createComponent(valueExpression, facesContext, componentType);
         if (componentToChange instanceof PurgedComponent) {
-            WeavingContext.getWeaver().fullAnnotationScan();
+            WeavingContext.getWeaver().fullClassScan();
             //via an additional create component we can check whether a purged component
             //was registered after the reload because the annotation has been removed
             componentToChange = _delegate.createComponent(valueExpression, facesContext, componentType);
@@ -691,7 +691,7 @@
     private UIComponent handeAnnotationChange(UIComponent oldComponent, String componentType) {
         UIComponent componentToChange = _delegate.createComponent(componentType);
         if (componentToChange instanceof PurgedComponent) {
-            WeavingContext.getWeaver().fullAnnotationScan();
+            WeavingContext.getWeaver().fullClassScan();
             //via an additional create component we can check whether a purged component
             //was registered after the reload because the annotation has been removed
             componentToChange = _delegate.createComponent(componentType);
@@ -704,7 +704,7 @@
     private UIComponent handeAnnotationChange(UIComponent oldComponent, ValueBinding valueBinding, FacesContext context, String componentType) {
         UIComponent componentToChange = _delegate.createComponent(valueBinding, context, componentType);
         if (componentToChange instanceof PurgedComponent) {
-            WeavingContext.getWeaver().fullAnnotationScan();
+            WeavingContext.getWeaver().fullClassScan();
             //via an additional create component we can check whether a purged component
             //was registered after the reload because the annotation has been removed
             componentToChange = _delegate.createComponent(valueBinding, context, componentType);
@@ -717,7 +717,7 @@
     private UIComponent handeAnnotationChange(UIComponent oldComponent, FacesContext context, Resource resource) {
         UIComponent componentToChange = _delegate.createComponent(context, resource);
         if (componentToChange instanceof PurgedComponent) {
-            WeavingContext.getWeaver().fullAnnotationScan();
+            WeavingContext.getWeaver().fullClassScan();
             //via an additional create component we can check whether a purged component
             //was registered after the reload because the annotation has been removed
             componentToChange = _delegate.createComponent(context, resource);
@@ -730,7 +730,7 @@
     private UIComponent handeAnnotationChange(UIComponent oldComponent, FacesContext context, String componentType, String rendererType) {
         UIComponent componentToChange = _delegate.createComponent(context, componentType, rendererType);
         if (componentToChange instanceof PurgedComponent) {
-            WeavingContext.getWeaver().fullAnnotationScan();
+            WeavingContext.getWeaver().fullClassScan();
             //via an additional create component we can check whether a purged component
             //was registered after the reload because the annotation has been removed
             componentToChange = _delegate.createComponent(context, componentType, rendererType);
@@ -744,7 +744,7 @@
         UIComponent componentToChange = _delegate.createComponent(valueExpression, facesContext, s, s1);
         String family = oldComponent.getFamily();
         if (componentToChange instanceof PurgedComponent) {
-            WeavingContext.getWeaver().fullAnnotationScan();
+            WeavingContext.getWeaver().fullClassScan();
 
             //via an additional create component we can check whether a purged component
             //was registered after the reload because the annotation has been removed

Modified: myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/ELResolverProxy.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/ELResolverProxy.java?rev=893856&r1=893855&r2=893856&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/ELResolverProxy.java (original)
+++ myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/ELResolverProxy.java Fri Dec 25 14:24:13 2009
@@ -88,7 +88,7 @@
                     _delegate.setValue(elContext, base, property, null);
 
                     //we only trigger this if the bean was deregistered, we now can reregister it again
-                    WeavingContext.getWeaver().fullAnnotationScan();
+                    WeavingContext.getWeaver().fullClassScan();
                     newRetVal = _delegate.getValue(elContext, base, property);
                 }
             }

Modified: myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/RenderkitProxy.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/RenderkitProxy.java?rev=893856&r1=893855&r2=893856&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/RenderkitProxy.java (original)
+++ myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf/dynamicdecorators/implemetations/RenderkitProxy.java Fri Dec 25 14:24:13 2009
@@ -81,7 +81,7 @@
 
     private ClientBehaviorRenderer handleAnnotationChangeBehaviorRenderer(String s) {
         ClientBehaviorRenderer rendr2;
-        WeavingContext.getWeaver().fullAnnotationScan();
+        WeavingContext.getWeaver().fullClassScan();
         rendr2 = _delegate.getClientBehaviorRenderer(s);
         if (rendr2 instanceof PurgedClientBehaviorRenderer) {
             throw new FacesException("Renderer not found");
@@ -93,7 +93,7 @@
 
     private Renderer handleAnnotationChange(String s, String s1) {
         Renderer rendr2;
-        WeavingContext.getWeaver().fullAnnotationScan();
+        WeavingContext.getWeaver().fullClassScan();
         rendr2 = _delegate.getRenderer(s, s1);
         if (rendr2 instanceof PurgedRenderer) {
             throw new FacesException("Renderer not found");

Modified: myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/GenericAnnotationScanner.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/GenericAnnotationScanner.java?rev=893856&r1=893855&r2=893856&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/GenericAnnotationScanner.java (original)
+++ myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/GenericAnnotationScanner.java Fri Dec 25 14:24:13 2009
@@ -19,7 +19,8 @@
 package org.apache.myfaces.scripting.jsf2.annotation;
 
 import org.apache.myfaces.scripting.api.AnnotationScanListener;
-import org.apache.myfaces.scripting.api.AnnotationScanner;
+import org.apache.myfaces.scripting.api.ClassScanListener;
+import org.apache.myfaces.scripting.api.ClassScanner;
 import org.apache.myfaces.scripting.api.ScriptingWeaver;
 import org.apache.myfaces.scripting.core.util.WeavingContext;
 import org.apache.myfaces.scripting.refresh.ReloadingMetadata;
@@ -36,9 +37,9 @@
  *          wherever possible
  */
 
-public class GenericAnnotationScanner extends BaseAnnotationScanListener implements AnnotationScanner {
+public class GenericAnnotationScanner extends BaseAnnotationScanListener implements ClassScanner {
 
-    List<AnnotationScanListener> _listeners = new LinkedList<AnnotationScanListener>();
+    List<ClassScanListener> _listeners = new LinkedList<ClassScanListener>();
 
     Map<String, String> _registeredAnnotations = new HashMap<String, String>();
     LinkedList<String> _sourcePaths = new LinkedList<String>();
@@ -53,14 +54,14 @@
 
     public GenericAnnotationScanner(ScriptingWeaver weaver) {
         _weaver = weaver;
-         initDefaultListeners();
+        initDefaultListeners();
     }
 
     public void addScanPath(String sourcePath) {
         _sourcePaths.addFirst(sourcePath);
     }
 
-   
+
     Collection<java.lang.annotation.Annotation> filterAnnotations(java.lang.annotation.Annotation[] anns) {
         List<java.lang.annotation.Annotation> retVal = new ArrayList<java.lang.annotation.Annotation>(anns.length);
         if (anns == null) {
@@ -85,7 +86,7 @@
             removeAnnotations(clazz);
         }
     }
-   
+
     private void initDefaultListeners() {
         _listeners.add(new BeanImplementationListener());
         _listeners.add(new BehaviorImplementationListener());
@@ -102,7 +103,7 @@
     public void scanPaths() {
         //TODO move this over to a binary scan system
         //https://issues.apache.org/jira/browse/EXTSCRIPT-33
-        for(String className : _weaver.loadPossibleDynamicClasses()) {
+        for (String className : _weaver.loadPossibleDynamicClasses()) {
             Class clazz = _weaver.loadScriptingClassFromName(className);
             //called already by loadScriptingClassFromName
             /*if(clazz != null) {
@@ -115,7 +116,7 @@
             }*/
         }
 
-   }
+    }
 
 
     /**
@@ -127,7 +128,8 @@
     private void addOrMoveAnnotations(Class clazz) {
         java.lang.annotation.Annotation[] anns = clazz.getAnnotations();
         for (java.lang.annotation.Annotation ann : anns) {
-            for (AnnotationScanListener listener : _listeners) {
+            for (ClassScanListener cListener : _listeners) {
+                AnnotationScanListener listener = (AnnotationScanListener) cListener;
                 if (listener.supportsAnnotation(ann.annotationType().getName())) {
                     listener.register(clazz, ann);
 
@@ -152,7 +154,8 @@
     private void removeAnnotations(Class clazz) {
         String registeredAnnotation = _registeredAnnotations.get(clazz.getName());
         if (registeredAnnotation != null) {
-            for (AnnotationScanListener listener : _listeners) {
+            for (ClassScanListener cListener : _listeners) {
+                AnnotationScanListener listener = (AnnotationScanListener) cListener;
                 if (listener.supportsAnnotation(registeredAnnotation)) {
                     listener.purge(clazz.getName());
                     _registeredAnnotations.remove(clazz.getName());
@@ -163,8 +166,6 @@
     }
 
 
-  
-
     private void annotationMoved(Class clazz, java.lang.annotation.Annotation ann, AnnotationScanListener listener) {
         //case class exists but it has been moved to anoter annotation
         String registeredAnnotation = _registeredAnnotations.get(clazz.getName());
@@ -178,7 +179,7 @@
         _listeners.clear();
     }
 
-    public void addListener(AnnotationScanListener listener) {
+    public void addListener(ClassScanListener listener) {
         _listeners.add(listener);
     }
 

Modified: myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/startup/IntialScanAnnotationListener.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/startup/IntialScanAnnotationListener.java?rev=893856&r1=893855&r2=893856&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/startup/IntialScanAnnotationListener.java (original)
+++ myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/startup/IntialScanAnnotationListener.java Fri Dec 25 14:24:13 2009
@@ -51,6 +51,6 @@
         weaver.fullRecompile();
         //we now do a full source or precompiled annotation scan
         //the entire scripting subsystem should be initialized by now
-        weaver.fullAnnotationScan();
+        weaver.fullClassScan();
     }
 }

Modified: myfaces/extensions/scripting/trunk/examples/myfaces12-example/src/main/webapp/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/examples/myfaces12-example/src/main/webapp/WEB-INF/web.xml?rev=893856&r1=893855&r2=893856&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/examples/myfaces12-example/src/main/webapp/WEB-INF/web.xml (original)
+++ myfaces/extensions/scripting/trunk/examples/myfaces12-example/src/main/webapp/WEB-INF/web.xml Fri Dec 25 14:24:13 2009
@@ -45,7 +45,7 @@
         <param-value>org.apache.myfaces.scripting.servlet.StartupServletContextPluginChainLoader</param-value>
     </context-param>
 
-    <!--
+
     <context-param>
         <description>Additional comma separated loader paths to allow direct editing on the sources directory instead
             of the deployment dir
@@ -65,7 +65,7 @@
             /Users/werpu2/development/workspace/extensions-scripting3/examples/myfaces12-example/src/main/webapp/WEB-INF/java
         </param-value>
     </context-param>
-    -->
+    
     <!--
     <context-param>
         <description>Additional comma separated loader paths to allow direct editing on the sources directory instead