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 2012/03/06 13:31:01 UTC

svn commit: r1297444 [3/3] - in /myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite: ./ org/ org/apache/ org/apache/myfaces/ org/apache/myfaces/extensions/ org/apache/myfaces/extensions/scripting/ org/apache/myf...

Added: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/filter/WhitelistFilter.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/filter/WhitelistFilter.java?rev=1297444&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/filter/WhitelistFilter.java (added)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/filter/WhitelistFilter.java Tue Mar  6 12:30:58 2012
@@ -0,0 +1,130 @@
+/*
+ * 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.engine.dependencyScan.filter;
+
+import rewrite.org.apache.myfaces.extensions.scripting.engine.dependencyScan.api.ClassFilter;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * Filter class which depends upon a list of whitelisted packages
+ * wildcards in this filter are implicit which means
+ * <p/>
+ * org.apache.myfaces includes all files
+ * under org.apache.myfaces
+ */
+public class WhitelistFilter implements ClassFilter
+{
+
+    WhiteListNode _whiteList = new WhiteListNode();
+
+    /*we use a package tree here to make the whitelist check as performant as possible*/
+
+    class WhiteListNode {
+        Map<String, WhiteListNode> _value = new ConcurrentHashMap<String, WhiteListNode>();
+
+        public WhiteListNode addEntry(String key) {
+            if (_value.containsKey(key)) {
+                return _value.get(key);
+            }
+            WhiteListNode retVal = new WhiteListNode();
+            _value.put(key, retVal);
+            return retVal;
+        }
+
+        public boolean hasChildren() {
+            return !_value.isEmpty();
+        }
+
+        public Map<String, WhiteListNode> getValue() {
+            return _value;
+        }
+
+        public void setValue(Map<String, WhiteListNode> value) {
+            this._value = value;
+        }
+
+        public WhiteListNode get(String key) {
+            return _value.get(key);
+        }
+    }
+
+    public WhitelistFilter(String... whiteList) {
+        for (String singlePackage : whiteList) {
+            addEntry(singlePackage);
+        }
+    }
+
+    public WhitelistFilter(Collection<String> whiteList) {
+        for (String singlePackage : whiteList) {
+            addEntry(singlePackage);
+        }
+    }
+
+    /**
+     * whitespace is allowed implementation
+     *
+     * @param engineType integer value of the engine type of the class
+     * @param clazz      the class itself to be processed by the filter
+     * @return true if it is white-spaced, false otherwise
+     */
+    public final boolean isAllowed(Integer engineType, String clazz) {
+        String[] subParts = clazz.split("\\.");
+        WhiteListNode currPackage = _whiteList;
+        WhiteListNode parentPackage = null;
+        for (String subPart : subParts) {
+            currPackage = currPackage.get(subPart);
+            if (isRootPackageMismatch(currPackage, parentPackage)) {
+                return false;
+            } else if (isSubpackage(currPackage, parentPackage)) {
+                return true;
+            } else if (isMismatch(currPackage)) {
+                return false;
+            }
+
+            parentPackage = currPackage;
+        }
+        return true;
+    }
+
+    private void addEntry(String singlePackage) {
+        String[] subPackages = singlePackage.split("\\.");
+        WhiteListNode currPackage = _whiteList;
+        for (String subPackage : subPackages) {
+            currPackage = currPackage.addEntry(subPackage);
+        }
+    }
+
+    //special conditions extracted for readability reasons in the core
+    //algorithm
+
+    private boolean isMismatch(WhiteListNode currPackage) {
+        return currPackage == null;
+    }
+
+    private boolean isSubpackage(WhiteListNode currPackage, WhiteListNode parentPackage) {
+        return currPackage == null && parentPackage != null && !parentPackage.hasChildren();
+    }
+
+    private boolean isRootPackageMismatch(WhiteListNode currPackage, WhiteListNode parentPackage) {
+        return currPackage == null && parentPackage == null;
+    }
+}

