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 2009/09/18 16:30:32 UTC

svn commit: r816646 - in /myfaces/extensions/scripting/trunk/core: core/src/main/java/org/apache/myfaces/scripting/api/ core/src/main/java/org/apache/myfaces/scripting/core/ core/src/main/java/org/apache/myfaces/scripting/loaders/java/ myfaces2-extensi...

Author: werpu
Date: Fri Sep 18 14:30:30 2009
New Revision: 816646

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

Ongoing works on the initial scan infrastructure.

The initial scripting annotation scan has to be performed
after myfaces has started up and before the first page is accessed
which means we use the jsf2 facilities of application events
to target the right lifecycle point.

The idea is to wait for postConstructApplication and then trigger
the initial source scan.
By then the scripting subsystem weavers are initialized
and we can trigger the initial scan on the weavers which then
can add the missing source artefacts to the runtime config holding
all the faces-config meta data!

It still is undecided yet whether the weavers themselves
can register their scanners dynamically or whether
the startup listener registers them in the weavers.
(I have to sleep over that one)

Added:
    myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/JavaSourceAnnotationScanner.java   (contents, props changed)
      - copied, changed from r816611, myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/SourceAnnotationScanner.java
    myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/startup/
    myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/startup/IntialScanAnnotationListener.java   (with props)
Removed:
    myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/SourceAnnotationScanner.java
Modified:
    myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/AnnotationScanner.java
    myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/ScriptingWeaver.java
    myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/CoreWeaver.java
    myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/loaders/java/JavaScriptingWeaver.java
    myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/resources/META-INF/faces-config.xml

Modified: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/AnnotationScanner.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/AnnotationScanner.java?rev=816646&r1=816645&r2=816646&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/AnnotationScanner.java (original)
+++ myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/AnnotationScanner.java Fri Sep 18 14:30:30 2009
@@ -15,9 +15,11 @@
 public interface AnnotationScanner {
 
 
-    void scanPaths();
+    public void scanPaths();
 
-    void clearListeners();
+    public void clearListeners();
 
-    void addListener(AnnotationScanListener listener);
+    public void addListener(AnnotationScanListener listener);
+
+    public void addScanPath(String scanPath);
 }

Modified: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/ScriptingWeaver.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/ScriptingWeaver.java?rev=816646&r1=816645&r2=816646&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/ScriptingWeaver.java (original)
+++ myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/api/ScriptingWeaver.java Fri Sep 18 14:30:30 2009
@@ -88,4 +88,13 @@
 
     public ScriptingWeaver getWeaverInstance(Class weaverClass);
 
+    /**
+     * full annotation scan
+     * at startup once the system is initialized
+     */
+    public void fullAnnotationScan();
+
+
+    //TODO add file annotation scan capabilities here
+
 }

Modified: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/CoreWeaver.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/CoreWeaver.java?rev=816646&r1=816645&r2=816646&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/CoreWeaver.java (original)
+++ myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/CoreWeaver.java Fri Sep 18 14:30:30 2009
@@ -107,5 +107,11 @@
          }
          return null;   
     }
+
+    public void fullAnnotationScan() {
+        for(ScriptingWeaver weaver : _weavers) {
+            weaver.fullAnnotationScan();
+        }
+    }
 }
 

Modified: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/loaders/java/JavaScriptingWeaver.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/loaders/java/JavaScriptingWeaver.java?rev=816646&r1=816645&r2=816646&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/loaders/java/JavaScriptingWeaver.java (original)
+++ myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/loaders/java/JavaScriptingWeaver.java Fri Sep 18 14:30:30 2009
@@ -21,15 +21,14 @@
 import org.apache.commons.beanutils.BeanUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.myfaces.scripting.api.BaseWeaver;
-import org.apache.myfaces.scripting.api.DynamicCompiler;
-import org.apache.myfaces.scripting.api.ScriptingConst;
-import org.apache.myfaces.scripting.api.ScriptingWeaver;
+import org.apache.myfaces.scripting.api.*;
 import org.apache.myfaces.scripting.core.util.ReflectUtil;
+import org.apache.myfaces.scripting.core.util.ClassUtils;
 //import org.apache.myfaces.scripting.loaders.java.jsr199.ReflectCompilerFacade;
 
 import javax.servlet.ServletContext;
 import java.io.File;
+import java.io.Serializable;
 import java.lang.reflect.InvocationTargetException;
 import java.util.Iterator;
 
@@ -39,7 +38,7 @@
  *         The Scripting Weaver for the java core which reloads the java scripts
  *         dynamically upon change
  */
