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>