Added: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/loaders/ScannerClassloader.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/loaders/ScannerClassloader.java?rev=1297444&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/loaders/ScannerClassloader.java (added)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/loaders/ScannerClassloader.java Tue Mar  6 12:30:58 2012
@@ -0,0 +1,129 @@
+/*
+ * 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.engine.dependencyScan.loaders;
+
+
+
+import org.apache.myfaces.extensions.scripting.monitor.RefreshContext;
+import rewrite.org.apache.myfaces.extensions.scripting.common.util.ClassUtils;
+import rewrite.org.apache.myfaces.extensions.scripting.monitor.ClassResource;
+
+import java.io.*;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ */
+
+public class ScannerClassloader extends ClassLoader {
+
+    File _tempDir = null;
+
+    Map<String, Class> _alreadyScanned = new HashMap<String, Class>();
+
+    final Logger _logger = Logger.getLogger(ScannerClassloader.class.getName());
+
+
+    public ScannerClassloader(ClassLoader classLoader, int scriptingEngine, String engineExtension, File tempDir) {
+        super(classLoader);
+
+        this._tempDir = tempDir;
+    }
+
+    @Override
+    public InputStream getResourceAsStream(String name) {
+        File resource = new File(_tempDir.getAbsolutePath() + File.separator + name);
+        if (resource.exists()) {
+            try {
+                return new FileInputStream(resource);
+            } catch (FileNotFoundException e) {
+                return super.getResourceAsStream(name);
+            }
+        }
+        return super.getResourceAsStream(name);
+    }
+
+    public File getClassFile(String className) {
+        return ClassUtils.classNameToFile(_tempDir.getAbsolutePath(), className);
+    }
+
+    @Override
+    public Class<?> loadClass(String className) throws ClassNotFoundException {
+        //check if our class exists in the tempDir
+
+        if (_alreadyScanned.containsKey(className)) {
+            return _alreadyScanned.get(className);
+        }
+
+        File target = getClassFile(className);
+        if (!target.exists()) {
+            return super.loadClass(className);
+        }
+
+        //ClassResource data = WeavingContext.getFileChangedDaemon().getClassMap().get(className);
+        //if (data != null && !data.getRefreshAttribute().requiresRefresh()) {
+        //    return data.getAClass();
+        //}
+
+        FileInputStream iStream = null;
+
+        int fileLength;
+        byte[] fileContent;
+        try {
+            //we cannot load while a compile is in progress
+            //we have to wait until it is one
+            synchronized (RefreshContext.COMPILE_SYNC_MONITOR) {
+                fileLength = (int) target.length();
+                fileContent = new byte[fileLength];
+                iStream = new FileInputStream(target);
+                int len = iStream.read(fileContent);
+                if (_logger.isLoggable(Level.FINER)) {
+                    _logger.log(Level.FINER, "class read {0}� bytes read", String.valueOf(len));
+                }
+            }
+
+            //we have to do it here because just in case
+            //a dependent class is loaded as well we run into classcast exceptions
+            Class retVal = super.defineClass(className, fileContent, 0, fileLength);
+            _alreadyScanned.put(className, retVal);
+            return retVal;
+
+        } catch (FileNotFoundException e) {
+            throw new ClassNotFoundException(e.toString());
+        } catch (IOException e) {
+            throw new ClassNotFoundException(e.toString());
+        } finally {
+            if (iStream != null) {
+                try {
+                    iStream.close();
+                } catch (Exception e) {
+                    _logger.log(Level.SEVERE, "", e);
+                }
+            }
+        }
+
+    }
+
+}
+

