https://issues.apache.org/jira/browse/EXTSCRIPT-154 still working on the startup and daemon process


git-svn-id: https://svn.apache.org/repos/asf/myfaces/extensions/scripting/trunk@1297470 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/context/WeavingContext.java b/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/context/WeavingContext.java
index ec01b48..9c7aa92 100644
--- a/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/context/WeavingContext.java
+++ b/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/context/WeavingContext.java
@@ -99,22 +99,29 @@
         }
     }
 
-    public void compile()
+    public boolean compile()
     {
+        boolean compile = false;
         for (ScriptingEngine engine : getEngines())
         {
             if (!engine.needsRecompile()) continue;
+            compile = true;
             log.info("[EXT-SCRIPTING] compiling " + engine.getEngineType() + " files");
             engine.compile();
             log.info("[EXT-SCRIPTING] compiling " + engine.getEngineType() + " files done");
         }
+        return compile;
     }
 
     public void scanDependencies()
     {
         for (ScriptingEngine engine : getEngines())
         {
-            engine.scanDependencies();
+            if(engine.isTainted())  {
+                log.info("[EXT-SCRIPTING] scanning " + engine.getEngineType() + " dependencies");
+                engine.scanDependencies();
+                log.info("[EXT-SCRIPTING] scanning " + engine.getEngineType() + " dependencies end");
+            }
         }
     }
 
diff --git a/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/BaseEngine.java b/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/BaseEngine.java
index a45111e..cbd943b 100644
--- a/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/BaseEngine.java
+++ b/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/BaseEngine.java
@@ -26,11 +26,13 @@
 import rewrite.org.apache.myfaces.extensions.scripting.engine.dependencyScan.registry.DependencyRegistryImpl;
 import rewrite.org.apache.myfaces.extensions.scripting.monitor.ClassResource;
 
+import javax.servlet.ServletContext;
 import java.io.File;
 import java.net.URL;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.logging.Logger;
 
 import static rewrite.org.apache.myfaces.extensions.scripting.common.ScriptingConst.JAVA_SOURCE_ROOT;
 
@@ -48,6 +50,8 @@
     ClassDependencies _dependencyMap = new ClassDependencies();
     DependencyRegistry _dependencyRegistry = new DependencyRegistryImpl(getEngineType(), _dependencyMap);
 
+    Logger log = Logger.getLogger(this.getClass().getName());
+    
     public Map<String, ClassResource> getWatchedResources()
     {
         return _watchedResources;
@@ -128,7 +132,7 @@
         return false;
     }
 
-    protected void initPaths(String initParam, String defaultValue)
+    protected void initPaths(ServletContext context, String initParam, String defaultValue)
     {
         String pathSeparatedList = context.getInitParameter(initParam);
         pathSeparatedList = (pathSeparatedList != null) ? pathSeparatedList : defaultValue;
@@ -163,4 +167,44 @@
     {
         _dependencyMap = dependencyMap;
     }
+
+    /**
+     * marks all the dependencies of the tainted objects
+     * also as tainted to allow proper refreshing.
+     */
+    public void markTaintedDependencies()
+    {
+        //basic tainted set by the full scall
+        Set<String> _processedClasses = new HashSet<String>();
+        for (Map.Entry<String, ClassResource> entry : _watchedResources.entrySet())
+        {
+
+            ClassResource resource = entry.getValue();
+            if (!resource.needsRecompile() && !resource.isTainted()) continue;
+
+            //classname
+            String identifier = resource.getIdentifier();
+            if (_processedClasses.contains(identifier)) continue;
+            markDependencies(_processedClasses, identifier);
+        }
+
+    }
+
+    /*marks all backward dependencies of the existing class*/
+    private void markDependencies(Set<String> _processedClasses, String identifier)
+    {
+        Set<String> referringClasses = _dependencyMap.getReferringClasses(identifier);
+        if(referringClasses == null) return;
+        for (String referringClass : referringClasses)
+        {
+            if (_processedClasses.contains(referringClass)) continue;
+            ClassResource toTaint = _watchedResources.get(referringClass);
+            if(toTaint == null) continue;
+            toTaint.setTainted(true);
+            log.info("[EXT-SCRIPTING] tainting dependency "+toTaint.getIdentifier());
+            _processedClasses.add(toTaint.getIdentifier());
+            markDependencies(_processedClasses, toTaint.getIdentifier());
+        }
+
+    }
 }
