EXTSCRIPT-154: Code Rewrite/Refactoring, ongoing works in the classloader area, integration of jsf2


git-svn-id: https://svn.apache.org/repos/asf/myfaces/extensions/scripting/trunk@1298379 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/core/engine/BaseScanner.java b/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/core/engine/BaseScanner.java
new file mode 100644
index 0000000..67466ad
--- /dev/null
+++ b/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/core/engine/BaseScanner.java
@@ -0,0 +1,112 @@
+/*
+ * 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 rewrite.org.apache.myfaces.extensions.scripting.core.engine;
+
+import rewrite.org.apache.myfaces.extensions.scripting.core.common.ScriptingConst;
+import rewrite.org.apache.myfaces.extensions.scripting.core.context.WeavingContext;
+import rewrite.org.apache.myfaces.extensions.scripting.core.engine.api.ScriptingEngine;
+import rewrite.org.apache.myfaces.extensions.scripting.core.engine.dependencyScan.StandardDependencyScanner;
+import rewrite.org.apache.myfaces.extensions.scripting.core.engine.dependencyScan.api.DependencyScanner;
+import rewrite.org.apache.myfaces.extensions.scripting.core.engine.dependencyScan.filter.WhitelistFilter;
+import rewrite.org.apache.myfaces.extensions.scripting.core.engine.dependencyScan.loaders.ScannerClassloader;
+import rewrite.org.apache.myfaces.extensions.scripting.core.engine.dependencyScan.registry.ExternalFilterDependencyRegistry;
+
+import java.security.AccessController;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ */
+
+public abstract class BaseScanner
+{
+    List<String> _scanPaths = new LinkedList<String>();DependencyScanner _depencyScanner = new StandardDependencyScanner();Logger _log = Logger.getLogger(JavaDependencyScanner.class.getName());
+
+    public abstract int getEngineType();
+
+    public abstract String getFileEnding();
+
+    public synchronized void scanPaths() {
+        //only one dependency check per refresh makes sense in our case
+       /* if (WeavingContext.getRefreshContext().isDependencyScanned(getEngineType())) {
+            return;
+        } else {
+            WeavingContext.getRefreshContext().setDependencyScanned(getEngineType(), true);
+        }*/
+        ScriptingEngine engine = WeavingContext.getInstance().getEngine(ScriptingConst.ENGINE_TYPE_JSF_JAVA);
+
+        if (_log.isLoggable(Level.INFO)) {
+            _log.info("[EXT-SCRITPING] starting class dependency scan");
+        }
+        long start = System.currentTimeMillis();
+        final Set<String> possibleDynamicClasses = new HashSet<String>(engine.getPossibleDynamicClasses());
+
+        final ClassLoader loader = getClassLoader();
+        for (String dynamicClass : possibleDynamicClasses) {
+            runScan(possibleDynamicClasses, loader, dynamicClass);
+        }
+
+        long end = System.currentTimeMillis();
+        if (_log.isLoggable(Level.FINE)) {
+            _log.log(Level.FINE, "[EXT-SCRITPING] class dependency scan finished, duration: {0} ms", Long.toString(end - start));
+        }
+
+    }
+
+    private void runScan(final Set<String> possibleDynamicClasses, final ClassLoader loader, String dynamicClass) {
+        //TODO implement the dep registry
+        ExternalFilterDependencyRegistry scanRegistry = (ExternalFilterDependencyRegistry) WeavingContext.getInstance()
+        .getEngine(getEngineType()).getDependencyRegistry();
+
+        scanRegistry.clearFilters();
+        //We have to dynamically readjust the filters
+        scanRegistry.addFilter(new WhitelistFilter(possibleDynamicClasses));
+        _depencyScanner.fetchDependencies(loader, getEngineType(), dynamicClass,
+                WeavingContext.getInstance().getEngine(getEngineType()).getDependencyRegistry());
+    }
+
+    protected ClassLoader getClassLoader() {
+        try {
+            return AccessController.doPrivileged(new PrivilegedExceptionAction<ScannerClassloader>()
+            {
+                public ScannerClassloader run()
+                {
+                    return new ScannerClassloader(Thread.currentThread().getContextClassLoader(), getEngineType(),
+                            getFileEnding(), WeavingContext.getInstance().getConfiguration().getCompileTarget());
+                }
+            });
+        } catch (PrivilegedActionException e) {
+            _log.log(Level.SEVERE,"", e);
+        }
+        return null;
+    }
+
+    public void addScanPath(String scanPath) {
+        _scanPaths.add(scanPath);
+    }
+}
diff --git a/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/core/engine/EngineGroovy.java b/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/core/engine/EngineGroovy.java
index 6e45057..3680977 100644
--- a/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/core/engine/EngineGroovy.java
+++ b/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/core/engine/EngineGroovy.java
@@ -81,6 +81,8 @@
     public void scanDependencies()
     {
         log.info("[EXT-SCRIPTING] starting dependency scan");
+        GroovyDependencyScanner scanner = new GroovyDependencyScanner();
+        scanner.scanPaths();
         log.info("[EXT-SCRIPTING] ending dependency scan");
     }
 
