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/20 15:09:34 UTC

svn commit: r1302908 - in /myfaces/extensions/scripting/trunk: extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/common/util/ extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scr...

Author: werpu
Date: Tue Mar 20 14:09:33 2012
New Revision: 1302908

URL: http://svn.apache.org/viewvc?rev=1302908&view=rev
Log:
EXTSCRIPT-159: Add scala language support if possible: scala support now working

Added:
    myfaces/extensions/scripting/trunk/extscript-examples/blog-example/src/main/webapp/WEB-INF/scala/
    myfaces/extensions/scripting/trunk/extscript-examples/blog-example/src/main/webapp/WEB-INF/scala/scalaBlog/
    myfaces/extensions/scripting/trunk/extscript-examples/blog-example/src/main/webapp/WEB-INF/scala/scalaBlog/TestBean.scala
Modified:
    myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/common/util/FileUtils.java
    myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/engine/EngineScala.java
    myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/engine/FactoryEngines.java
    myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/scala/org/apache/myfaces/extensions/scripting/core/engine/compiler/ScalaCompiler.scala
    myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/test/resources/webapp/WEB-INF/web.xml
    myfaces/extensions/scripting/trunk/extscript-examples/blog-example/src/main/webapp/WEB-INF/web.xml
    myfaces/extensions/scripting/trunk/extscript-examples/blog-example/src/main/webapp/blog.xhtml
    myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/src/main/conf/dev/web.xml
    myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-extscript-helloworld/src/main/webapp/WEB-INF/web.xml

Modified: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/common/util/FileUtils.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/common/util/FileUtils.java?rev=1302908&r1=1302907&r2=1302908&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/common/util/FileUtils.java (original)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/common/util/FileUtils.java Tue Mar 20 14:09:33 2012
@@ -156,6 +156,7 @@ public class FileUtils {
         return strategy.getFoundFiles();
     }
 
+
     /**
      * fetches the source files from a list of source paths
      *

Modified: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/engine/EngineScala.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/engine/EngineScala.java?rev=1302908&r1=1302907&r2=1302908&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/engine/EngineScala.java (original)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/engine/EngineScala.java Tue Mar 20 14:09:33 2012
@@ -27,6 +27,7 @@ import org.apache.myfaces.extensions.scr
 import org.apache.myfaces.extensions.scripting.core.engine.api.CompilationResult;
 import org.apache.myfaces.extensions.scripting.core.engine.api.ScriptingEngine;
 import org.apache.myfaces.extensions.scripting.core.engine.compiler.GroovyCompiler;
+import org.apache.myfaces.extensions.scripting.core.engine.compiler.ScalaCompiler;
 import org.apache.myfaces.extensions.scripting.core.reloading.SimpleReloadingStrategy;
 import scala.ScalaObject;
 
@@ -109,9 +110,9 @@ public class EngineScala extends BaseEng
     {
         WeavingContext context = WeavingContext.getInstance();
         Configuration configuration = context.getConfiguration();
-        GroovyCompiler compiler = new GroovyCompiler();
+        ScalaCompiler compiler = new ScalaCompiler();
         File targetDir = configuration.getCompileTarget();
-        Collection<String> sourceDirs = configuration.getSourceDirs(ENGINE_TYPE_JSF_GROOVY);
+        Collection<String> sourceDirs = configuration.getSourceDirs(ENGINE_TYPE_JSF_SCALA);
         CompilationResult res = null;
         for (String sourceRoot : sourceDirs)
         {

Modified: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/engine/FactoryEngines.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/engine/FactoryEngines.java?rev=1302908&r1=1302907&r2=1302908&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/engine/FactoryEngines.java (original)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/engine/FactoryEngines.java Tue Mar 20 14:09:33 2012
@@ -19,19 +19,12 @@
 package org.apache.myfaces.extensions.scripting.core.engine;
 
 import org.apache.myfaces.extensions.scripting.core.common.util.ClassUtils;
-import org.apache.myfaces.extensions.scripting.core.common.util.FileStrategy;
-import org.apache.myfaces.extensions.scripting.core.common.util.FileUtils;
 import org.apache.myfaces.extensions.scripting.core.common.util.ReflectUtil;
 import org.apache.myfaces.extensions.scripting.core.engine.api.ScriptingEngine;
 
-import java.io.File;
 import java.io.IOException;
-import java.net.URL;
 import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.logging.Logger;
-import java.util.regex.Pattern;
 
 /**
  * @author Werner Punz (latest modification by $Author$)
@@ -44,79 +37,57 @@ public class FactoryEngines
 {
     final Logger _log = Logger.getLogger(this.getClass().getName());
     /*we have to keep the order of the engines for the class detection*/
