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 2010/03/26 15:50:23 UTC

svn commit: r927885 - in /myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core: ./ src/main/java/org/apache/myfaces/scripting/api/ src/main/java/org/apache/myfaces/scripting/core/ src/main/java/org/apache/myfaces/scripting/core/util/ s...

Author: werpu
Date: Fri Mar 26 14:50:22 2010
New Revision: 927885

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

Brunos application now works if the servlet filter is removed without any errors in the startup,
this should be enough in this area.

Short summary, startup process now streamlined in the WeavingContext
callbacks into the init now directly from our plugin, the chainloader
now is delegated down to a chainloader, the entire init specific code is now moved into
an initializer helper to separate the concerns

Added:
    myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/core/util/WeavingContextInitializer.java   (with props)
Modified:
    myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/pom.xml
    myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/api/BaseWeaver.java
    myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/api/ScriptingConst.java
    myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/api/ScriptingWeaver.java
    myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/core/CoreWeaver.java
    myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/core/DummyWeaver.java
    myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/core/util/WeavingContext.java
    myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/servlet/CustomChainLoader.java
    myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/servlet/ScriptingServletFilter.java
    myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/servlet/StartupServletContextPluginChainLoader.java

Modified: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/pom.xml
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/pom.xml?rev=927885&r1=927884&r2=927885&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/pom.xml (original)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/pom.xml Fri Mar 26 14:50:22 2010
@@ -16,10 +16,14 @@
         <artifactId>extscript-core-root</artifactId>
         <version>1.0-SNAPSHOT</version>
     </parent>
-    
+
     <scm>
-        <connection>scm:svn:http://svn.apache.org/repos/asf/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core</connection>
-        <developerConnection>scm:svn:https://svn.apache.org/repos/asf/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core</developerConnection>
+        <connection>
+            scm:svn:http://svn.apache.org/repos/asf/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core
+        </connection>
+        <developerConnection>
+            scm:svn:https://svn.apache.org/repos/asf/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core
+        </developerConnection>
         <url>http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core</url>
     </scm>
 
@@ -76,13 +80,17 @@
             <scope>test</scope>
         </dependency>
 
+        <dependency>
+            <groupId>commons-digester</groupId>
+            <artifactId>commons-digester</artifactId>
+            <version>2.0</version>
+        </dependency>
 
     </dependencies>
 
     <build>
 
         <!-- To define the plugin version in your parent POM -->
-       
 
 
         <plugins>
@@ -124,7 +132,7 @@
                 what we will do simply is to relocate the original
                 asm packages into our own namespace to avoid
                 name conflicts
-             -->   
+             -->
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-shade-plugin</artifactId>
@@ -157,42 +165,46 @@
 
     <profiles>
         <profile>
-        <!--
-          - Build and install into the repository some additional artifacts that we don't
-          - want to build during normal development because they take too long.
-          -->
-        <id>generate-assembly</id>
-        <activation>
-          <property>
-            <name>performRelease</name>
-            <value>true</value>
-          </property>
-        </activation>
-        <build>
-          <plugins>
-            <plugin>
-              <!-- Install in the repository a "-javadoc.jar" file -->
-              <artifactId>maven-javadoc-plugin</artifactId>
-              <version>2.4</version>
-              <executions>
-                <execution>
-                  <id>attach-javadoc</id>
-                  <goals><goal>jar</goal></goals>
-                </execution>
-              </executions>
-            </plugin>
-            <plugin>
-              <!-- Install in the repository a "-sources.jar" file -->
-              <artifactId>maven-source-plugin</artifactId>
-              <executions>
-                <execution>
-                  <id>attach-source</id>
-                  <goals><goal>jar</goal></goals>
-                </execution>
-              </executions>
-            </plugin>
-          </plugins>
-        </build>
-      </profile>
+            <!--
+            - Build and install into the repository some additional artifacts that we don't
+            - want to build during normal development because they take too long.
+            -->
+            <id>generate-assembly</id>
+            <activation>
+                <property>
+                    <name>performRelease</name>
+                    <value>true</value>
+                </property>
+            </activation>
+            <build>
+                <plugins>
+                    <plugin>
+                        <!-- Install in the repository a "-javadoc.jar" file -->
+                        <artifactId>maven-javadoc-plugin</artifactId>
+                        <version>2.4</version>
+                        <executions>
+                            <execution>
+                                <id>attach-javadoc</id>
+                                <goals>
+                                    <goal>jar</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <!-- Install in the repository a "-sources.jar" file -->
+                        <artifactId>maven-source-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>attach-source</id>
+                                <goals>
+                                    <goal>jar</goal>
+                                </goals>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
     </profiles>
 </project>