-public class JavaScriptingWeaver extends BaseWeaver implements ScriptingWeaver {
+public class JavaScriptingWeaver extends BaseWeaver implements ScriptingWeaver, Serializable {
 
     Log log = LogFactory.getLog(JavaScriptingWeaver.class);
     String classPath = "";
@@ -49,6 +48,8 @@
     private static final String JSR199_COMPILER = "org.apache.myfaces.scripting.loaders.java.jsr199.CompilerFacade";
     private static final String JCI_COMPILER = "org.apache.myfaces.scripting.loaders.java.jci.CompilerFacade";
 
+    AnnotationScanner _scanner = null;
+
     /**
      * helper to allow initial compiler classpath scanning
      *
@@ -58,6 +59,26 @@
         super(JAVA_FILE_ENDING, ScriptingConst.ENGINE_TYPE_JAVA);
         //init classpath removed we can resolve that over the
         //url classloader at the time myfaces is initialized
+        try {
+            Class scanner = ClassUtils.getContextClassLoader().loadClass("org.apache.myfaces.scripting.jsf2.annotation.JavaSourceAnnotationScanner");
+            AnnotationScanner scanObj = (AnnotationScanner) scanner.newInstance();
+
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        } catch (InstantiationException e) {
+            e.printStackTrace();
+        } catch (ClassNotFoundException e) {
+            //we do nothing here
+        }
+
+    }
+
+    @Override
+    public void appendCustomScriptPath(String scriptPath) {
+        super.appendCustomScriptPath(scriptPath);
+        if(_scanner != null) {
+            _scanner.addScanPath(scriptPath);
+        }
     }
 
     public JavaScriptingWeaver() {
@@ -142,4 +163,16 @@
     public boolean isDynamic(Class clazz) {
         return identifier.isDynamic(clazz);  //To change body of implemented methods use File | Settings | File Templates.
     }
+
+
+    /**
+     * full scan, scans for all artefacts in all files
+     */
+    public void fullAnnotationScan() {
+        if(_scanner == null) {
+            return;
+        }
+        _scanner.scanPaths();
+    }
+
 }

Copied: myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/JavaSourceAnnotationScanner.java (from r816611, myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/SourceAnnotationScanner.java)
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/JavaSourceAnnotationScanner.java?p2=myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/JavaSourceAnnotationScanner.java&p1=myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/SourceAnnotationScanner.java&r1=816611&r2=816646&rev=816646&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/SourceAnnotationScanner.java (original)
+++ myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/JavaSourceAnnotationScanner.java Fri Sep 18 14:30:30 2009
@@ -40,12 +40,17 @@
  *          wherever possible
  */
 
-public class SourceAnnotationScanner implements AnnotationScanner {
+public class JavaSourceAnnotationScanner implements AnnotationScanner {
 
     List<AnnotationScanListener> _listeners = new LinkedList<AnnotationScanListener>();
     JavaDocBuilder _builder = new JavaDocBuilder();
 
-    public SourceAnnotationScanner(String... sourcePaths) {
+    public JavaSourceAnnotationScanner() {
+        initDefaultListeners();
+    }
+
+
+    public JavaSourceAnnotationScanner(String... sourcePaths) {
 
         initSourcePaths(sourcePaths);
 
@@ -53,13 +58,17 @@
 
     }
 
+    public void addScanPath(String sourcePath) {
+        File sourcePathFile = new File(sourcePath);
+        if (sourcePathFile.exists()) {
+            _builder.addSourceTree(sourcePathFile);
+        }
+    }
+
 
     private void initSourcePaths(String... sourcePaths) {
         for (String sourcePath : sourcePaths) {
-            File sourcePathFile = new File(sourcePath);
-            if (sourcePathFile.exists()) {
-                _builder.addSourceTree(sourcePathFile);
-            }
+           addScanPath(sourcePath);
         }
     }
 

Propchange: myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/JavaSourceAnnotationScanner.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/jsf2/annotation/JavaSourceAnnotationScanner.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/startup/IntialScanAnnotationListener.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/startup/IntialScanAnnotationListener.java?rev=816646&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/startup/IntialScanAnnotationListener.java (added)
+++ myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/startup/IntialScanAnnotationListener.java Fri Sep 18 14:30:30 2009
@@ -0,0 +1,55 @@
+/*
+ * 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.startup;
+
+import org.apache.myfaces.scripting.core.util.ProxyUtils;
+import org.apache.myfaces.scripting.api.ScriptingWeaver;
+
+import javax.faces.event.SystemEventListener;
+import javax.faces.event.SystemEvent;
+import javax.faces.event.PostConstructApplicationEvent;
+import javax.faces.application.Application;
+
+/**
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ *
+ * we do the initial source scan after the entire application has started up
+ * we now can reuse our jsf2 system event faclities by placing
+ * a listener to the application startup
+ */
+
+public class IntialScanAnnotationListener implements SystemEventListener {
+    public boolean isListenerForSource(Object source) {
+        return source instanceof Application;  //To change body of implemented methods use File | Settings | File Templates.
+    }
+
+    public void processEvent(SystemEvent event) {
+        if (!event.getClass().equals(PostConstructApplicationEvent.class)) {
+            return;
+        }
+        //we can rely on being in the same thread as the original
+        //startup context listener, so the initial weaver still is activated
+        ScriptingWeaver weaver = ProxyUtils.getWeaver();
+
+        //we now do a full source or precompiled annotation scan
+        //the entire scripting subsystem should be initialized by now
+        weaver.fullAnnotationScan();
+    }
+}

Propchange: myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/startup/IntialScanAnnotationListener.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/java/org/apache/myfaces/scripting/startup/IntialScanAnnotationListener.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Modified: myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/resources/META-INF/faces-config.xml
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/resources/META-INF/faces-config.xml?rev=816646&r1=816645&r2=816646&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/resources/META-INF/faces-config.xml (original)
+++ myfaces/extensions/scripting/trunk/core/myfaces2-extensions/src/main/resources/META-INF/faces-config.xml Fri Sep 18 14:30:30 2009
@@ -41,4 +41,14 @@
             org.apache.myfaces.scripting.jsf.dynamicdecorators.factories.ScriptingRenderkitFactory
         </render-kit-factory>
     </factory>
+
+        <!--
+        not working yet in myfaces
+        <application>
+            <system-event-listener>
+                <system-event-listener-class>org.apache.myfaces.scripting.startup.IntialScanAnnotationListener</system-event-listener-class>
+                <system-event-class>javax.faces.event.PostConstructApplicationEvent</system-event-class>
+            </system-event-listener>
+        </application>
+        -->
 </faces-config>
\ No newline at end of file