-    Map<Integer, ScriptingEngine> _engines = new LinkedHashMap<Integer, ScriptingEngine> ();
-    List<ScriptingEngine> _engineOrder = new CopyOnWriteArrayList<ScriptingEngine>();
+    Map<Integer, ScriptingEngine> _engines = new LinkedHashMap<Integer, ScriptingEngine>();
 
     public void init() throws IOException
     {
         //loadEnginesDynamically();
+        ScriptingEngine javaEngine = new EngineJava();
+        ScriptingEngine groovyEngine = null;
+        ScriptingEngine scalaEngine = null;
+        try
+        {
+            ClassUtils.getContextClassLoader().loadClass("groovy.lang.GroovyObject");
+            groovyEngine = (ScriptingEngine) ReflectUtil.instantiate("org.apache.myfaces.extensions.scripting.core" +
+                    ".engine.EngineGroovy");
+        }
+        catch (Exception ex)
+        {
+        }
+        try
+        {
+            ClassUtils.getContextClassLoader().loadClass("scala.ScalaObject");
+            scalaEngine = (ScriptingEngine) ReflectUtil.instantiate("org.apache.myfaces.extensions.scripting.core" +
+                    ".engine.EngineScala");
+        }
+        catch (Exception ex)
+        {
+        }
 
-        EngineJava javaEngine = new EngineJava();
-        EngineGroovy groovyEngine = new EngineGroovy();
-        EngineScala scalaEngine = new EngineScala();
         if (_engines.isEmpty())
         {
             //We now add the keys as linked hashmap keys
             //so that java always is last hence the class
             //detection has to work from top to bottom
-            _engines.put(groovyEngine.getEngineType(), groovyEngine);
-            _engines.put(scalaEngine.getEngineType(), scalaEngine);
-            _engines.put(javaEngine.getEngineType(), javaEngine);
+            if (groovyEngine != null)
+                _engines.put(groovyEngine.getEngineType(), groovyEngine);
+            if (scalaEngine != null)
+                _engines.put(scalaEngine.getEngineType(), scalaEngine);
 
-            _engineOrder.add(javaEngine);
-            _engineOrder.add(groovyEngine);
+            _engines.put(javaEngine.getEngineType(), javaEngine);
         }
     }
 
-    /**
-     * loads the engins dynamically from
-     * their corresponding package and name
-     *
-     * @throws IOException
-     */
-    private void loadEnginesDynamically() throws IOException
-    {
-        ClassLoader currentLoader = ClassUtils.getContextClassLoader();//this.getClass().getClassLoader();
-        String canonicalPackageName = this.getClass().getPackage().getName().replaceAll("\\.", File.separator);
-        //TODO not working in a servlet environment we for now map it hardcoded
-        Enumeration<URL> enumeration = currentLoader.getResources(canonicalPackageName);
-        while (enumeration.hasMoreElements())
-        {
-            //we load all classes which start with engine initially those are our
-            //enginesvTH
-            URL element = enumeration.nextElement();
-            File file = new File(element.getFile());
-            FileStrategy strategy = new FileStrategy(Pattern.compile("engine[^\\.(test)]+\\.class$"));
-            FileUtils.listFiles(file, strategy);
-            for (File foundFile : strategy.getFoundFiles())
-            {
-                String absoluteDir = foundFile.getAbsolutePath();
-
-                //TODO windows
-                String rootDir = absoluteDir.substring(0, absoluteDir.indexOf(canonicalPackageName));
-                String className = absoluteDir.substring(rootDir.length()).replaceAll(File.separator, ".");
-                className = className.substring(0, className.length() - 6);
-                try
-                {
-                    ScriptingEngine engine = (ScriptingEngine) ReflectUtil.instantiate(currentLoader.loadClass
-                            (className));
-                    _engines.put(engine.getEngineType(), engine);
-                    String supportedLanguage = className.substring(className.indexOf(".Engine") + ".Engine".length
-                            ());
-                    _log.info("[EXT-SCRIPTING] initializing Engine " + supportedLanguage);
-                    _engineOrder.add(engine);
-                }
-                catch (ClassNotFoundException e)
-                {
-                    //cannot happen
-                }
-            }
-        }
-    }
+
 
     public Collection<ScriptingEngine> getEngines()
     {
-        return _engineOrder;
+        List<ScriptingEngine> engineList = new ArrayList<ScriptingEngine>();
+        for(Map.Entry<Integer, ScriptingEngine> entry: _engines.entrySet()) {
+           engineList.add(entry.getValue());
+        }
+
+        return engineList;
     }
 
     public ScriptingEngine getEngine(int engineType)