diff --git a/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/core/engine/GroovyDependencyScanner.java b/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/core/engine/GroovyDependencyScanner.java
new file mode 100644
index 0000000..e257269
--- /dev/null
+++ b/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/core/engine/GroovyDependencyScanner.java
@@ -0,0 +1,44 @@
+/*
+ * 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 rewrite.org.apache.myfaces.extensions.scripting.core.engine;
+
+import rewrite.org.apache.myfaces.extensions.scripting.core.common.ScriptingConst;
+import rewrite.org.apache.myfaces.extensions.scripting.core.engine.api.ClassScanner;
+
+/**
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ */
+
+public class GroovyDependencyScanner extends BaseScanner implements ClassScanner
+{
+
+    public GroovyDependencyScanner() {
+    }
+
+    public int getEngineType() {
+        return ScriptingConst.ENGINE_TYPE_JSF_GROOVY;
+    }
+    public String getFileEnding() {
+        return ScriptingConst.FILE_EXTENSION_GROOVY;
+    }
+
+}
+
diff --git a/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/core/engine/JavaDependencyScanner.java b/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/core/engine/JavaDependencyScanner.java
index 0087e17..b39ac89 100644
--- a/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/core/engine/JavaDependencyScanner.java
+++ b/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/core/engine/JavaDependencyScanner.java
@@ -20,9 +20,9 @@
 package rewrite.org.apache.myfaces.extensions.scripting.core.engine;
 
 import org.apache.myfaces.extensions.scripting.api.ClassScanListener;
-import org.apache.myfaces.extensions.scripting.api.ClassScanner;
 import rewrite.org.apache.myfaces.extensions.scripting.core.common.ScriptingConst;
 import rewrite.org.apache.myfaces.extensions.scripting.core.context.WeavingContext;
+import rewrite.org.apache.myfaces.extensions.scripting.core.engine.api.ClassScanner;
 import rewrite.org.apache.myfaces.extensions.scripting.core.engine.api.ScriptingEngine;
 import rewrite.org.apache.myfaces.extensions.scripting.core.engine.dependencyScan.StandardDependencyScanner;
 import rewrite.org.apache.myfaces.extensions.scripting.core.engine.dependencyScan.api.DependencyScanner;
@@ -45,109 +45,17 @@
  * @version $Revision$ $Date$
  */
 