Added: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/registry/DependencyRegistryImpl.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/registry/DependencyRegistryImpl.java?rev=1297444&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/registry/DependencyRegistryImpl.java (added)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/registry/DependencyRegistryImpl.java Tue Mar  6 12:30:58 2012
@@ -0,0 +1,136 @@
+/*
+ * 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.engine.dependencyScan.registry;
+
+import org.apache.myfaces.extensions.scripting.api.ScriptingConst;
+import org.apache.myfaces.extensions.scripting.core.util.StringUtils;
+import rewrite.org.apache.myfaces.extensions.scripting.engine.dependencyScan.api.ClassFilter;
+import rewrite.org.apache.myfaces.extensions.scripting.engine.dependencyScan.core.ClassDependencies;
+import rewrite.org.apache.myfaces.extensions.scripting.engine.dependencyScan.filter.ScanIdentifierFilter;
+import rewrite.org.apache.myfaces.extensions.scripting.engine.dependencyScan.filter.StandardNamespaceFilter;
+
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * registry facade which is used to track our dependencies
+ */
+public class DependencyRegistryImpl implements ExternalFilterDependencyRegistry
+{
+    List<ClassFilter> _filters = new LinkedList<ClassFilter>();
+
+    ClassDependencies _dependencMap;
+
+    //private volatile Strategy _registrationStrategy;
+    final Integer _engineType;
+
+    /**
+     * constructor for our facade
+     *
+     * @param engineType    the engine type this registry should support
+     * @param dependencyMap the dependency map which stores the dependencies
+     */
+    public DependencyRegistryImpl(Integer engineType, ClassDependencies dependencyMap) {
+        _dependencMap = dependencyMap;
+        _engineType = engineType;
+
+        _filters.add(new ScanIdentifierFilter(_engineType, ScriptingConst.ENGINE_TYPE_JSF_ALL, ScriptingConst.ENGINE_TYPE_JSF_NO_ENGINE));
+        _filters.add(new StandardNamespaceFilter());
+    }
+
+    /**
+     * Clears the entire filter map
+     */
+    public void clearFilters() {
+        _filters.clear();
+        _filters.add(new ScanIdentifierFilter(_engineType, ScriptingConst.ENGINE_TYPE_JSF_ALL, ScriptingConst.ENGINE_TYPE_JSF_NO_ENGINE));
+        _filters.add(new StandardNamespaceFilter());
+    }
+
+    /**
+     * adds a new filter
+     *
+     * @param filter the filter to be added
+     */
+    public void addFilter(ClassFilter filter) {
+        _filters.add(filter);
+    }
+
+    /**
+     * checks if the className is allowed in the current filter chain
+     *
+     * @param engineType an identifier for the current scan type (jsf java scan for instance)
+     * @param className  the classname to be checked
+     * @return true if a filter triggers false if not
+     */
+    public boolean isAllowed(Integer engineType, String className) {
+        for (ClassFilter filter : _filters) {
+            if (!filter.isAllowed(_engineType, className)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * adds a dependency to our dependency map (usually rootclass -> dependency and currentClass -> dependency)
+     *
+     * @param engineType            the engine type for this dependency
+     * @param rootClass             the root class of this scan which all dependencies are referenced from
+     * @param currentlyVisitedClass the source which includes or casts the dependencies
+     * @param dependency            the dependency to be added
+     */
+    public void addDependency(Integer engineType, String rootClass, String currentlyVisitedClass, String dependency) {
+
+        if (StringUtils.isBlank(dependency)) {
+            return;
+        }
+
+        if (currentlyVisitedClass != null && currentlyVisitedClass.equals(dependency)) {
+            return;
+        }
+
+
+
+        if (!isAllowed(engineType, dependency)) {
+            return;
+        }
+
+        //not needed
+        //if(!StringUtils.isBlank(currentlyVisitedClass)) {
+        //    _dependencMap.addDependency(currentlyVisitedClass, dependency);
+        //}
+
+        //for now we code it into a list like we used to do before
+        //but in the long run we have to directly register
+        //to save one step
+        //getDependencySet(source).add(dependency);
+        if(!StringUtils.isBlank(rootClass)) {
+            _dependencMap.addDependency(rootClass, dependency);
+        }
+    }
+
+    /**
+     * flush to flush down our stored dependencies into our final map
+     */
+    public void flush(Integer engineType) {
+        //_registrationStrategy.apply(_dependencies);
+    }
+
+}

Added: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/registry/ExternalFilterDependencyRegistry.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/registry/ExternalFilterDependencyRegistry.java?rev=1297444&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/registry/ExternalFilterDependencyRegistry.java (added)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/registry/ExternalFilterDependencyRegistry.java Tue Mar  6 12:30:58 2012
@@ -0,0 +1,68 @@
+/*
+ * 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.engine.dependencyScan.registry;
+
+import rewrite.org.apache.myfaces.extensions.scripting.engine.dependencyScan.api.ClassFilter;
+import rewrite.org.apache.myfaces.extensions.scripting.engine.dependencyScan.api.DependencyRegistry;
+
+/**
+ * General contractual interface for a dependency registry with external filters
+ * being settable
+ * <p/>
+ * The dependency registry is a class which stores dependencies
+ * according to an internal whitelisting system.
+ * <p/>
+ * Only classes which pass the whitelisting check will be processed
+ */
+public interface ExternalFilterDependencyRegistry extends DependencyRegistry
+{
+
+    /**
+     * Clears the internal filters
+     * for the registry
+     */
+    void clearFilters();
+
+    /**
+     * adds another filter to the internal filter list
+     *
+     * @param filter the filter to be added
+     */
+    void addFilter(ClassFilter filter);
+
+    /**
+     * Allowance check for external shortcutting
+     * This check triggers into the internal filters
+     * to pre-check if a class is allowed to pass or not
+     *
+     * @param className      the classname to be checked
+     * @param engineType an identifier for the current scan type (jsf java scan for instance)
+     * @return true if it is false otherwise
+     */
+    public boolean isAllowed(Integer engineType, String className);
+
+    /**
+     * Flush operation to batch sync
+     * the current dependencies against a storage
+     * <p/>
+     * (will be removed later once we have all the code transitioned
+     * to the registry system)
+     */
+    void flush(Integer engineType);
+}

Added: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/registry/MasterDependencyRegistry.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/registry/MasterDependencyRegistry.java?rev=1297444&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/registry/MasterDependencyRegistry.java (added)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/engine/dependencyScan/registry/MasterDependencyRegistry.java Tue Mar  6 12:30:58 2012
@@ -0,0 +1,90 @@
+/*
+ * 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.engine.dependencyScan.registry;
+
+import rewrite.org.apache.myfaces.extensions.scripting.engine.dependencyScan.api.DependencyRegistry;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * A master dependency registry which keeps track of various
+ * sub-registries in our dependency scanning system
+ *
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ */
+public class MasterDependencyRegistry implements DependencyRegistry
+{
+
+    /**
+     * We keep our central registry in a map
+     * with the engineType as key value to detect which
+     * registry needs to be triggered
+     */
+    private Map<Integer, DependencyRegistry> _subRegistries = new ConcurrentHashMap<Integer, DependencyRegistry>();
+
+    /**
+     * adds a new dependency to all registered registries
+     *
+     * @param engineType   the engine type which holds the registry
+     * @param rootClass    the root class of this scan which all dependencies are referenced from
+     * @param currentClass the current class scanned
+     * @param dependency   the dependency to be added relative to the current class
+     */
+    public void addDependency(Integer engineType, String rootClass, String currentClass, String dependency) {
+        for (Map.Entry<Integer, DependencyRegistry> entry : _subRegistries.entrySet()) {
+            entry.getValue().addDependency(engineType, rootClass, currentClass, dependency);
+        }
+    }
+
+    /**
+     * Flush which is issued at the end of processing to flush
+     * any content which has not been yet processed into our content holding
+     * data structures
+     *
+     * @param engineType the engine type which has issued the flush operation
+     */
+    public void flush(Integer engineType) {
+        for (Map.Entry<Integer, DependencyRegistry> entry : _subRegistries.entrySet()) {
+            entry.getValue().flush(engineType);
+        }
+    }
+
+    /**
+     * adds a subregistry to our current master registry
+     *
+     * @param engineType the engine type which is the key to our subregistry
+     * @param registry   the subregistry which has to be added
+     */
+    public void addSubregistry(Integer engineType, DependencyRegistry registry) {
+        _subRegistries.put(engineType, registry);
+    }
+
+    /**
+     * Getter for getting a subregistry from our given registry
+     *
+     * @param engineType the engine type to search for
+     * @return the subregistry according to the engine type, or null if none is found
+     */
+    public DependencyRegistry getSubregistry(Integer engineType) {
+        return _subRegistries.get(engineType);
+    }
+
+}

Copied: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/monitor/ClassResource.java (from r1296173, myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/monitor/ClassResource.java)
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/monitor/ClassResource.java?p2=myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/monitor/ClassResource.java&p1=myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/monitor/ClassResource.java&r1=1296173&r2=1297444&rev=1297444&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/monitor/ClassResource.java (original)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/monitor/ClassResource.java Tue Mar  6 12:30:58 2012
@@ -17,10 +17,11 @@
  * under the License.
  */
 
-package org.apache.myfaces.extensions.scripting.monitor;
+package rewrite.org.apache.myfaces.extensions.scripting.monitor;
 
-import org.apache.myfaces.extensions.scripting.api.ScriptingConst;
-import org.apache.myfaces.extensions.scripting.core.util.WeavingContext;
+import rewrite.org.apache.myfaces.extensions.scripting.common.ScriptingConst;
+import rewrite.org.apache.myfaces.extensions.scripting.common.util.ClassUtils;
+import rewrite.org.apache.myfaces.extensions.scripting.context.WeavingContext;
 
 import java.io.File;
 import java.util.Collection;
@@ -31,7 +32,11 @@ import java.util.logging.Logger;
  * @version $Revision$ $Date$
  */
 
-public class ClassResource extends WatchedResource {
+public class ClassResource extends WatchedResource
+{
+
+    Logger logger = Logger.getLogger(this.getClass().getName());
+
     /*
     * volatile due to the ram concurrency behavior
     * of the instance vars jdk 5+
@@ -42,105 +47,139 @@ public class ClassResource extends Watch
     //on its corresponding classloader
     //caching the info however probably is faster
     volatile Class _aClass = null;
-    volatile File  _sourceFile;
-    volatile long  _lastLoaded = -1L;
+    volatile File _sourceFile;
+
     volatile int _scriptingEngine = ScriptingConst.ENGINE_TYPE_JSF_NO_ENGINE;
+    volatile long _lastLoaded = -1L;
 
     //todo clean up the sourcepath and filename
 
     //--- todo move this into a separate resource handling facility
 
-    @Override
-    public String identifier() {
-        return _aClass.getName();
-    }
+
 
     @Override
     /**
      * returns the source file in this case
      */
-    public File getFile() {
-        try {
+    public File getFile()
+    {
+        try
+        {
             return _sourceFile;
-        } catch (NullPointerException ex) {
+        }
+        catch (NullPointerException ex)
+        {
             return null;
         }
     }
 
-    public void setFile(File sourceFile) {
+    public void setFile(File sourceFile)
+    {
         _sourceFile = sourceFile;
     }
-  
-    public Class getAClass() {
+
+    public Class getAClass()
+    {
         return _aClass;
     }
 
-    public void setAClass(Class aClass) {
+    public void setAClass(Class aClass)
+    {
         this._aClass = aClass;
     }
 
-    public int getScriptingEngine() {
+    public int getScriptingEngine()
+    {
         return _scriptingEngine;
     }
 
-    public void setScriptingEngine(int scriptingEngine) {
+    public void setScriptingEngine(int scriptingEngine)
+    {
         this._scriptingEngine = scriptingEngine;
     }
 
-
-    public void setRefreshAttribute(RefreshAttribute attr) {
-        _refreshAttribute = attr;
-    }
-
     @Override
-    protected Object clone() throws CloneNotSupportedException {
+    protected Object clone() throws CloneNotSupportedException
+    {
         ClassResource retVal = (ClassResource) super.clone();
-        retVal.setRefreshAttribute(_refreshAttribute.getClone());
         return retVal;
     }
 
-
-    public String getSourceFile() {
-        return _sourceFile.getAbsolutePath().substring(getSourceDir().length()+1);
+    public String getSourceFile()
+    {
+        return _sourceFile.getAbsolutePath().substring(getSourceDir().length() + 1);
     }
 
-    
-    public String getSourceDir() {
-        Collection<String> sourceRoots = WeavingContext.getConfiguration().getSourceDirs(_scriptingEngine);
+    public String getSourceDir()
+    {
+        Collection<String> sourceRoots = WeavingContext.getInstance().getConfiguration().getSourceDirs(_scriptingEngine);
         String fileDir = _sourceFile.getAbsolutePath();
-        fileDir = fileDir.replaceAll("\\\\","/");
-        for(String sourceRoot: sourceRoots) {
-            sourceRoot = sourceRoot.replaceAll("\\\\","/");
-            if(fileDir.startsWith(sourceRoot)) {
+        fileDir = fileDir.replaceAll("\\\\", "/");
+        for (String sourceRoot : sourceRoots)
+        {
+            sourceRoot = sourceRoot.replaceAll("\\\\", "/");
+            if (fileDir.startsWith(sourceRoot))
+            {
                 return sourceRoot;
             }
         }
         return null;
     }
 
-    public void executeLastLoaded() {
+    public void executeLastLoaded()
+    {
         _lastLoaded = System.currentTimeMillis();
     }
 
-    public long getLastLoaded() {
+    public long getLastLoaded()
+    {
         return _lastLoaded;
     }
 
     /**
+     * identifier for this resource is the classname
      *
-     * @return true if the class file has been recompiled since the last request for recompilation
+     * @return
      */
-    public boolean isRecompiled() {
-        File classFile = WeavingContext.getConfiguration().resolveClassFile(_aClass.getName());
-        if(!classFile.exists()) {
-            return false;
-        }
-        Logger log = Logger.getLogger(this.getClass().getName());
-        log.info(this.getAClass().getName() + (classFile.lastModified() - _lastLoaded));
+    public String getIdentifier()
+    {
+        String targetDir = WeavingContext.getInstance().getConfiguration().getCompileTarget().getAbsolutePath();
+        String className = ClassUtils.relativeFileToClassName(getSourceFile());
+        return className;
+    }
 
-        
-        return classFile.lastModified() > _lastLoaded;
+    public void setTainted(boolean value)
+    {
+        if (isTainted()) return;
+        if (value)
+        {
+            //TODO add logging event here
+            logger.info("[EXT-SCRIPTING] tainting " + getSourceFile());
+        }
+        tainted = true;
     }
 
+    /**
+     * @return true if the source file has been modified compared to its classfile
+     */
+    public boolean isTainted()
+    {
+        return tainted;
+    }
+
+    public boolean needsRecompile()
+    {
+        String targetDir = WeavingContext.getInstance().getConfiguration().getCompileTarget().getAbsolutePath();
+        String className = ClassUtils.relativeFileToClassName(getSourceFile());
+        className = targetDir + File.separator + className.replaceAll("\\.", File.separator) + ".class";
+        File targetClass = new File(className);
+        return !targetClass.exists() || targetClass.lastModified() < _sourceFile.lastModified();
+    }
+
+    public boolean stillExists()
+    {
+        return _sourceFile.exists();
+    }
 
 }

Copied: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/monitor/ResourceMonitor.java (from r1296173, myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/monitor/ResourceMonitor.java)
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/monitor/ResourceMonitor.java?p2=myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/monitor/ResourceMonitor.java&p1=myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/monitor/ResourceMonitor.java&r1=1296173&r2=1297444&rev=1297444&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/monitor/ResourceMonitor.java (original)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/monitor/ResourceMonitor.java Tue Mar  6 12:30:58 2012
@@ -16,13 +16,12 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.myfaces.extensions.scripting.monitor;
+package rewrite.org.apache.myfaces.extensions.scripting.monitor;
 
-import org.apache.myfaces.extensions.scripting.api.ScriptingConst;
-import org.apache.myfaces.extensions.scripting.api.ScriptingWeaver;
-import org.apache.myfaces.extensions.scripting.core.dependencyScan.core.ClassDependencies;
-import org.apache.myfaces.extensions.scripting.core.util.WeavingContext;
-import org.apache.myfaces.extensions.scripting.api.extensionevents.ClassTaintedEvent;
+
+
+import rewrite.org.apache.myfaces.extensions.scripting.common.ScriptingConst;
+import rewrite.org.apache.myfaces.extensions.scripting.context.WeavingContext;
 
 import javax.servlet.ServletContext;
 import java.io.File;
@@ -52,8 +51,8 @@ public class ResourceMonitor extends Thr
 
     static ResourceMonitor _instance = null;
 
-    Map<String, ClassResource> _classMap = new ConcurrentHashMap<String, ClassResource>(8, 0.75f, 1);
-    ClassDependencies _dependencyMap = new ClassDependencies();
+    //Map<String, ClassResource> _classMap = new ConcurrentHashMap<String, ClassResource>(8, 0.75f, 1);
+    //ClassDependencies _dependencyMap = new ClassDependencies();
 
     /**
      * This map is a shortcut for the various scripting engines.
@@ -68,20 +67,21 @@ public class ResourceMonitor extends Thr
     Map<Integer, Boolean> _systemRecompileMap = new ConcurrentHashMap<Integer, Boolean>(8, 0.75f, 1);
 
     boolean _running = false;
-    boolean _contextInitialized = false;
+//    boolean _contextInitialized = false;
     Logger _log = Logger.getLogger(ResourceMonitor.class.getName());
-    ScriptingWeaver _weavers = null;
+//    ScriptingWeaver _weavers = null;
     static WeakReference<ServletContext> _externalContext;
 
     public static synchronized void startup(ServletContext externalContext) {
-        if (_externalContext != null) return;
+        if (_externalContext == null) return;
         _externalContext = new WeakReference<ServletContext>(externalContext);
+        if(getInstance() != null) return;
 
         //we currently keep it as singleton but in the long run we will move it into the context
         //like everything else singleton-wise
-        if (WeavingContext.isScriptingEnabled() && _instance == null) {
+        if (_instance == null) {
             _instance = new ResourceMonitor();
-            externalContext.setAttribute(CONTEXT_KEY, _instance);
+
             /**
              * daemon thread to allow forced
              * shutdowns for web context restarts
@@ -89,7 +89,7 @@ public class ResourceMonitor extends Thr
             _instance.setDaemon(true);
             _instance.setRunning(true);
             _instance.start();
-
+            _externalContext.get().setAttribute(CONTEXT_KEY, _instance);
         }
 
     }
@@ -113,33 +113,32 @@ public class ResourceMonitor extends Thr
      * which performs the entire scanning process
      */
     public void run() {
-        while (WeavingContext.isScriptingEnabled() && _running) {
-            if (_externalContext != null && _externalContext.get() != null && !_contextInitialized) {
-                WeavingContext.initThread((ServletContext) _externalContext.get());
-                _contextInitialized = true;
-            }
-            try {
-                try {
-                    Thread.sleep(ScriptingConst.TAINT_INTERVAL);
-                } catch (InterruptedException e) {
-                    //if the server shuts down while we are in sleep we get an error
-                    //which we better should swallow
-                }
-
-                if (_classMap == null || _classMap.size() == 0)
-                    continue;
-                if (_contextInitialized)
-                    checkForChanges();
-            } catch (Throwable e) {
-                _log.log(Level.SEVERE, "[EXT-SCRIPTING]", e);
+        while(_running) {
+            sleep();
+            //we run the full scan on the classes to bring our data structures up to the task
+            WeavingContext.getInstance().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 (_log.isLoggable(Level.INFO)) {
             _log.info("[EXT-SCRIPTING] Dynamic reloading watch daemon is shutting down");
         }
     }
 
+    private void sleep()
+    {
+        try {
+            Thread.sleep(ScriptingConst.TAINT_INTERVAL);
+        } catch (InterruptedException e) {
+            //if the server shuts down while we are in sleep we get an error
+            //which we better should swallow
+        }
+    }
+
     /**
      * central tainted mark method which keeps
      * track if some file in one of the supported engines has changed
@@ -147,7 +146,7 @@ public class ResourceMonitor extends Thr
      * as marks the engine as having to do a full recompile
      */
     private final void checkForChanges() {
-        ScriptingWeaver weaver = WeavingContext.getWeaver();
+    /*    ScriptingWeaver weaver = WeavingContext.getWeaver();
         if (weaver == null) return;
         weaver.scanForAddedClasses();
 
@@ -170,7 +169,7 @@ public class ResourceMonitor extends Thr
             //}
         }
         //we clean up the taint log
-        WeavingContext.getRefreshContext().gcTaintLog();
+        WeavingContext.getRefreshContext().gcTaintLog();*/
     }
 
     /**
@@ -182,7 +181,7 @@ public class ResourceMonitor extends Thr
      * @param className the origin classname which needs to be walked recursively
      */
     private void dependencyTainted(String className) {
-        Set<String> referrers = _dependencyMap.getReferringClasses(className);
+        /*Set<String> referrers = _dependencyMap.getReferringClasses(className);
         if (referrers == null) return;
         for (String referrer : referrers) {
             ClassResource metaData = _classMap.get(referrer);
@@ -195,10 +194,10 @@ public class ResourceMonitor extends Thr
             dependencyTainted(metaData.getAClass().getName());
             WeavingContext.getRefreshContext().addTaintLogEntry(metaData);
             WeavingContext.getExtensionEventRegistry().sendEvent(new ClassTaintedEvent(metaData));
-        }
+        } */
     }
 
-    private final boolean isModified(Map.Entry<String, ClassResource> it, File proxyFile) {
+    /*private final boolean isModified(Map.Entry<String, ClassResource> it, File proxyFile) {
         return proxyFile.lastModified() > it.getValue().getRefreshAttribute().getRequestedRefreshDate() ;
     }
 
@@ -219,9 +218,6 @@ public class ResourceMonitor extends Thr
         return _running;
     }
 
-    public void setRunning(boolean running) {
-        this._running = running;
-    }
 
     public Map<Integer, Boolean> getSystemRecompileMap() {
         return _systemRecompileMap;
@@ -229,26 +225,11 @@ public class ResourceMonitor extends Thr
 
     public void setSystemRecompileMap(Map<Integer, Boolean> systemRecompileMap) {
         this._systemRecompileMap = systemRecompileMap;
-    }
-
-    public Map<String, ClassResource> getClassMap() {
-        return _classMap;
-    }
+    } */
 
-    public void setClassMap(Map<String, ClassResource> classMap) {
-        this._classMap = classMap;
-    }
 
-    public ScriptingWeaver getWeavers() {
-        return _weavers;
-    }
-
-    public void setWeavers(ScriptingWeaver weavers) {
-        _weavers = weavers;
-    }
-
-    public ClassDependencies getDependencyMap() {
-        return _dependencyMap;
+    public void setRunning(boolean running) {
+        this._running = running;
     }
 }
 

Copied: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/monitor/WatchedResource.java (from r1296173, myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/monitor/WatchedResource.java)
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/monitor/WatchedResource.java?p2=myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/monitor/WatchedResource.java&p1=myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/monitor/WatchedResource.java&r1=1296173&r2=1297444&rev=1297444&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/monitor/WatchedResource.java (original)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/monitor/WatchedResource.java Tue Mar  6 12:30:58 2012
@@ -17,7 +17,9 @@
  * under the License.
  */
 
-package org.apache.myfaces.extensions.scripting.monitor;
+package rewrite.org.apache.myfaces.extensions.scripting.monitor;
+
+import org.apache.myfaces.extensions.scripting.monitor.RefreshAttribute;
 
 import java.io.File;
 
@@ -31,14 +33,19 @@ import java.io.File;
 
 public abstract class WatchedResource implements Cloneable {
 
-    RefreshAttribute _refreshAttribute = new RefreshAttribute();
+    /**
+     * tainted override for dependend classes
+     */
+    volatile boolean tainted = false;
+
+    volatile long  _lastLoaded = -1L;
 
     /**
      * Unique identifier on the resource
      *
      * @return
      */
-    public abstract String identifier();
+    public abstract String getIdentifier();
 
     /**
      * @return a file handle on the current resource
@@ -48,9 +55,9 @@ public abstract class WatchedResource im
     /**
      * @return  additional refresh attribute metadata
      */
-    public RefreshAttribute getRefreshAttribute() {
-        return _refreshAttribute;
-    }
+    //public RefreshAttribute getRefreshAttribute() {
+    //    return _refreshAttribute;
+    //}
 
     public WatchedResource getClone()  {
         try {
@@ -60,4 +67,23 @@ public abstract class WatchedResource im
         }
     }
 
+    public long getLastLoaded()
+    {
+        return _lastLoaded;
+    }
+
+    public void setLastLoaded(long lastLoaded)
+    {
+        _lastLoaded = lastLoaded;
+    }
+
+    public boolean isTainted()
+    {
+        return tainted;
+    }
+
+    public void setTainted(boolean tainted)
+    {
+        this.tainted = tainted;
+    }
 }

Copied: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/servlet/ScriptingServletFilter.java (from r1296173, myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/servlet/ScriptingServletFilter.java)
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/servlet/ScriptingServletFilter.java?p2=myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/servlet/ScriptingServletFilter.java&p1=myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/servlet/ScriptingServletFilter.java&r1=1296173&r2=1297444&rev=1297444&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/servlet/ScriptingServletFilter.java (original)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/servlet/ScriptingServletFilter.java Tue Mar  6 12:30:58 2012
@@ -16,109 +16,43 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.myfaces.extensions.scripting.servlet;
+package rewrite.org.apache.myfaces.extensions.scripting.servlet;
 
-import org.apache.myfaces.extensions.scripting.api.ScriptingConst;
-import org.apache.myfaces.extensions.scripting.core.util.WeavingContext;
-import org.apache.myfaces.extensions.scripting.jsf.RefreshPhaseListener;
+import rewrite.org.apache.myfaces.extensions.scripting.context.WeavingContext;
 
 import javax.servlet.*;
 import java.io.IOException;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
 import java.util.logging.Logger;
 
 /**
- * Scripting servlet filter
- * <p/>
- * hits the filter while the
- * init system is not entirely finished yet
+ * This filter is just a blocking filter
+ * refreshes are not allowed while the system
+ * recompiles, incoming requests are put on hold
  *
  * @author Werner Punz
  */
-public class ScriptingServletFilter implements Filter {
+public class ScriptingServletFilter implements Filter
+{
 
-    ServletContext _context = null;
-    static volatile boolean _active = false;
-    static volatile boolean _warned = false;
-
-    public void init(FilterConfig filterConfig) throws ServletException {
+    ServletContext _context;
+    Logger logger = Logger.getLogger(this.getClass().getName());
+    
+    public void init(FilterConfig filterConfig) throws ServletException
+    {
         _context = filterConfig.getServletContext();
-        /*we cannot use the context listener here
-        * because we have the problem that we do not want to parse the web.xml*/
-        WeavingContext.setFilterEnabled(true);
-    }
-
-    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
-        assertInitialized();
-        if (!_active) {
-            filterChain.doFilter(servletRequest, servletResponse);
-            return;
-        }
-        markRequestStart();
-        WeavingContext.initThread(_context);
-
-        WeavingContext.setRequest(servletRequest);
-
-        WeavingContext.getRefreshContext().setCurrentlyRunningRequests(getRequestCnt());
-
-        ScriptingServletFilter._action.run();
-
-        try {
-            filterChain.doFilter(servletRequest, servletResponse);
-        } finally {
-            markRequestEnd();
-        }
-    }
-
-    static Runnable _action = new Runnable() {
-        public void run() {
-            WeavingContext.doRequestRefreshes();
-        }
-    };
-
-    /**
-     * Checks for an initialized system and if not the filter will be deactivated
-     * <p/>
-     * the idea is to check the context in regular intervals
-     * whether the startup process has been finished and then
-     * allow the requests to pass through
-     */
-    private void assertInitialized() {
-        if (_active) return;
-
-        AtomicBoolean startup = (AtomicBoolean) _context.getAttribute(ScriptingConst.CTX_ATTR_STARTUP);
-        if (startup == null) {
-            if (!_warned) {
-                Logger log = Logger.getLogger(ScriptingServletFilter.class.getName());
-                log.warning("[EXT-SCRIPTING] the Startup plugin chainloader has not been set, ext scripting is not working" +
-                        "please refer to the documentation for the org.apache.myfaces.FACES_INIT_PLUGINS parameter, deactivating servlet filter");
-                _active = false;
-            }
-        } else {
-            _active = !startup.get();
-        }
-    }
-
-    public void destroy() {
-
-        WeavingContext.clean();
-    }
-
-    //we mark the request beginning and end for further synchronisation issues
-
-    private final AtomicInteger getRequestCnt() {
-        AtomicInteger retVal = (AtomicInteger) _context.getAttribute(ScriptingConst.CTX_ATTR_REQUEST_CNT);
-
-        return retVal;
     }
 
-    private int markRequestStart() {
-        return getRequestCnt().incrementAndGet();
+    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws ServletException, IOException
+    {
+       synchronized (WeavingContext.getInstance().recompileLock) {
+           logger.fine("request");
+       }
+       filterChain.doFilter(servletRequest, servletResponse);
     }
 
-    private int markRequestEnd() {
-        return getRequestCnt().decrementAndGet();
+    @Override
+    public void destroy()
+    {
     }
 
 }
\ No newline at end of file

Added: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/startup/StartupServletContextPluginChainLoader.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/startup/StartupServletContextPluginChainLoader.java?rev=1297444&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/startup/StartupServletContextPluginChainLoader.java (added)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/startup/StartupServletContextPluginChainLoader.java Tue Mar  6 12:30:58 2012
@@ -0,0 +1,121 @@
+/*
+ * 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.startup;
+
+import org.apache.myfaces.webapp.StartupListener;
+import rewrite.org.apache.myfaces.extensions.scripting.common.util.Cast;
+import rewrite.org.apache.myfaces.extensions.scripting.common.util.ClassUtils;
+import rewrite.org.apache.myfaces.extensions.scripting.common.util.ReflectUtil;
+import rewrite.org.apache.myfaces.extensions.scripting.context.WeavingContext;
+import rewrite.org.apache.myfaces.extensions.scripting.engine.FactoryEngines;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletContextEvent;
+import java.io.IOException;
+import java.util.logging.Logger;
+
+/**
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ *          <p/>
+ *          serves the startup process
+ *          the chainloader hooks itself into the myfaces init process
+ *          and is responsible for startup of the daemon the
+ *          initial scan and compile
+ */
+
+public class StartupServletContextPluginChainLoader implements StartupListener
+{
+    final Logger _log = Logger.getLogger(this.getClass().getName());
+
+    public void preInit(ServletContextEvent servletContextEvent)
+    {
+        ServletContext servletContext = servletContextEvent.getServletContext();
+        try
+        {
+            WeavingContext context = WeavingContext.getInstance();
+            _log.info("[EXT-SCRIPTING] Instantiating StartupServletContextPluginChainLoader");
+            context.initEngines();
+            _log.info("[EXT-SCRIPTING] Loading configuration");
+            context.getConfiguration().init(servletContext);
+            _log.info("[EXT-SCRIPTING] Loading Scripting end");
+
+            _log.info("[EXT-SCRIPTING] Initial Scan");
+            context.initialFullScan();
+            _log.info("[EXT-SCRIPTING] Initial Compile");
+            //we can rely on the compiler picking the files
+            context.compile();
+            _log.info("[EXT-SCRIPTING] init the chain loader");
+            initChainLoader(servletContext);
+            _log.info("[EXT-SCRIPTING] Starting Change Monitor");
+            //TODO code the initial watchdog daemon start here
+            _log.info("[EXT-SCRIPTING] Startup done");
+
+        }
+        catch (IOException e)
+        {
+            _log.severe("[EXT-SCRIPTING] Engine startup failed terminating ext-scripting");
+        }
+
+    }
+
+    /**
+     * initializes our custom chain loader which gets plugged into
+     * the MyFaces loading part for classes!
+     *
+     * @param servletContext the servlet context to be passed down
+     * @return the custom chain loader for loading our classes over our classloaders
+     */
+    private void initChainLoader(ServletContext servletContext)
+    {
+        Object loader = ReflectUtil.instantiate("org.apache.myfaces.extensions.scripting.servlet" +
+                ".CustomChainLoader",
+                new Cast(ServletContext.class, servletContext));
+        ClassUtils.addClassLoadingExtension(loader, true);
+
+    }
+
+    public void postInit(ServletContextEvent evt)
+    {
+        //tell the system that the startup phase is done
+        /*  WeavingContext.getWeaver().fullClassScan();
+        evt.getServletContext().setAttribute(ScriptingConst.CTX_ATTR_STARTUP, new AtomicBoolean(Boolean.FALSE));
+
+        WeavingContext.getExtensionEventRegistry().sendEvent(new SystemInitializedEvent());
+        */
+    }
+
+    public void preDestroy(ServletContextEvent evt)
+    {
+
+    }
+
+    public void postDestroy(ServletContextEvent evt)
+    {
+        //context is destroyed we have to shut down our daemon as well, by giving it
+        //a hint to shutdown
+
+        //TODO this is probably not needed because we run in a daemon thread anyway
+        //so the servlet should not have a problem to shut it down externally
+        /*  RefreshContext rContext = (RefreshContext) evt.getServletContext().getAttribute("RefreshContext");
+        rContext.getDaemon().setRunning(false);
+        */
+    }
+}