EXTSCRIPT-154: fixing tainting process, it now works with all dependencies.
adding delta state before and after compile.

git-svn-id: https://svn.apache.org/repos/asf/myfaces/extensions/scripting/trunk@1297878 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 416eee0..59c247f 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
@@ -89,6 +89,16 @@
         this.configuration = configuration;
     }
 
+    public boolean needsRecompile() {
+        for (ScriptingEngine engine : getEngines())
+        {
+            //log.info("[EXT-SCRIPTING] scanning " + engine.getEngineType() + " files");
+            if(engine.needsRecompile()) return true;
+            //log.info("[EXT-SCRIPTING] scanning " + engine.getEngineType() + " files done");
+        }
+        return false;
+    }
+    
     public void initialFullScan()
     {
         for (ScriptingEngine engine : getEngines())
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 353bc29..48743bc 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
@@ -85,19 +85,22 @@
            Collection<File> sourceFiles = FileUtils.fetchSourceFiles(new File(sourcePath), "*."+ getFileEnding());
            
             for(File sourceFile: sourceFiles) {
-               ClassResource uncompiledClass = new ClassResource();
-               uncompiledClass.setFile(sourceFile);
-               uncompiledClass.setLastLoaded(-1);
-               uncompiledClass.setScriptingEngine(getEngineType());
-               if(!_watchedResources.containsKey(uncompiledClass.getIdentifier())) {
-                    _watchedResources.put(uncompiledClass.getIdentifier(), uncompiledClass);
+               ClassResource classToProcess = new ClassResource();
+                classToProcess.setFile(sourceFile);
+                classToProcess.setLastLoaded(-1);
+                classToProcess.setScriptingEngine(getEngineType());
+                if(!_watchedResources.containsKey(classToProcess.getIdentifier())) {
+                    _watchedResources.put(classToProcess.getIdentifier(), classToProcess);
                } else {
-                   processedClasses.remove(uncompiledClass.getIdentifier());
+                   processedClasses.remove(classToProcess.getIdentifier());
                    
-                   uncompiledClass = _watchedResources.get(uncompiledClass.getIdentifier());
+                   classToProcess = _watchedResources.get(classToProcess.getIdentifier());
                }
-               if(uncompiledClass.needsRecompile()) {
-                   uncompiledClass.setTainted(true);
+               if(classToProcess.needsRecompile()) {
+                   //TODO add entry for logging component here
+                   log.info("[EXT-SCRIPTING] tainting "+classToProcess.getIdentifier());
+                   classToProcess.setTainted(true);
+                   classToProcess.setChangedForCompile(true);
                }
            }
         }
@@ -178,14 +181,17 @@
         Set<String> _processedClasses = new HashSet<String>();
         for (Map.Entry<String, ClassResource> entry : _watchedResources.entrySet())
         {
-
+            //TODO add entry for logging component here
             ClassResource resource = entry.getValue();
-            if (!resource.needsRecompile()) continue;
-
+            if (!resource.isChangedForCompile()) continue;
+            resource.setChangedForCompile(false);
+            log.info("[EXT-SCRIPTING] tainting dependency "+resource.getIdentifier());
+            resource.setTainted(true);
             //classname
             String identifier = resource.getIdentifier();
             if (_processedClasses.contains(identifier)) continue;
             markDependencies(_processedClasses, identifier);
+
         }
 
     }
@@ -200,7 +206,14 @@
             if (_processedClasses.contains(referringClass)) continue;
             ClassResource toTaint = _watchedResources.get(referringClass);
             if(toTaint == null) continue;
+            //TODO add entry for logging component here
+            if(toTaint.isTainted()) {
+                log.info("[EXT-SCRIPTING] dependency already tainted:"+toTaint.getIdentifier());
+                _processedClasses.add(toTaint.getIdentifier());
+                continue;
+            }
             toTaint.setTainted(true);
+            toTaint.setChangedForCompile(false);
             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/monitor/ClassResource.java b/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/monitor/ClassResource.java
index df11349..627e8fe 100644
--- a/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/monitor/ClassResource.java
+++ b/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/monitor/ClassResource.java
@@ -50,8 +50,9 @@
     volatile File _sourceFile;
 
     volatile int _scriptingEngine = ScriptingConst.ENGINE_TYPE_JSF_NO_ENGINE;
+    /*non initial change for delta change investigation*/
+    volatile boolean changedForCompile = false;
 
-    volatile long _lastLoaded = -1L;
 
     //todo clean up the sourcepath and filename
 
@@ -128,15 +129,7 @@
         return null;
     }
 
-    public void executeLastLoaded()
-    {
-        _lastLoaded = System.currentTimeMillis();
-    }
 
-    public long getLastLoaded()
-    {
-        return _lastLoaded;
-    }
 
     /**
      * identifier for this resource is the classname
@@ -183,4 +176,13 @@
         return _sourceFile.exists();
     }
 
+    public boolean isChangedForCompile()
+    {
+        return changedForCompile;
+    }
+
+    public void setChangedForCompile(boolean changedForCompile)
+    {
+        this.changedForCompile = changedForCompile;
+    }
 }
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 f85e251..ebf8416 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
@@ -127,10 +127,23 @@
         }
     }
 
+    public void initialMonitoring() {
+        WeavingContext context = WeavingContext.getInstance();
+        context.initialFullScan();
+        //we compile wherever needed, taints are now in place due to our scan already being performed
+        if(context.compile()) {
+            //we now have to perform a full dependency scan to bring our dependency map to the latest state
+            context.scanDependencies();
+            //we next retaint all classes according to our dependency graph
+            context.markTaintedDependends();
+        }
+    }
+
     public void performMonitoringTask()
     {
         WeavingContext context = WeavingContext.getInstance();
         context.initialFullScan();
+
         //we compile wherever needed, taints are now in place due to our scan already being performed
         if(context.compile()) {
             //we now have to perform a full dependency scan to bring our dependency map to the latest state