Modified: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/api/BaseWeaver.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/api/BaseWeaver.java?rev=927885&r1=927884&r2=927885&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/api/BaseWeaver.java (original)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/api/BaseWeaver.java Fri Mar 26 14:50:22 2010
@@ -266,7 +266,7 @@ public abstract class BaseWeaver impleme
 
     }
 
-    public void initiateStartup() {
+    public void postStartupActions() {
         if (WeavingContext.getRefreshContext().isRecompileRecommended(getScriptingEngine())) {
             // we set a lock over the compile and bean refresh
             //and an inner check again to avoid unneeded compile triggers

Modified: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/api/ScriptingConst.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/api/ScriptingConst.java?rev=927885&r1=927884&r2=927885&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/api/ScriptingConst.java (original)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/api/ScriptingConst.java Fri Mar 26 14:50:22 2010
@@ -32,6 +32,9 @@ public class ScriptingConst {
 
     public static final String INIT_PARAM_SCRIPTING_PACKAGE_WHITELIST = "org.apache.myfaces.scripting.PGK_WHITELIST";
     public static final String INIT_PARAM_SCRIPTING_ADDITIONAL_CLASSPATH = "org.apache.myfaces.scripting.ADDITIONAL_CLASSPATH";
+    public static final String INIT_PARAM_RESOURCE_PATH = "org.apache.myfaces.scripting.resources.LOADER_PATHS";
+    public static final String INIT_PARAM_CUSTOM_GROOVY_LOADER_PATHS = "org.apache.myfaces.scripting.groovy.LOADER_PATHS";
+    public static final String INIT_PARAM_CUSTOM_JAVA_LOADER_PATHS = "org.apache.myfaces.scripting.java.LOADER_PATHS";
 
     public static final String CONTEXT_VALUE_DIVIDER = ",";
 
@@ -68,20 +71,19 @@ public class ScriptingConst {
     public static final int ARTIFACT_TYPE_CLIENTBEHAVIORRENDERER = 20;
     public static final int ARTIFACT_TYPE_SYSTEMEVENTLISTENER = 21;
 
-   //faclets artifacts
-    public static final int ARTIFACT_TYPE_TAG_HANDLER=22;
-    public static final int ARTIFACT_TYPE_COMPONENT_HANDLER=23;
-    public static final int ARTIFACT_TYPE_VALIDATOR_HANDLER=24;
-    public static final int ARTIFACT_TYPE_CONVERTER_HANDLER=25;
-    public static final int ARTIFACT_TYPE_BEHAVIOR_HANDLER=26;
-
+    //faclets artifacts
+    public static final int ARTIFACT_TYPE_TAG_HANDLER = 22;
+    public static final int ARTIFACT_TYPE_COMPONENT_HANDLER = 23;
+    public static final int ARTIFACT_TYPE_VALIDATOR_HANDLER = 24;
+    public static final int ARTIFACT_TYPE_CONVERTER_HANDLER = 25;
+    public static final int ARTIFACT_TYPE_BEHAVIOR_HANDLER = 26;
+
+    public static final String CTX_ATTR_REQUEST_CNT = "RequestCnt";
+    public static final String CTX_ATTR_CONFIGURATION = "ExtScriptingConfig";
+    public static final String CTX_ATTR_STARTUP = "ExtScriptingStartup";
+    public static final String CTX_ATTR_SCRIPTING_WEAVER = "ScriptingWeaver";
+    public static final String CTX_ATTR_REFRESH_CONTEXT = "RefreshContext";
 
-    public static final String CTX_REQUEST_CNT = "RequestCnt";
-    public static final String CTX_CONFIGURATION = "ExtScriptingConfig";
-    public static final String CTX_STARTUP = "ExtScriptingStartup";
-    
-
-    public static final String INIT_PARAM_RESOURCE_PATH = "org.apache.myfaces.scripting.resources.LOADER_PATHS";
     public static final String FILE_EXTENSION_GROOVY = ".groovy";
     public static final String GROOVY_FILE_ENDING = ".groovy";
     public static final String JAVA_FILE_ENDING = ".java";
@@ -90,4 +92,6 @@ public class ScriptingConst {
     public static final String SCOPE_SESSION = "session";
     public static final String SCOPE_APPLICATION = "application";
     public static final String SCOPE_REQUEST = "request";
+    public static final String GROOVY_SOURCE_ROOT = "/WEB-INF/groovy/";
+    public static final String JAVA_SOURCE_ROOT = "/WEB-INF/java/";
 }

Modified: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/api/ScriptingWeaver.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/api/ScriptingWeaver.java?rev=927885&r1=927884&r2=927885&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/api/ScriptingWeaver.java (original)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/api/ScriptingWeaver.java Fri Mar 26 14:50:22 2010
@@ -112,10 +112,12 @@ public interface ScriptingWeaver {
     public void fullRecompile();
 
     /**
-     * initiates all startup actions which have to be performed
-     * on the scripting subsystems during startup
+     * initiates all post startup actions which have to be performed
+     * on the scripting subsystems after the entire scripting engine
+     * configuration has been activated (in most cases
+     * it comes down to an annotation parsing and compilation)
      */
-    public void initiateStartup();
+    public void postStartupActions();
 
     /**
      * callback for artifact request refreshes

Modified: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/core/CoreWeaver.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/core/CoreWeaver.java?rev=927885&r1=927884&r2=927885&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/core/CoreWeaver.java (original)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/core/CoreWeaver.java Fri Mar 26 14:50:22 2010
@@ -118,9 +118,9 @@ public class CoreWeaver implements Seria
         }
     }
 
-    public void initiateStartup() {
+    public void postStartupActions() {
         for (ScriptingWeaver weaver : _weavers) {
-            weaver.initiateStartup();
+            weaver.postStartupActions();
         }
     }
 

Modified: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/core/DummyWeaver.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/core/DummyWeaver.java?rev=927885&r1=927884&r2=927885&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/core/DummyWeaver.java (original)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/core/DummyWeaver.java Fri Mar 26 14:50:22 2010
@@ -72,7 +72,7 @@ public class DummyWeaver implements Seri
 
     }
 
-    public void initiateStartup() {
+    public void postStartupActions() {
     }
 
     public void requestRefresh() {

Modified: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/core/util/WeavingContext.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/core/util/WeavingContext.java?rev=927885&r1=927884&r2=927885&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/core/util/WeavingContext.java (original)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/core/util/WeavingContext.java Fri Mar 26 14:50:22 2010
@@ -75,7 +75,7 @@ public class WeavingContext {
     static protected ThreadLocal _configuration = new ThreadLocal();
     static protected ThreadLocal _externalContext = new ThreadLocal();
 
-    private static final String WARN_WEAVER_NOT_SET = "Scripting Weaver is not set. Disabling script reloading subsystem. Make sure you have the scripting servlet filter enabled in your web.xml";
+    private static final String WARN_WEAVER_NOT_SET = "[EXT-SCRIPTING] Scripting Weaver is not set. Disabling script reloading subsystem. Make sure you have the scripting servlet filter enabled in your web.xml";
 
     private static final Map<Integer, CompilationResult> _compilationResults = new ConcurrentHashMap<Integer, CompilationResult>();
 
@@ -84,15 +84,26 @@ public class WeavingContext {
      */
     private static AtomicBoolean _enabled = new AtomicBoolean(false);
 
-    public static void init() {
+    /**
+     * per default the weaver is not set up
+     */
+    private static AtomicBoolean _filterEnabled = new AtomicBoolean(false);
 
+    /**
+     * external helper which helps to initialize
+     * the scripting engine runtime system
+     * and to discover configuration mistakes early on
+     *
+     * @param servletContext the servlet context which holds the config data
+     */
+    public static void startup(ServletContext servletContext) {
+        WeavingContextInitializer.initWeavingContext(servletContext);
     }
 
     public static void initThread(ServletContext context) {
-        WeavingContext.setWeaver(context.getAttribute("ScriptingWeaver"));
-        WeavingContext.setRefreshContext((RefreshContext) context.getAttribute("RefreshContext"));
-        WeavingContext.setConfiguration((Configuration) context.getAttribute(ScriptingConst.CTX_CONFIGURATION));
-        //WeavingContext.getRefreshContext().setCurrentlyRunningRequests(getRequestCnt());
+        WeavingContext.setWeaver(context.getAttribute(ScriptingConst.CTX_ATTR_SCRIPTING_WEAVER));
+        WeavingContext.setRefreshContext((RefreshContext) context.getAttribute(ScriptingConst.CTX_ATTR_REFRESH_CONTEXT));
+        WeavingContext.setConfiguration((Configuration) context.getAttribute(ScriptingConst.CTX_ATTR_CONFIGURATION));
         WeavingContext.setExternalContext(context);
     }
 
@@ -151,7 +162,8 @@ public class WeavingContext {
      * some artefacts need a full request refresh
      */
     public static void doRequestRefreshes() {
-        getWeaver().requestRefresh();
+        if(isScriptingEnabled())
+            getWeaver().requestRefresh();
     }
 
     /**
@@ -169,6 +181,28 @@ public class WeavingContext {
     }
 
     /**
+     * the filter has to be treated differently
+     * if the filter is not enabled we do not have
+     * a chance to access our singletons properly
+     * <p/>
+     * The servlet api in 2.5 seems to lack a filter
+     * accessor, so we have to set this from our filter and then
+     * do periodic checks within our system
+     *
+     * @param enabled true set from out filter init
+     */
+    public static void setFilterEnabled(boolean enabled) {
+        _filterEnabled = new AtomicBoolean(enabled);
+    }
+
+    /**
+     * @return true if our filter is enabled
+     */
+    public static boolean isFilterEnabled() {
+        return _filterEnabled.get();
+    }
+
+    /**
      * fetches the weavers
      * for this current thread
      *
@@ -185,7 +219,7 @@ public class WeavingContext {
             log.warning(WARN_WEAVER_NOT_SET);
             _weaverHolder.set(new DummyWeaver());
         }
-        return (ScriptingWeaver) _weaverHolder.get();
+        return weaver;
     }
 
     /**

Added: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/core/util/WeavingContextInitializer.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/core/util/WeavingContextInitializer.java?rev=927885&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/core/util/WeavingContextInitializer.java (added)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/core/util/WeavingContextInitializer.java Fri Mar 26 14:50:22 2010
@@ -0,0 +1,263 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.myfaces.scripting.core.util;
+
+import org.apache.commons.digester.Digester;
+import org.apache.commons.lang.StringUtils;
+import org.apache.myfaces.scripting.api.Configuration;
+import org.apache.myfaces.scripting.api.ScriptingConst;
+import org.apache.myfaces.scripting.api.ScriptingWeaver;
+import org.apache.myfaces.scripting.core.CoreWeaver;
+import org.apache.myfaces.scripting.loaders.groovy.GroovyScriptingWeaver;
+import org.apache.myfaces.scripting.loaders.java.JavaScriptingWeaver;
+import org.apache.myfaces.scripting.refresh.RefreshContext;
+import org.apache.myfaces.scripting.servlet.ScriptingServletFilter;
+import org.xml.sax.EntityResolver;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+import javax.servlet.ServletContext;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.logging.Logger;
+
+/**
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ *          <p/>
+ *          Moved over from Weblets...
+ *          a fully functional web.xml parser
+ *          to allow early access to the configuration
+ */
+
+class WeavingContextInitializer {
+
+    static final Logger _logger = Logger.getLogger(WeavingContextInitializer.class.getName());
+
+
+
+    public static void initWeavingContext(ServletContext servletContext) {
+       
+        validateWebXml(servletContext);
+        initConfiguration(servletContext);
+        initWeavers(servletContext);
+        initRefreshContext(servletContext);
+    }
+
+    private static void initConfiguration(ServletContext servletContext) {
+        final Configuration conf = new Configuration();
+        servletContext.setAttribute(ScriptingConst.CTX_ATTR_CONFIGURATION, conf);
+        WeavingContext.setConfiguration(conf);
+        //we now add the resource loader path here
+
+        /*
+         * we define a set of closures (inner classes) which make
+         * our code more reusable we define a strategy
+         * for each comma delimited set of values
+         */
+        Strategy addResourceDirStrategy = new Strategy() {
+            public void apply(Object element) {
+                conf.addResourceDir((String) element);
+            }
+        };
+        Strategy addAdditionalClassPathStrategy = new Strategy() {
+            public void apply(Object element) {
+                conf.addAdditionalClassPath((String) element);
+            }
+        };
+        Strategy addWhiteListPackageStrategy = new Strategy() {
+            public void apply(Object element) {
+                conf.addWhitelistPackage((String) element);
+            }
+        };
+
+        /**
+         * We now apply the values into our own lists
+         */
+        applyEntries(servletContext.getInitParameter(ScriptingConst.INIT_PARAM_RESOURCE_PATH), addResourceDirStrategy);
+        applyEntries(servletContext.getInitParameter(ScriptingConst.INIT_PARAM_SCRIPTING_ADDITIONAL_CLASSPATH), addAdditionalClassPathStrategy);
+        applyEntries(servletContext.getInitParameter(ScriptingConst.INIT_PARAM_SCRIPTING_PACKAGE_WHITELIST), addWhiteListPackageStrategy);
+
+    }
+
+    private static void applyEntries(String val, Strategy strategy) {
+        if (!StringUtils.isBlank(val)) {
+            String[] splittedVal = val.split(ScriptingConst.CONTEXT_VALUE_DIVIDER);
+            for (String singleVal : splittedVal) {
+                strategy.apply(singleVal);
+            }
+        }
+    }
+
+
+    private static void validateWebXml(ServletContext context) {
+        try {
+            URL webXml = context.getResource("/WEB-INF/web.xml");
+
+            if (webXml != null) {
+                InputStream in = webXml.openStream();
+                try {
+                    WebXmlParserImpl parser = new WebXmlParserImpl();
+                    Digester digester = new Digester();
+                    digester.setValidating(false);
+                    digester.setEntityResolver(DisconnectedEntityResolver.sharedInstance());
+                    digester.push(parser);
+                    //We only check for the servlet filter
+                    //the rest is already delivered by our context
+                    digester.addCallMethod("web-app/servlet-filter", "addServletFilter", 2);
+                    //digester.addCallMethod("web-app/filter-mapping/filter-name", "addFilterName", 2);
+                    digester.parse(in);
+                    //we can handle the rest of the configuration in a more secure manner
+                } catch (SAXException e) {
+                    _logger.severe("[EXT-SCRIPTING] Web.xml could not be parsed disabling scripting");
+                    WeavingContext.setScriptingEnabled(false);
+
+                } finally {
+                    in.close();
+                }
+            }
+
+        } catch (IOException e) {
+            _logger.severe("[EXT-SCRIPTING] Web.xml could not be parsed disabling scripting");
+            WeavingContext.setScriptingEnabled(false);
+
+        }
+    }
+
+  
+
+    private static boolean initWeavers(ServletContext servletContext) {
+        _logger.fine("[EXT-SCRIPTING] initializing the weaving contexts");
+
+        ScriptingWeaver groovyWeaver = new GroovyScriptingWeaver(servletContext);
+        ScriptingWeaver javaWeaver = new JavaScriptingWeaver(servletContext);
+
+        setupScriptingPaths(servletContext, groovyWeaver, ScriptingConst.GROOVY_SOURCE_ROOT, ScriptingConst.INIT_PARAM_CUSTOM_GROOVY_LOADER_PATHS);
+        setupScriptingPaths(servletContext, javaWeaver, ScriptingConst.JAVA_SOURCE_ROOT, ScriptingConst.INIT_PARAM_CUSTOM_JAVA_LOADER_PATHS);
+        if (!WeavingContext.isScriptingEnabled()) {
+            return true;
+        }
+
+        //we have to store it because our filter
+        //does not trigger upon initialisation
+        WeavingContext.setWeaver(new CoreWeaver(groovyWeaver, javaWeaver));
+        servletContext.setAttribute(ScriptingConst.CTX_ATTR_SCRIPTING_WEAVER, WeavingContext.getWeaver());
+        return false;
+    }
+
+    /**
+     * initialisation of the refresh context object
+     * the refresh context, is a context object which keeps
+     * the refresh information (refresh time, needs refresh) etc...
+     *
+     * @param servletContext the servlet context singleton which keeps
+     *                       the context for distribution
+     */
+    private static void initRefreshContext(ServletContext servletContext) {
+        _logger.fine("[EXT-SCRIPTING] initializing the refresh context");
+
+        if (!WeavingContext.isScriptingEnabled()) {
+            return;
+        }
+        RefreshContext rContext = new RefreshContext();
+        servletContext.setAttribute(ScriptingConst.CTX_ATTR_REFRESH_CONTEXT, rContext);
+        rContext.getDaemon().initWeavingContext(servletContext);
+        WeavingContext.setRefreshContext(rContext);
+    }
+
+    private static void setupScriptingPaths(ServletContext servletContext, ScriptingWeaver weaver, String contextRootKey, String initParams) {
+        if (!WeavingContext.isScriptingEnabled()) {
+            return;
+        }
+
+        String classRoot = "";
+        String scriptingRoot = "";
+
+        String additionalLoaderPaths;
+
+        String contextRoot = servletContext.getRealPath(contextRootKey);
+        if (contextRoot == null) {
+            _logger.warning("[EXT-SCRIPTING] one of the standard paths could not be resolved: " + contextRootKey + " this is either due to the path is missing or due to a configuration error! You can bypass the problem by setting additional loader paths if they are not set already!");
+            contextRoot = "";
+
+        }
+
+        contextRoot = contextRoot.trim();
+        scriptingRoot = contextRoot;
+
+        additionalLoaderPaths = servletContext.getInitParameter(initParams);
+        appendAdditionalPaths(additionalLoaderPaths, weaver);
+        if (additionalLoaderPaths == null || additionalLoaderPaths.trim().equals("")) {
+            if (contextRoot.equals("")) {
+
+                _logger.warning("[EXT-SCRIPTING] Standard paths (WEB-INF/groovy and WEB-INF/java could not be determined, also no additional loader paths are set, I cannot start properly, please set additional loader paths for Ext-Scripting to work correctly!");
+                _logger.warning("[EXT-SCRIPTING] I am disabling Ext-Scripting!");
+
+                WeavingContext.setScriptingEnabled(false);
+                return;
+            }
+            weaver.appendCustomScriptPath(scriptingRoot);
+            weaver.appendCustomScriptPath(classRoot);
+        }
+    }
+
+    private static void appendAdditionalPaths(String additionalLoaderPaths, ScriptingWeaver workWeaver) {
+        if (!StringUtils.isBlank(additionalLoaderPaths)) {
+            String[] additionalPaths = additionalLoaderPaths.split(",");
+            for (String path : additionalPaths) {
+                workWeaver.appendCustomScriptPath(path);
+            }
+        }
+    }
+
+    /**
+     * DisconnectedEntityResolver prevents external network access during parsing in case the remote host cannot be reached.
+     */
+    private static class DisconnectedEntityResolver implements EntityResolver {
+        public InputSource resolveEntity(String publicId, String systemId) {
+            // use an empty input source
+            return new InputSource(new ByteArrayInputStream(new byte[0]));
+        }
+
+        // no instances
+
+        private DisconnectedEntityResolver() {
+        }
+
+        static public DisconnectedEntityResolver sharedInstance() {
+            return _INSTANCE;
+        }
+
+        static private DisconnectedEntityResolver _INSTANCE = new DisconnectedEntityResolver();
+    }
+
+    private static  class WebXmlParserImpl {
+
+        private void addServletFilter(String filterName, String filterClass) {
+            if (filterName.equals("scriptingFilter") && filterClass.equals(ScriptingServletFilter.class.getName())) {
+                WeavingContext.setScriptingEnabled(true);
+            }
+        }
+
+    }
+
+}

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

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

Modified: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/servlet/CustomChainLoader.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/servlet/CustomChainLoader.java?rev=927885&r1=927884&r2=927885&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/servlet/CustomChainLoader.java (original)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/servlet/CustomChainLoader.java Fri Mar 26 14:50:22 2010
@@ -19,6 +19,7 @@
 package org.apache.myfaces.scripting.servlet;
 
 import org.apache.commons.lang.StringUtils;
+import org.apache.myfaces.scripting.api.ScriptingConst;
 import org.apache.myfaces.scripting.api.ScriptingWeaver;
 import org.apache.myfaces.scripting.core.CoreWeaver;
 import org.apache.myfaces.scripting.core.util.WeavingContext;
@@ -42,114 +43,20 @@ public class CustomChainLoader extends C
        * servlet context init var for additional chain loader paths which have
        * higher priority than the default ones 
        */
-    static String CUSTOM_LOADER_PATHS = "org.apache.myfaces.scripting.groovy.LOADER_PATHS";
-    static String CUSTOM_JAVA_LOADER_PATHS = "org.apache.myfaces.scripting.java.LOADER_PATHS";
 
-    String classRoot = "";
-    String scriptingRoot = "";
     ScriptingWeaver scriptingWeaver = null;
-    private static final String GROOVY_SOURCE_ROOT = "/WEB-INF/groovy/";
-    private static final String JAVA_SOURCE_ROOT = "/WEB-INF/java/";
 
     Logger log = Logger.getLogger(CustomChainLoader.class.getName());
 
     public CustomChainLoader(ServletContext servletContext) {
-        initWeavingContext();
-        initWeavers(servletContext);
-        initRefreshContext(servletContext);
-    }
-
-    private void initWeavingContext() {
-        log.fine("[EXT-SCRIPTING] initializing the base weaver");
-        WeavingContext.setScriptingEnabled(true);
-    }
-
-    private boolean initWeavers(ServletContext servletContext) {
-        log.fine("[EXT-SCRIPTING] initializing the weaving contexts");
-
-        ScriptingWeaver groovyWeaver = new GroovyScriptingWeaver(servletContext);
-        ScriptingWeaver javaWeaver = new JavaScriptingWeaver(servletContext);
-
-        setupScriptingPaths(servletContext, groovyWeaver, GROOVY_SOURCE_ROOT, CUSTOM_LOADER_PATHS);
-        setupScriptingPaths(servletContext, javaWeaver, JAVA_SOURCE_ROOT, CUSTOM_JAVA_LOADER_PATHS);
-        if (!WeavingContext.isScriptingEnabled()) {
-            return true;
-        }
-        this.scriptingWeaver = new CoreWeaver(groovyWeaver, javaWeaver);
-        //we have to store it because our filter
-        //does not trigger upon initialisation
-        WeavingContext.setWeaver(this.scriptingWeaver);
-        return false;
-    }
-
-    /**
-     * initialisation of the refresh context object
-     * the refresh context, is a context object which keeps
-     * the refresh information (refresh time, needs refresh) etc...
-     *
-     * @param servletContext the servlet context singleton which keeps
-     *                       the context for distribution
-     */
-    private void initRefreshContext(ServletContext servletContext) {
-        log.fine("[EXT-SCRIPTING] initializing the refresh context");
-
-        if (!WeavingContext.isScriptingEnabled()) {
-            return;
-        }
-        RefreshContext rContext = new RefreshContext();
-        servletContext.setAttribute("RefreshContext", rContext);
-        rContext.getDaemon().initWeavingContext(servletContext);
-        WeavingContext.setRefreshContext(rContext);
-    }
-
-    private void setupScriptingPaths(ServletContext servletContext, ScriptingWeaver weaver, String contextRootKey, String initParams) {
-        if (!WeavingContext.isScriptingEnabled()) {
-            return;
-        }
-        String additionalLoaderPaths;
-
-        String contextRoot = servletContext.getRealPath(contextRootKey);
-        if (contextRoot == null) {
-            Logger logger = getLogger();
-            logger.warning("[EXT-SCRIPTING] one of the standard paths could not be resolved: " + contextRootKey + " this is either due to the path is missing or due to a configuration error! You can bypass the problem by setting additional loader paths if they are not set already!");
-            contextRoot = "";
-
-        }
-
-        contextRoot = contextRoot.trim();
-        scriptingRoot = contextRoot;
-
-        additionalLoaderPaths = servletContext.getInitParameter(initParams);
-        appendAdditionalPaths(additionalLoaderPaths, weaver);
-        if (additionalLoaderPaths == null || additionalLoaderPaths.trim().equals("")) {
-            if (contextRoot.equals("")) {
-                Logger logger = getLogger();
-                logger.warning("[EXT-SCRIPTING] Standard paths (WEB-INF/groovy and WEB-INF/java could not be determined, also no additional loader paths are set, I cannot start properly, please set additional loader paths for Ext-Scripting to work correctly!");
-                logger.warning("[EXT-SCRIPTING] I am disabling Ext-Scripting!");
-
-                WeavingContext.setScriptingEnabled(false);
-                return;
-            }
-            weaver.appendCustomScriptPath(scriptingRoot);
-            weaver.appendCustomScriptPath(classRoot);
-        }
-    }
-
-    private Logger getLogger() {
-        Logger logger = Logger.getLogger(this.getClass().getName());
-        return logger;
-    }
-
-    private void appendAdditionalPaths(String additionalLoaderPaths, ScriptingWeaver workWeaver) {
-        if (!StringUtils.isBlank(additionalLoaderPaths)) {
-            String[] additionalPaths = additionalLoaderPaths.split(",");
-            for (String path : additionalPaths) {
-                workWeaver.appendCustomScriptPath(path);
-            }
-        }
+        scriptingWeaver = WeavingContext.getWeaver();
     }
+  
 
     public Class forName(String name) {
+        if(scriptingWeaver == null) {
+            return null;
+        }
         if (name.endsWith(";")) {
             name = name.substring(1, name.length() - 1);
         }
@@ -171,12 +78,6 @@ public class CustomChainLoader extends C
         return scriptingWeaver.loadScriptingClassFromName(name);
     }
 
-    public ScriptingWeaver getScriptingWeaver() {
-        return scriptingWeaver;
-    }
-
-    public void setScriptingWeaver(ScriptingWeaver scriptingWeaver) {
-        this.scriptingWeaver = scriptingWeaver;
-    }
+   
 
 }
\ No newline at end of file

Modified: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/servlet/ScriptingServletFilter.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/servlet/ScriptingServletFilter.java?rev=927885&r1=927884&r2=927885&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/servlet/ScriptingServletFilter.java (original)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/servlet/ScriptingServletFilter.java Fri Mar 26 14:50:22 2010
@@ -29,7 +29,7 @@ import java.util.logging.Logger;
 
 /**
  * Scripting servlet filter
- * 
+ * <p/>
  * hits the filter while the
  * init system is not entirely finished yet
  *
@@ -43,6 +43,9 @@ public class ScriptingServletFilter impl
 
     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 {
@@ -65,17 +68,17 @@ public class ScriptingServletFilter impl
 
     /**
      * 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;
+        if (active) return;
 
-        AtomicBoolean startup = (AtomicBoolean) context.getAttribute(ScriptingConst.CTX_STARTUP);
+        AtomicBoolean startup = (AtomicBoolean) context.getAttribute(ScriptingConst.CTX_ATTR_STARTUP);
         if (startup == null) {
-            if(!warned) {
+            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");
@@ -93,7 +96,7 @@ public class ScriptingServletFilter impl
     //we mark the request beginning and end for further synchronisation issues
 
     private final AtomicInteger getRequestCnt() {
-        AtomicInteger retVal = (AtomicInteger) context.getAttribute(ScriptingConst.CTX_REQUEST_CNT);
+        AtomicInteger retVal = (AtomicInteger) context.getAttribute(ScriptingConst.CTX_ATTR_REQUEST_CNT);
 
         return retVal;
     }

Modified: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/servlet/StartupServletContextPluginChainLoader.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/servlet/StartupServletContextPluginChainLoader.java?rev=927885&r1=927884&r2=927885&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/servlet/StartupServletContextPluginChainLoader.java (original)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/scripting/servlet/StartupServletContextPluginChainLoader.java Fri Mar 26 14:50:22 2010
@@ -18,12 +18,8 @@
  */
 package org.apache.myfaces.scripting.servlet;
 
-import org.apache.commons.lang.StringUtils;
-import org.apache.myfaces.scripting.api.Configuration;
 import org.apache.myfaces.scripting.api.ScriptingConst;
-import org.apache.myfaces.scripting.api.ScriptingWeaver;
 import org.apache.myfaces.scripting.core.util.ClassUtils;
-import org.apache.myfaces.scripting.core.util.Strategy;
 import org.apache.myfaces.scripting.core.util.WeavingContext;
 import org.apache.myfaces.scripting.refresh.RefreshContext;
 import org.apache.myfaces.webapp.StartupListener;
@@ -54,10 +50,10 @@ public class StartupServletContextPlugin
         ServletContext servletContext = servletContextEvent.getServletContext();
         if (servletContext == null) return;
 
-        servletContext.setAttribute(ScriptingConst.CTX_REQUEST_CNT, new AtomicInteger(0));
-        servletContext.setAttribute(ScriptingConst.CTX_STARTUP, new AtomicBoolean(Boolean.TRUE));
+        servletContext.setAttribute(ScriptingConst.CTX_ATTR_REQUEST_CNT, new AtomicInteger(0));
+        servletContext.setAttribute(ScriptingConst.CTX_ATTR_STARTUP, new AtomicBoolean(Boolean.TRUE));
 
-        initConfig(servletContext);
+        initContext(servletContext);
         initChainLoader(servletContext);
         initStartup();
     }
@@ -65,7 +61,7 @@ public class StartupServletContextPlugin
     private void initStartup() {
         if (WeavingContext.isScriptingEnabled()) {
             log.info("[EXT-SCRIPTING] Compiling all sources for the first time");
-            WeavingContext.getWeaver().initiateStartup();
+            WeavingContext.getWeaver().postStartupActions();
         }
     }
 
@@ -87,53 +83,13 @@ public class StartupServletContextPlugin
      *
      * @param servletContext the applications servlet context
      */
-    private void initConfig(ServletContext servletContext) {
-        final Configuration conf = new Configuration();
-        servletContext.setAttribute(ScriptingConst.CTX_CONFIGURATION, conf);
-        WeavingContext.setConfiguration(conf);
-        //we now add the resource loader path here
-
-        /*
-         * we define a set of closures (inner classes) which make
-         * our code more reusable we define a strategy
-         * for each comma delimited set of values
-         */
-        Strategy addResourceDirStrategy = new Strategy() {
-            public void apply(Object element) {
-                conf.addResourceDir((String) element);
-            }
-        };
-        Strategy addAdditionalClassPathStrategy = new Strategy() {
-            public void apply(Object element) {
-                conf.addAdditionalClassPath((String) element);
-            }
-        };
-        Strategy addWhiteListPackageStrategy = new Strategy() {
-            public void apply(Object element) {
-                conf.addWhitelistPackage((String) element);
-            }
-        };
-
-        /**
-         * We now apply the values into our own lists
-         */
-        applyEntries(servletContext.getInitParameter(ScriptingConst.INIT_PARAM_RESOURCE_PATH), addResourceDirStrategy);
-        applyEntries(servletContext.getInitParameter(ScriptingConst.INIT_PARAM_SCRIPTING_ADDITIONAL_CLASSPATH), addAdditionalClassPathStrategy);
-        applyEntries(servletContext.getInitParameter(ScriptingConst.INIT_PARAM_SCRIPTING_PACKAGE_WHITELIST), addWhiteListPackageStrategy);
-
-    }
-
-    private void applyEntries(String val, Strategy strategy) {
-        if (!StringUtils.isBlank(val)) {
-            String[] splittedVal = val.split(ScriptingConst.CONTEXT_VALUE_DIVIDER);
-            for (String singleVal : splittedVal) {
-                strategy.apply(singleVal);
-            }
-        }
+    private void initContext(ServletContext servletContext) {
+        WeavingContext.startup(servletContext);
     }
 
     public void postInit(ServletContextEvent evt) {
-        evt.getServletContext().setAttribute(ScriptingConst.CTX_STARTUP, new AtomicBoolean(Boolean.FALSE));
+        //tell the system that the startup phase is done
+        evt.getServletContext().setAttribute(ScriptingConst.CTX_ATTR_STARTUP, new AtomicBoolean(Boolean.FALSE));
     }
 
     public void preDestroy(ServletContextEvent evt) {