-public class JavaDependencyScanner implements ClassScanner
+public class JavaDependencyScanner extends BaseScanner implements ClassScanner
 {
 
-    List<String> _scanPaths = new LinkedList<String>();
-
-    DependencyScanner _depencyScanner = new StandardDependencyScanner();
-
-
-    Logger _log = Logger.getLogger(JavaDependencyScanner.class.getName());
-
     public JavaDependencyScanner() {
     }
 
-    public synchronized void scanPaths() {
-        //only one dependency check per refresh makes sense in our case
-       /* if (WeavingContext.getRefreshContext().isDependencyScanned(getEngineType())) {
-            return;
-        } else {
-            WeavingContext.getRefreshContext().setDependencyScanned(getEngineType(), true);
-        }*/
-        ScriptingEngine engine = WeavingContext.getInstance().getEngine(ScriptingConst.ENGINE_TYPE_JSF_JAVA);
-
-        if (_log.isLoggable(Level.INFO)) {
-            _log.info("[EXT-SCRITPING] starting class dependency scan");
-        }
-        long start = System.currentTimeMillis();
-        final Set<String> possibleDynamicClasses = new HashSet<String>(engine.getPossibleDynamicClasses());
-
-        final ClassLoader loader = getClassLoader();
-        for (String dynamicClass : possibleDynamicClasses) {
-            runScan(possibleDynamicClasses, loader, dynamicClass);
-        }
-
-        long end = System.currentTimeMillis();
-        if (_log.isLoggable(Level.FINE)) {
-            _log.log(Level.FINE, "[EXT-SCRITPING] class dependency scan finished, duration: {0} ms", Long.toString(end - start));
-        }
-
-    }
-
-    protected int getEngineType() {
+    public int getEngineType() {
         return ScriptingConst.ENGINE_TYPE_JSF_JAVA;
     }
-
-    private void runScan(final Set<String> possibleDynamicClasses, final ClassLoader loader, String dynamicClass) {
-        //TODO implement the dep registry
-        ExternalFilterDependencyRegistry scanRegistry = (ExternalFilterDependencyRegistry) WeavingContext.getInstance()
-        .getEngine(getEngineType()).getDependencyRegistry();
-
-        scanRegistry.clearFilters();
-        //We have to dynamically readjust the filters
-        scanRegistry.addFilter(new WhitelistFilter(possibleDynamicClasses));
-        _depencyScanner.fetchDependencies(loader, getEngineType(), dynamicClass,
-                WeavingContext.getInstance().getEngine(getEngineType()).getDependencyRegistry());
+    public String getFileEnding() {
+        return ScriptingConst.JAVA_FILE_ENDING;
     }
 
-    protected ClassLoader getClassLoader() {
-        try {
-            return AccessController.doPrivileged(new PrivilegedExceptionAction<ScannerClassloader>()
-            {
-                public ScannerClassloader run()
-                {
-                    return new ScannerClassloader(Thread.currentThread().getContextClassLoader(), getEngineType(),
-                            ScriptingConst.JAVA_FILE_ENDING, WeavingContext.getInstance().getConfiguration().getCompileTarget());
-                }
-            });
-        } catch (PrivilegedActionException e) {
-            _log.log(Level.SEVERE,"", e);
-        }
-        return null;
-    }
-
-    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
-    }
-
-    //obsolete, did it ever do anything?
-    public void scanAndMarkChange() {
-    /*
-        final Set<String> possibleDynamicClasses = new HashSet<String>(WeavingContext.getInstance().getEngine(getEngineType())
-                .getPossibleDynamicClasses());
-        Map<Integer, Boolean> recompileMap = WeavingContext.getRefreshContext().getDaemon().getSystemRecompileMap();
-        Map<String, ClassResource> classMap = WeavingContext.getRefreshContext().getDaemon().getClassMap();
-        Boolean alreadyTainted = recompileMap.get(getEngineType());
-        if (alreadyTainted != null && alreadyTainted) {
-            return;
-        }
-
-        for (String clazz : possibleDynamicClasses) {
-            if (!classMap.containsKey(clazz)) {
-                recompileMap.put(getEngineType(), Boolean.TRUE);
-            }
-        } */
-    }
 }
diff --git a/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/core/engine/api/ClassScanner.java b/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/core/engine/api/ClassScanner.java
new file mode 100644
index 0000000..e39c9b4
--- /dev/null
+++ b/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/core/engine/api/ClassScanner.java
@@ -0,0 +1,40 @@
+/*
+ * 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 rewrite.org.apache.myfaces.extensions.scripting.core.engine.api;
+
+import org.apache.myfaces.extensions.scripting.api.ClassScanListener;
+
+/**
+ * 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
+ *
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ */
+public interface ClassScanner {
+
+    public void scanPaths();
+
+    public void addScanPath(String scanPath);
+
+}