EXTSCRIPT-159: Add scala language support if possible
git-svn-id: https://svn.apache.org/repos/asf/myfaces/extensions/scripting/trunk@1302843 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/api/ScriptingConst.java b/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/api/ScriptingConst.java
index 4331ba5..73433a9 100644
--- a/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/api/ScriptingConst.java
+++ b/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/api/ScriptingConst.java
@@ -37,6 +37,9 @@
public static final String INIT_PARAM_SCRIPTING_ADDITIONAL_CLASSPATH = "org.apache.myfaces.extensions.scripting.ADDITIONAL_CLASSPATH";
public static final String INIT_PARAM_RESOURCE_PATH = "org.apache.myfaces.extensions.scripting.resources.LOADER_PATHS";
public static final String INIT_PARAM_CUSTOM_GROOVY_LOADER_PATHS = "org.apache.myfaces.extensions.scripting.groovy.LOADER_PATHS";
+ public static final String INIT_PARAM_CUSTOM_SCALA_LOADER_PATHS = "org.apache.myfaces.extensions.scripting.scala" +
+ ".LOADER_PATHS";
+
public static final String INIT_PARAM_CUSTOM_JAVA_LOADER_PATHS = "org.apache.myfaces.extensions.scripting.java.LOADER_PATHS";
public static final String INIT_PARAM_INITIAL_COMPILE="org.apache.myfaces.extensions.scripting.INITIAL_COMPILE_AND_SCAN";
public static final String INIT_PARAM_MYFACES_PLUGIN = "org.apache.myfaces.FACES_INIT_PLUGINS";
@@ -54,6 +57,7 @@
public static final int ENGINE_TYPE_JSF_NO_ENGINE = -1;
public static final int ENGINE_TYPE_JSF_GROOVY = 0;
public static final int ENGINE_TYPE_JSF_JAVA = 1;
+ public static final int ENGINE_TYPE_JSF_SCALA = 2;
public static final int ARTIFACT_TYPE_UNKNOWN = -1;
public static final int ARTIFACT_TYPE_MANAGEDBEAN = 1;
public static final int ARTIFACT_TYPE_MANAGEDPROPERTY = 2;
@@ -95,12 +99,15 @@
public static final String FILE_EXTENSION_GROOVY = ".groovy";
public static final String GROOVY_FILE_ENDING = ".groovy";
public static final String JAVA_FILE_ENDING = ".java";
+ public static final String SCALA_FILE_ENDING = ".scala";
public static final String JSR199_COMPILER = "org.apache.myfaces.extensions.scripting.loaders.java.jsr199.JSR199Compiler";
public static final String JAVA5_COMPILER = "org.apache.myfaces.extensions.scripting.loaders.java.compiler.JavacCompiler";
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 SCALA_SOURCE_ROOT = "/WEB-INF/scala/";
+
public static final String JAVA_SOURCE_ROOT = "/WEB-INF/java/";
public static final String ERR_SERVLET_FILTER = "[EXT-SCRIPTING] The servlet filter has not been set, please check your web.xml for following entries:" +
"\n <filter>\n" +
diff --git a/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/engine/EngineJava.java b/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/engine/EngineJava.java
index a9dc958..e3a270c 100644
--- a/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/engine/EngineJava.java
+++ b/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/engine/EngineJava.java
@@ -111,8 +111,7 @@
@Override
public boolean isArtifactOfEngine(Object artifact)
{
- //TODO add other engines here
- return !(artifact instanceof GroovyObject);
+ return true;
}
@Override
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
new file mode 100644
index 0000000..042b18c
--- /dev/null
+++ b/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/engine/EngineScala.java
@@ -0,0 +1,130 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.myfaces.extensions.scripting.core.engine;
+
+import org.apache.commons.beanutils.BeanUtils;
+import org.apache.myfaces.extensions.scripting.core.api.Configuration;
+import org.apache.myfaces.extensions.scripting.core.api.ReloadingStrategy;
+import org.apache.myfaces.extensions.scripting.core.api.WeavingContext;
+import org.apache.myfaces.extensions.scripting.core.common.util.ClassUtils;
+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.reloading.SimpleReloadingStrategy;
+import scala.ScalaObject;
+
+import javax.servlet.ServletContext;
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Collection;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import static org.apache.myfaces.extensions.scripting.core.api.ScriptingConst.*;
+
+/**
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ */
+
+public class EngineScala extends BaseEngine implements ScriptingEngine
+{
+ Logger log = Logger.getLogger(this.getClass().getName());
+
+ @Override
+ public void init(ServletContext context)
+ {
+ initPaths(context, INIT_PARAM_CUSTOM_SCALA_LOADER_PATHS, SCALA_SOURCE_ROOT);
+ }
+
+ @Override
+ public int getEngineType()
+ {
+ return ENGINE_TYPE_JSF_SCALA;
+ }
+
+ public String getEngineTypeAsStr()
+ {
+ return "Scala";
+ }
+
+ @Override
+ public ReloadingStrategy getBasicReloadingStrategy()
+ {
+ return new SimpleReloadingStrategy();
+ }
+
+ @Override
+ public boolean isArtifactOfEngine(Object artifact)
+ {
+ return (artifact instanceof ScalaObject);
+ }
+
+ @Override
+ public void copyProperties(Object dest, Object src)
+ {
+ try
+ {
+ BeanUtils.copyProperties(dest, src);
+ }
+ catch (IllegalAccessException e)
+ {
+ log.log(Level.FINEST, e.toString());
+ //this is wanted
+ }
+ catch (InvocationTargetException e)
+ {
+ log.log(Level.FINEST, e.toString());
+ //this is wanted
+ }
+ }
+
+
+ @Override
+ public String getFileEnding()
+ {
+ return "scala";
+ }
+
+ @Override
+ //full compile
+ public CompilationResult compile()
+ {
+ WeavingContext context = WeavingContext.getInstance();
+ Configuration configuration = context.getConfiguration();
+ GroovyCompiler compiler = new GroovyCompiler();
+ File targetDir = configuration.getCompileTarget();
+ Collection<String> sourceDirs = configuration.getSourceDirs(ENGINE_TYPE_JSF_GROOVY);
+ CompilationResult res = null;
+ for (String sourceRoot : sourceDirs)
+ {
+ res = compiler.compile(new File(sourceRoot), targetDir, ClassUtils.getContextClassLoader());
+ }
+ return res;
+ }
+
+ public void scanDependencies()
+ {
+ log.info("[EXT-SCRIPTING] starting dependency scan");
+ GroovyDependencyScanner scanner = new GroovyDependencyScanner();
+ scanner.scanPaths();
+ log.info("[EXT-SCRIPTING] ending dependency scan");
+ }
+}
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 ce6eb3e..4ab63eb 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
@@ -27,10 +27,7 @@
import java.io.File;
import java.io.IOException;
import java.net.URL;
-import java.util.Collection;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.logging.Logger;
@@ -46,8 +43,8 @@
public class FactoryEngines
{
final Logger _log = Logger.getLogger(this.getClass().getName());
-
- Map<Integer, ScriptingEngine> _engines = new ConcurrentHashMap<Integer, ScriptingEngine>();
+ /*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>();
public void init() throws IOException
@@ -56,10 +53,16 @@
EngineJava javaEngine = new EngineJava();
EngineGroovy groovyEngine = new EngineGroovy();
+ EngineScala scalaEngine = new EngineScala();
if (_engines.isEmpty())
{
- _engines.put(javaEngine.getEngineType(), javaEngine);
+ //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);
+
_engineOrder.add(javaEngine);
_engineOrder.add(groovyEngine);
}
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 f90a192..42b9aef 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
@@ -27,7 +27,7 @@
targetPath.mkdirs();
val sourceFiles = FileUtils.fetchSourceFiles(sourcePath, "*.scala")
var sourceFileNames = List[String]()
- for (val sourceFile:File <- sourceFiles) {
+ for (sourceFile:File <- sourceFiles) {
sourceFileNames = sourceFileNames ::: List(sourceFile.getAbsolutePath())
}
diff --git a/extscript-core-root/extscript-core/src/test/resources/compiler/TestProbe1Scala.scala b/extscript-core-root/extscript-core/src/test/resources/compiler/TestProbe1Scala.scala
new file mode 100644
index 0000000..1a55bd0
--- /dev/null
+++ b/extscript-core-root/extscript-core/src/test/resources/compiler/TestProbe1Scala.scala
@@ -0,0 +1,12 @@
+package compiler
+
+/**
+ *
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ */
+
+class TestProbe1Scala
+{
+
+}
diff --git a/extscript-core-root/extscript-core/src/test/resources/compiler/TestProbe2Scala.scala b/extscript-core-root/extscript-core/src/test/resources/compiler/TestProbe2Scala.scala
new file mode 100644
index 0000000..d1e6205
--- /dev/null
+++ b/extscript-core-root/extscript-core/src/test/resources/compiler/TestProbe2Scala.scala
@@ -0,0 +1,12 @@
+package compiler
+
+/**
+ *
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ */
+
+class TestProbe2Scala
+{
+
+}
diff --git a/pom.xml b/pom.xml
index 16e107e..17dca98 100644
--- a/pom.xml
+++ b/pom.xml
@@ -31,7 +31,7 @@
<extval.version>2.0.5</extval.version>
<groovy.version>1.7.2</groovy.version>
<maven-scala-plugin.scalaVersion>2.15.2</maven-scala-plugin.scalaVersion>
- <scala-library.version>2.8.1</scala-library.version>
+ <scala-library.version>2.10.0-M2</scala-library.version>
</properties>