diff --git a/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/EngineGroovy.java b/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/EngineGroovy.java
index 8bc6e82..5426e7e 100644
--- a/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/EngineGroovy.java
+++ b/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/EngineGroovy.java
@@ -44,13 +44,7 @@
     @Override
     public void init(ServletContext context)
     {
-        initPaths(INIT_PARAM_CUSTOM_GROOVY_LOADER_PATHS, GROOVY_SOURCE_ROOT);
-    }
-
-    @Override
-    protected void initPaths(String initParam, String defaultValue)
-    {
-        super.initPaths(initParam, defaultValue);
+        initPaths(context, INIT_PARAM_CUSTOM_GROOVY_LOADER_PATHS, GROOVY_SOURCE_ROOT);
     }
 
     @Override
@@ -66,12 +60,6 @@
     }
 
     @Override
-    public void scanForAddedDeleted()
-    {
-        super.scanForAddedDeleted();
-    }
-
-    @Override
     //full compile
     public void compile()
     {
@@ -91,4 +79,10 @@
         log.info("[EXT-SCRIPTING] starting dependency scan");
         log.info("[EXT-SCRIPTING] ending dependency scan");
     }
+
+    @Override
+    public void markTaintedDependencies()
+    {
+        //To change body of implemented methods use File | Settings | File Templates.
+    }
 }
diff --git a/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/EngineJava.java b/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/EngineJava.java
index 6513d90..9fc5eaa 100644
--- a/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/EngineJava.java
+++ b/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/EngineJava.java
@@ -25,16 +25,14 @@
 import rewrite.org.apache.myfaces.extensions.scripting.engine.api.CompilationException;
 import rewrite.org.apache.myfaces.extensions.scripting.engine.api.ScriptingEngine;
 import rewrite.org.apache.myfaces.extensions.scripting.engine.compiler.JSR199Compiler;
-import rewrite.org.apache.myfaces.extensions.scripting.engine.dependencyScan.api.DependencyRegistry;
-import rewrite.org.apache.myfaces.extensions.scripting.engine.dependencyScan.core.ClassDependencies;
-import rewrite.org.apache.myfaces.extensions.scripting.engine.dependencyScan.registry.DependencyRegistryImpl;
 import rewrite.org.apache.myfaces.extensions.scripting.monitor.ClassResource;
 
 import javax.servlet.ServletContext;
 import java.io.File;
 import java.util.Collection;
-import java.util.List;
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
 import java.util.logging.Logger;
 
 import static rewrite.org.apache.myfaces.extensions.scripting.common.ScriptingConst.*;
@@ -52,7 +50,7 @@
     @Override
     public void init(ServletContext context)
     {
-        initPaths(INIT_PARAM_CUSTOM_JAVA_LOADER_PATHS, JAVA_SOURCE_ROOT);
+        initPaths(context, INIT_PARAM_CUSTOM_JAVA_LOADER_PATHS, JAVA_SOURCE_ROOT);
     }
 
     /**
@@ -80,28 +78,16 @@
         }
     }
 
-    public void scanDependencies() {
+    public void scanDependencies()
+    {
         log.info("[EXT-SCRIPTING] starting dependency scan");
         JavaDependencyScanner scanner = new JavaDependencyScanner();
         scanner.scanPaths();
         log.info("[EXT-SCRIPTING] ending dependency scan");
     }
 
-    /**
-     * marks all the dependencies of the tainted objects
-     * also as tainted to allow proper refreshing.
-     */
-    public void markTaintedDependencies() {
-        //    val _dependencyMap = new ClassDependencies();
-        //    val _dependencyRegistry = new DependencyRegistryImpl(getEngineType(), _dependencyMap);
-
-    }
-
     //-------------------------------------------------------------------------------------
 
-
-
-
     @Override
     public int getEngineType()
     {
diff --git a/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/monitor/ResourceMonitor.java b/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/monitor/ResourceMonitor.java
index 2a814a8..0497474 100644
--- a/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/monitor/ResourceMonitor.java
+++ b/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/monitor/ResourceMonitor.java
@@ -113,15 +113,19 @@
      * which performs the entire scanning process
      */
     public void run() {
+        WeavingContext context = WeavingContext.getInstance();
         while(_running) {
             sleep();
             //we run the full scan on the classes to bring our data structures up to the task
-            WeavingContext.getInstance().initialFullScan();
+            context.initialFullScan();
             //we compile wherever needed, taints are now in place due to our scan already being performed
-            WeavingContext.getInstance().compile();
-            //we now have to perform a full dependency scan to bring our dependency map to the latest state
-            WeavingContext.getInstance().scanDependencies();
-            //we next retaint all classes according to our dependency graph
+            if(context.compile()) {
+                //we now have to perform a full dependency scan to bring our dependency map to the latest state
+                context.scanDependencies();
+                context.markTaintedDependends();
+                //we next retaint all classes according to our dependency graph
+            }
+
 
         }
         if (_log.isLoggable(Level.INFO)) {