EXTSCRIPT-159: Add scala language support if possible: scala support now working
git-svn-id: https://svn.apache.org/repos/asf/myfaces/extensions/scripting/trunk@1302908 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/common/util/FileUtils.java b/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/common/util/FileUtils.java
index 0a7d6db..aefd06e 100644
--- a/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/common/util/FileUtils.java
+++ b/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/common/util/FileUtils.java
@@ -156,6 +156,7 @@
return strategy.getFoundFiles();
}
+
/**
* fetches the source files from a list of source paths
*
diff --git a/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/engine/EngineScala.java b/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/engine/EngineScala.java
index 042b18c..8009366 100644
--- a/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/engine/EngineScala.java
+++ b/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/engine/EngineScala.java
@@ -27,6 +27,7 @@
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 @@
{
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)
{
diff --git a/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/engine/FactoryEngines.java b/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/engine/FactoryEngines.java
index 4ab63eb..69b6243 100644
--- a/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/engine/FactoryEngines.java
+++ b/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/engine/FactoryEngines.java
@@ -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 @@
{
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);
+ if (groovyEngine != null)
+ _engines.put(groovyEngine.getEngineType(), groovyEngine);
+ if (scalaEngine != null)
+ _engines.put(scalaEngine.getEngineType(), scalaEngine);
+
_engines.put(javaEngine.getEngineType(), javaEngine);
-
- _engineOrder.add(javaEngine);
- _engineOrder.add(groovyEngine);
}
}
- /**
- * 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)
diff --git a/extscript-core-root/extscript-core/src/main/scala/org/apache/myfaces/extensions/scripting/core/engine/compiler/ScalaCompiler.scala b/extscript-core-root/extscript-core/src/main/scala/org/apache/myfaces/extensions/scripting/core/engine/compiler/ScalaCompiler.scala
index e34dd60..4915b53 100644
--- a/extscript-core-root/extscript-core/src/main/scala/org/apache/myfaces/extensions/scripting/core/engine/compiler/ScalaCompiler.scala
+++ b/extscript-core-root/extscript-core/src/main/scala/org/apache/myfaces/extensions/scripting/core/engine/compiler/ScalaCompiler.scala
@@ -21,9 +21,9 @@
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 @@
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)
diff --git a/extscript-core-root/extscript-core/src/test/resources/webapp/WEB-INF/web.xml b/extscript-core-root/extscript-core/src/test/resources/webapp/WEB-INF/web.xml
index 125ef78..3a81477 100644
--- a/extscript-core-root/extscript-core/src/test/resources/webapp/WEB-INF/web.xml
+++ b/extscript-core-root/extscript-core/src/test/resources/webapp/WEB-INF/web.xml
@@ -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>
diff --git a/extscript-examples/blog-example/src/main/webapp/WEB-INF/scala/scalaBlog/TestBean.scala b/extscript-examples/blog-example/src/main/webapp/WEB-INF/scala/scalaBlog/TestBean.scala
new file mode 100644
index 0000000..bdbd51a
--- /dev/null
+++ b/extscript-examples/blog-example/src/main/webapp/WEB-INF/scala/scalaBlog/TestBean.scala
@@ -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
diff --git a/extscript-examples/blog-example/src/main/webapp/WEB-INF/web.xml b/extscript-examples/blog-example/src/main/webapp/WEB-INF/web.xml
index dcff47b..74337ef 100644
--- a/extscript-examples/blog-example/src/main/webapp/WEB-INF/web.xml
+++ b/extscript-examples/blog-example/src/main/webapp/WEB-INF/web.xml
@@ -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
diff --git a/extscript-examples/blog-example/src/main/webapp/blog.xhtml b/extscript-examples/blog-example/src/main/webapp/blog.xhtml
index a4d328d..3ec2548 100644
--- a/extscript-examples/blog-example/src/main/webapp/blog.xhtml
+++ b/extscript-examples/blog-example/src/main/webapp/blog.xhtml
@@ -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
diff --git a/extscript-examples/myfaces20-example/src/main/conf/dev/web.xml b/extscript-examples/myfaces20-example/src/main/conf/dev/web.xml
index 85b4f2f..62a6094 100644
--- a/extscript-examples/myfaces20-example/src/main/conf/dev/web.xml
+++ b/extscript-examples/myfaces20-example/src/main/conf/dev/web.xml
@@ -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>
diff --git a/extscript-examples/myfaces20-extscript-helloworld/src/main/webapp/WEB-INF/web.xml b/extscript-examples/myfaces20-extscript-helloworld/src/main/webapp/WEB-INF/web.xml
index 7111445..40e5079 100644
--- a/extscript-examples/myfaces20-extscript-helloworld/src/main/webapp/WEB-INF/web.xml
+++ b/extscript-examples/myfaces20-extscript-helloworld/src/main/webapp/WEB-INF/web.xml
@@ -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>