Modified: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/scala/org/apache/myfaces/extensions/scripting/core/engine/compiler/ScalaCompiler.scala
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/scala/org/apache/myfaces/extensions/scripting/core/engine/compiler/ScalaCompiler.scala?rev=1302908&r1=1302907&r2=1302908&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/scala/org/apache/myfaces/extensions/scripting/core/engine/compiler/ScalaCompiler.scala (original)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/main/scala/org/apache/myfaces/extensions/scripting/core/engine/compiler/ScalaCompiler.scala Tue Mar 20 14:09:33 2012
@@ -21,9 +21,9 @@ package org.apache.myfaces.extensions.sc
 import java.io.File
 import org.apache.myfaces.extensions.scripting.core.engine.api.CompilationResult
 import org.apache.myfaces.extensions.scripting.core.api.WeavingContext
-import org.apache.myfaces.extensions.scripting.core.common.util.FileUtils
 import scala.tools.nsc.{Global, Settings}
 import scala.collection.JavaConversions._
+import org.apache.myfaces.extensions.scripting.core.common.util.{ClassUtils, FileUtils}
 
 /**
  *
@@ -53,9 +53,25 @@ class ScalaCompiler extends org.apache.m
     settings.outdir.value = configuration.getCompileTarget.getAbsolutePath
     settings.deprecation.value = true // enable detailed deprecation warnings
     settings.unchecked.value = true // enable detailed unchecked warnings
-    val cp: String = System.getProperty("java.class.path")
-    settings.classpath.value = cp
+    var cp: String = System.getProperty("java.class.path")
+
+
+    if(!cp.contains("scala")) {
+      val classesDir = ClassUtils.getContextClassLoader().getResource("./").getFile();
 
+      val libDir = classesDir+".."+File.separator+"lib"
+      val libs = FileUtils.fetchSourceFiles(new File(libDir),"*.jar")
+      val finalPath = new StringBuilder
+      finalPath.append(cp)
+      finalPath.append(File.pathSeparator)
+      finalPath.append(classesDir)
+      for(singleLib:File<-libs){
+        finalPath.append(File.pathSeparator)
+        finalPath.append(singleLib.getAbsolutePath)
+      }
+      cp = finalPath.toString()
+    }
+    settings.classpath.value = cp
     val reporter = new CompilationResultReporter(settings)
 
     val compiler = new Global(settings, reporter)

Modified: myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/test/resources/webapp/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/test/resources/webapp/WEB-INF/web.xml?rev=1302908&r1=1302907&r2=1302908&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/test/resources/webapp/WEB-INF/web.xml (original)
+++ myfaces/extensions/scripting/trunk/extscript-core-root/extscript-core/src/test/resources/webapp/WEB-INF/web.xml Tue Mar 20 14:09:33 2012
@@ -122,20 +122,6 @@
         </param-value>
     </context-param>
 
-
-    <filter>
-        <filter-name>scriptingFilter</filter-name>
-        <filter-class>org.apache.myfaces.extensions.scripting.servlet.ScriptingServletFilter</filter-class>
-    </filter>
-    <filter-mapping>
-        <filter-name>scriptingFilter</filter-name>
-        <url-pattern>/*</url-pattern>
-        <dispatcher>REQUEST</dispatcher>
-        <dispatcher>FORWARD</dispatcher>
-        <dispatcher>INCLUDE</dispatcher>
-        <dispatcher>ERROR</dispatcher>
-    </filter-mapping>
-
     <!-- Listener, to allow Jetty serving MyFaces apps -->
     <listener>
         <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>

Added: myfaces/extensions/scripting/trunk/extscript-examples/blog-example/src/main/webapp/WEB-INF/scala/scalaBlog/TestBean.scala
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-examples/blog-example/src/main/webapp/WEB-INF/scala/scalaBlog/TestBean.scala?rev=1302908&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-examples/blog-example/src/main/webapp/WEB-INF/scala/scalaBlog/TestBean.scala (added)
+++ myfaces/extensions/scripting/trunk/extscript-examples/blog-example/src/main/webapp/WEB-INF/scala/scalaBlog/TestBean.scala Tue Mar 20 14:09:33 2012
@@ -0,0 +1,11 @@
+package scalaBlog
+
+import beans.BeanProperty
+import javax.faces.bean.{ApplicationScoped, ManagedBean}
+
+@ManagedBean(name="scalaTestBean")
+@ApplicationScoped
+class TestBean {
+   @BeanProperty
+   var title = "A Simple Blogging Example"
+}
\ No newline at end of file

Modified: myfaces/extensions/scripting/trunk/extscript-examples/blog-example/src/main/webapp/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-examples/blog-example/src/main/webapp/WEB-INF/web.xml?rev=1302908&r1=1302907&r2=1302908&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-examples/blog-example/src/main/webapp/WEB-INF/web.xml (original)
+++ myfaces/extensions/scripting/trunk/extscript-examples/blog-example/src/main/webapp/WEB-INF/web.xml Tue Mar 20 14:09:33 2012
@@ -19,9 +19,9 @@
  * under the License.
 -->
 <web-app xmlns="http://java.sun.com/xml/ns/javaee"
-      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
-      version="3.0">
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
+         version="3.0">
 
     <description>Webproject.xml</description>
 
@@ -51,6 +51,16 @@
         </param-value>
     </context-param>
 
+    <context-param>
+        <description>Additional comma separated loader paths to allow direct editing on the sources directory instead
+            of the deployment dir
+        </description>
+        <param-name>org.apache.myfaces.extensions.scripting.scala.LOADER_PATHS</param-name>
+        <param-value>
+            /Users/werpu2/development/workspace/extscript_trunk/extscript-examples/blog-example/src/main/webapp/WEB-INF/scala
+        </param-value>
+    </context-param>
+
 
     <context-param>
         <description>Additional comma separated loader paths to allow direct editing on the sources directory instead

Modified: myfaces/extensions/scripting/trunk/extscript-examples/blog-example/src/main/webapp/blog.xhtml
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-examples/blog-example/src/main/webapp/blog.xhtml?rev=1302908&r1=1302907&r2=1302908&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-examples/blog-example/src/main/webapp/blog.xhtml (original)
+++ myfaces/extensions/scripting/trunk/extscript-examples/blog-example/src/main/webapp/blog.xhtml Tue Mar 20 14:09:33 2012
@@ -36,6 +36,7 @@
         </h1>
 
         <h:panelGroup styleClass="stdBoxBig" style="color:black;">
+            <h1>#{scalaTestBean.title}</h1>
             <h2>In this example you can blog simply by entering text in the fields below and send submit</h2>
 
             <p>You can change the blogging artifacts on the fly, all the sources can be found under

Modified: myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/src/main/conf/dev/web.xml
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/src/main/conf/dev/web.xml?rev=1302908&r1=1302907&r2=1302908&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/src/main/conf/dev/web.xml (original)
+++ myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-example/src/main/conf/dev/web.xml Tue Mar 20 14:09:33 2012
@@ -128,18 +128,6 @@
     </context-param>
 
 
-    <filter>
-        <filter-name>scriptingFilter</filter-name>
-        <filter-class>org.apache.myfaces.extensions.scripting.servlet.ScriptingServletFilter</filter-class>
-    </filter>
-    <filter-mapping>
-        <filter-name>scriptingFilter</filter-name>
-        <url-pattern>/*</url-pattern>
-        <dispatcher>REQUEST</dispatcher>
-        <dispatcher>FORWARD</dispatcher>
-        <dispatcher>INCLUDE</dispatcher>
-        <dispatcher>ERROR</dispatcher>
-    </filter-mapping>
 
     <!-- Listener, to allow Jetty serving MyFaces apps -->
     <listener>

Modified: myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-extscript-helloworld/src/main/webapp/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-extscript-helloworld/src/main/webapp/WEB-INF/web.xml?rev=1302908&r1=1302907&r2=1302908&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-extscript-helloworld/src/main/webapp/WEB-INF/web.xml (original)
+++ myfaces/extensions/scripting/trunk/extscript-examples/myfaces20-extscript-helloworld/src/main/webapp/WEB-INF/web.xml Tue Mar 20 14:09:33 2012
@@ -130,18 +130,6 @@
     Note, this servlet filter is vital without it Ext-Scripting will not work,
     if you do not set it you will get an appropriate warning in the command line
     -->
-    <filter>
-        <filter-name>scriptingFilter</filter-name>
-        <filter-class>org.apache.myfaces.extensions.scripting.servlet.ScriptingServletFilter</filter-class>
-    </filter>
-    <filter-mapping>
-        <filter-name>scriptingFilter</filter-name>
-        <url-pattern>/*</url-pattern>
-        <dispatcher>REQUEST</dispatcher>
-        <dispatcher>FORWARD</dispatcher>
-        <dispatcher>INCLUDE</dispatcher>
-        <dispatcher>ERROR</dispatcher>
-    </filter-mapping>
 
     <!-- Listener, to allow Jetty serving MyFaces apps -->
     <listener>