diff --git a/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/core/common/util/FileUtils.java b/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/core/common/util/FileUtils.java
index 2030cdc..5894256 100644
--- a/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/core/common/util/FileUtils.java
+++ b/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/core/common/util/FileUtils.java
@@ -76,10 +76,10 @@
         File tempDir;
 
         String baseTempPath = System.getProperty("java.io.tmpdir");
-        String tempDirName = "myfaces_compilation_" + _tempMarker;
+        String tempDirName = "myfaces_compilation_"; //+ _tempMarker;
 
         tempDir = new File(baseTempPath + File.separator + tempDirName);
-        while (tempDir.exists()) {
+        /*while (tempDir.exists()) {
             tempDirName = "myfaces_compilation_" + System.currentTimeMillis() + Math.random();
             tempDir = new File(baseTempPath + File.separator + tempDirName);
         }
@@ -91,7 +91,7 @@
             if (tempDir.mkdirs()) {
                 tempDir.deleteOnExit();
             }
-        }
+        } */
         return tempDir;
     }
 
diff --git a/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/core/context/Configuration.java b/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/core/context/Configuration.java
index 5eeed5f..b1d46bc 100644
--- a/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/core/context/Configuration.java
+++ b/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/core/context/Configuration.java
@@ -182,7 +182,8 @@
      */
     public void addSourceDir(int scriptingEngine, String sourceDir)
     {
-        WeavingContext.getInstance().getEngine(scriptingEngine).getSourcePaths().add(sourceDir);
+        if(!WeavingContext.getInstance().getEngine(scriptingEngine).getSourcePaths().contains(sourceDir))
+            WeavingContext.getInstance().getEngine(scriptingEngine).getSourcePaths().add(sourceDir);
     }
 
 
diff --git a/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/core/reloading/GlobalReloadingStrategy.java b/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/core/reloading/GlobalReloadingStrategy.java
index 12e1d61..9c0c42b 100644
--- a/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/core/reloading/GlobalReloadingStrategy.java
+++ b/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/core/reloading/GlobalReloadingStrategy.java
@@ -41,6 +41,7 @@
 public class GlobalReloadingStrategy implements ReloadingStrategy
 {
 
+    private static final String STRATEGY_PKG = "rewrite.org.apache.myfaces.extensions.scripting.jsf.facelet";
     final Logger _logger = Logger.getLogger(GlobalReloadingStrategy.class.getName());
 
     protected ReloadingStrategy _beanStrategy;
@@ -62,14 +63,10 @@
         /*
          * external handlers coming from various submodules
          */
-        // _componentHandlerStrategy = dynaload("org.apache.myfaces.extensions.scripting.facelet" +
-        //          ".ComponentHandlerReloadingStrategy");
-        //  _validatorHandlerStrategy = dynaload("org.apache.myfaces.extensions.scripting.facelet" +
-        //          ".ValidatorHandlerReloadingStrategy");
-        //  _converterHandlerStrategy = dynaload("org.apache.myfaces.extensions.scripting.facelet" +
-        //          ".ConverterHandlerReloadingStrategy");
-        //  _behaviorHandlerStrategy = dynaload("org.apache.myfaces.extensions.scripting.facelet" +
-        //          ".BehaviorHandlerReloadingStrategy");
+        _componentHandlerStrategy = dynaload(STRATEGY_PKG +".ComponentHandlerReloadingStrategy");
+        _validatorHandlerStrategy = dynaload(STRATEGY_PKG +".ValidatorHandlerReloadingStrategy");
+        _converterHandlerStrategy = dynaload(STRATEGY_PKG +".ConverterHandlerReloadingStrategy");
+        _behaviorHandlerStrategy = dynaload(STRATEGY_PKG +".BehaviorHandlerReloadingStrategy");
     }
 
     /**
@@ -99,14 +96,14 @@
             case ARTIFACT_TYPE_VALIDATOR:
                 return _noMappingStrategy.reload(toReload, artifactType);
 
-            //    case ARTIFACT_TYPE_COMPONENT_HANDLER:
-            //        return dynaReload(toReload, _componentHandlerStrategy, artifactType);
-            //    case ARTIFACT_TYPE_CONVERTER_HANDLER:
-            //        return dynaReload(toReload, _converterHandlerStrategy, artifactType);
-            //    case ARTIFACT_TYPE_VALIDATOR_HANDLER:
-            //        return dynaReload(toReload, _validatorHandlerStrategy, artifactType);
-            //    case ARTIFACT_TYPE_BEHAVIOR_HANDLER:
-            //        return dynaReload(toReload, _behaviorHandlerStrategy, artifactType);
+            case ARTIFACT_TYPE_COMPONENT_HANDLER:
+                return dynaReload(toReload, _componentHandlerStrategy, artifactType);
+            case ARTIFACT_TYPE_CONVERTER_HANDLER:
+                return dynaReload(toReload, _converterHandlerStrategy, artifactType);
+            case ARTIFACT_TYPE_VALIDATOR_HANDLER:
+                return dynaReload(toReload, _validatorHandlerStrategy, artifactType);
+            case ARTIFACT_TYPE_BEHAVIOR_HANDLER:
+                return dynaReload(toReload, _behaviorHandlerStrategy, artifactType);
 
             default:
                 return _allOthers.reload(toReload, artifactType);
diff --git a/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/jsf/facelet/BehaviorHandlerReloadingStrategy.java b/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/jsf/reloading/BehaviorHandlerReloadingStrategy.java
similarity index 97%
rename from extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/jsf/facelet/BehaviorHandlerReloadingStrategy.java
rename to extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/jsf/reloading/BehaviorHandlerReloadingStrategy.java
index da2c571..e2b9323 100644
--- a/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/jsf/facelet/BehaviorHandlerReloadingStrategy.java
+++ b/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/jsf/reloading/BehaviorHandlerReloadingStrategy.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package rewrite.org.apache.myfaces.extensions.scripting.jsf.facelet;
+package rewrite.org.apache.myfaces.extensions.scripting.jsf.reloading;
 
 
 import rewrite.org.apache.myfaces.extensions.scripting.core.common.util.Cast;
diff --git a/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/jsf/facelet/ComponentHandlerReloadingStrategy.java b/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/jsf/reloading/ComponentHandlerReloadingStrategy.java
similarity index 96%
rename from extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/jsf/facelet/ComponentHandlerReloadingStrategy.java
rename to extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/jsf/reloading/ComponentHandlerReloadingStrategy.java
index 01c4370..d8f6bb1 100644
--- a/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/jsf/facelet/ComponentHandlerReloadingStrategy.java
+++ b/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/jsf/reloading/ComponentHandlerReloadingStrategy.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package rewrite.org.apache.myfaces.extensions.scripting.jsf.facelet;
+package rewrite.org.apache.myfaces.extensions.scripting.jsf.reloading;
 
 import rewrite.org.apache.myfaces.extensions.scripting.core.common.util.Cast;
 import rewrite.org.apache.myfaces.extensions.scripting.core.common.util.ReflectUtil;
diff --git a/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/jsf/facelet/ConverterHandlerReloadingStrategy.java b/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/jsf/reloading/ConverterHandlerReloadingStrategy.java
similarity index 97%
rename from extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/jsf/facelet/ConverterHandlerReloadingStrategy.java
rename to extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/jsf/reloading/ConverterHandlerReloadingStrategy.java
index bcaa740..7d887c8 100644
--- a/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/jsf/facelet/ConverterHandlerReloadingStrategy.java
+++ b/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/jsf/reloading/ConverterHandlerReloadingStrategy.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package rewrite.org.apache.myfaces.extensions.scripting.jsf.facelet;
+package rewrite.org.apache.myfaces.extensions.scripting.jsf.reloading;
 
 import rewrite.org.apache.myfaces.extensions.scripting.core.common.util.Cast;
 import rewrite.org.apache.myfaces.extensions.scripting.core.common.util.ReflectUtil;
diff --git a/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/jsf/facelet/ValidatorHandlerReloadingStrategy.java b/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/jsf/reloading/ValidatorHandlerReloadingStrategy.java
similarity index 96%
rename from extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/jsf/facelet/ValidatorHandlerReloadingStrategy.java
rename to extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/jsf/reloading/ValidatorHandlerReloadingStrategy.java
index 153eaf9..ec55f6c 100644
--- a/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/jsf/facelet/ValidatorHandlerReloadingStrategy.java
+++ b/extscript-core-root/extscript-core/src/main/java/rewrite/org/apache/myfaces/extensions/scripting/jsf/reloading/ValidatorHandlerReloadingStrategy.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package rewrite.org.apache.myfaces.extensions.scripting.jsf.facelet;
+package rewrite.org.apache.myfaces.extensions.scripting.jsf.reloading;
 
 
 import rewrite.org.apache.myfaces.extensions.scripting.core.common.util.Cast;
diff --git a/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/engine/compiler/JavaCompilerTest.java b/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/engine/compiler/JavaCompilerTest.java
index 4cbf7a1..90d6d31 100644
--- a/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/engine/compiler/JavaCompilerTest.java
+++ b/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/engine/compiler/JavaCompilerTest.java
@@ -50,7 +50,6 @@
     File probe2;
     File root;
 
-    JSR199Compiler compiler = new JSR199Compiler();
     private static final String RESULT_HAS_NO_ERRORS = "result has no errors";
     private static final String TARGET_DIR_EXISTS = "targetDir exists files are compiled into the targetDir";
     private static final String CLASSFILE1_IS_COMPILED = "Classfile1 is compiled into the targetDir";
@@ -88,11 +87,14 @@
         WeavingContext.getInstance().setConfiguration(new Configuration());
         WeavingContext.getInstance().getConfiguration().addSourceDir(ScriptingConst.ENGINE_TYPE_JSF_JAVA,
                 root.getAbsolutePath());
+
     }
 
     @Test
     public void testFullCompileWhitelist()
     {
+        JSR199Compiler compiler = new JSR199Compiler();
+
         File targetDir = null;
 
         File target = WeavingContext.getInstance().getConfiguration().getCompileTarget();
@@ -122,16 +124,19 @@
         assertTrue(CLASSFILE1_IS_COMPILED1, !classFile1.exists());
         assertTrue(CLASSFILE2_IS_COMPILED, !classFile2.exists());
         assertTrue(CLASSFILE2_IS_COMPILED, classFile3.exists());
-
+        WeavingContext.getInstance().getConfiguration().getCompileTarget().delete();
+        WeavingContext.getInstance().getConfiguration().getCompileTarget().mkdirs();
     }
 
     @Test
     public void testFullCompile()
     {
+        JSR199Compiler compiler = new JSR199Compiler();
         File targetDir = null;
 
         File target = FileUtils.getTempDir();
         ClassLoader loader = Thread.currentThread().getContextClassLoader();
+
         target.mkdirs();
         target.deleteOnExit();
 
@@ -153,7 +158,9 @@
 
         assertTrue(CLASSFILE1_IS_COMPILED1, classFile1.exists());
         assertTrue(CLASSFILE2_IS_COMPILED, classFile2.exists());
-
+        //WeavingContext.getInstance().getConfiguration().getCompileTarget().delete();
+        //WeavingContext.getInstance().getConfiguration().getCompileTarget().mkdirs();
+        //testFullCompileWhitelist();
     }
 
 }
diff --git a/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/probes/MethodReloadingProbe.java b/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/probes/MethodReloadingProbe.java
new file mode 100644
index 0000000..558420b
--- /dev/null
+++ b/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/probes/MethodReloadingProbe.java
@@ -0,0 +1,21 @@
+package rewrite.org.apache.myfaces.extensions.scripting.scanningcore.probes;
+
+/**
+ * Interface which will allow the proxying of our probe
+ * in reloading handlers
+ *
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ */
+public interface MethodReloadingProbe {
+
+    /**
+     * testmethod 1 goes through
+     */
+    public void testMethod1();
+
+    /**
+     * this one throws an exception
+     */
+    public void testMethod2();
+}
diff --git a/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/probes/Probe.java b/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/probes/Probe.java
new file mode 100644
index 0000000..a7d7857
--- /dev/null
+++ b/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/probes/Probe.java
@@ -0,0 +1,57 @@
+/*
+ * 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 rewrite.org.apache.myfaces.extensions.scripting.scanningcore.probes;
+
+import org.junit.Ignore;
+
+/**
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ *          <p/>
+ *          testprobe for our reflectutils
+ */
+
+@Ignore
+public class Probe implements MethodReloadingProbe
+{
+
+    public Probe() {
+    }
+
+    public Probe(String hello, String world) {
+        
+    }
+
+    public void testMethod1() {
+
+    }
+
+    public void testMethod2() {
+        throw new NullPointerException("for test");
+    }
+
+    public boolean testMethod3(String param1) {
+        return true;
+    }
+
+    public static boolean testMethod4(String param1, String param2) {
+        return true;
+    }
+
+}
diff --git a/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/probes/Probe2.java b/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/probes/Probe2.java
new file mode 100644
index 0000000..b282abe
--- /dev/null
+++ b/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/probes/Probe2.java
@@ -0,0 +1,36 @@
+/*
+ * 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 rewrite.org.apache.myfaces.extensions.scripting.scanningcore.probes;
+
+/**
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ */
+
+public class Probe2 {
+
+    public Probe2(String[] test) {
+
+    }
+
+    public static Boolean myHello(String xxx) {
+        return Boolean.TRUE;
+    }
+}
diff --git a/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/utilstest/FileUtilsTest.java b/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/utilstest/FileUtilsTest.java
new file mode 100644
index 0000000..f05797d
--- /dev/null
+++ b/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/utilstest/FileUtilsTest.java
@@ -0,0 +1,98 @@
+/*
+ * 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 rewrite.org.apache.myfaces.extensions.scripting.scanningcore.utilstest;
+
+import org.junit.Before;
+import org.junit.Test;
+import rewrite.org.apache.myfaces.extensions.scripting.core.common.util.FileUtils;
+import rewrite.org.apache.myfaces.extensions.scripting.scanningcore.support.PathUtils;
+
+import java.io.File;
+import java.util.List;
+
+import static junit.framework.Assert.fail;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Test cases for our FileUtils
+ *
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ */
+
+public class FileUtilsTest {
+    PathUtils pathUtils = new PathUtils();
+
+    @Before
+    public void init() {
+
+    }
+
+    @Test
+    public void testForRegexp() {
+        String fileSep = FileUtils.getFileSeparatorForRegex();
+        assertTrue("must be double backslash instead of single one", (File.separator.equals("\\")) ? fileSep.equals("\\\\") : fileSep.equals(File.separator));
+    }
+
+    @Test
+    public void testGetFileSeparator() {
+        String fileSeparator = FileUtils.getFileSeparator();
+        assertTrue(fileSeparator.equals(File.separator));
+    }
+
+    @Test
+    public void testGetTempDir() {
+        File tempDir = FileUtils.getTempDir();
+        assertTrue(tempDir != null);
+        assertTrue(tempDir.exists());
+    }
+
+    @Test
+    public void testFileStrategy() {
+        List<File> sourceFiles = FileUtils.fetchSourceFiles(new File(pathUtils.getResource("compiler/")), ".java");
+        assertTrue("wildcarding is needed", sourceFiles.size() == 0);
+
+        sourceFiles = FileUtils.fetchSourceFiles(new File(pathUtils.getResource("compiler/")), "java");
+         assertTrue("wildcarding is needed", sourceFiles.size() == 0);
+
+
+        sourceFiles = FileUtils.fetchSourceFiles(new File(pathUtils.getResource("compiler/")), "*.java");
+        assertTrue("source files must have been found", sourceFiles.size() > 2);
+        //check also for subdirs
+        for(File sourceFile: sourceFiles) {
+            if(sourceFile.getAbsolutePath().contains("myPackage")) {
+                return;
+            }
+        }
+        fail("source file must also be in myPackage");
+    }
+
+    @Test
+    public void testDirStrategy() {
+        StringBuilder result = FileUtils.fetchSourcePaths(new File(pathUtils.getResource("compilerx/")), "");
+        assertTrue("invalid dir should result in empty results", result.toString().trim().length() == 0); 
+
+        result = FileUtils.fetchSourcePaths(new File(pathUtils.getResource("compiler/")), "");
+        assertTrue("myPackage should be found", result.toString().trim().contains("myPackage"));
+
+
+    }
+
+}
diff --git a/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/utilstest/ReflectUtilTest.java b/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/utilstest/ReflectUtilTest.java
new file mode 100644
index 0000000..b4e32d2
--- /dev/null
+++ b/extscript-core-root/extscript-core/src/test/java/rewrite/org/apache/myfaces/extensions/scripting/scanningcore/utilstest/ReflectUtilTest.java
@@ -0,0 +1,165 @@
+/*
+ * 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 rewrite.org.apache.myfaces.extensions.scripting.scanningcore.utilstest;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import rewrite.org.apache.myfaces.extensions.scripting.core.common.util.Cast;
+import rewrite.org.apache.myfaces.extensions.scripting.core.common.util.Null;
+import rewrite.org.apache.myfaces.extensions.scripting.core.common.util.ReflectUtil;
+import rewrite.org.apache.myfaces.extensions.scripting.scanningcore.probes.Probe;
+
+import java.lang.reflect.Method;
+import java.util.Collection;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+/**
+ * Testcase for our reflect utils
+ * which we rely heavily upon
+ *
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ */
+
+public class ReflectUtilTest {
+    private static final String HELLO_WORLD = "Hello World";
+    private static final String JAVA_LANG_STRING = "java.lang.String";
+    private static final String MSG_INSTANTIATED = "String must be instantiated";
+    private static final String MSG_PROBE_INSTANTIATED = "Probe must be instantiated";
+    private static final String MSG_INIT_FAIL = "init failed expected";
+
+    @Before
+    public void setUp() throws Exception {
+    }
+
+    @After
+    public void tearDown() throws Exception {
+    }
+
+    @Test
+    public void testInstantiate() throws Exception {
+        String retVal = (String) ReflectUtil.instantiate(JAVA_LANG_STRING);
+        assertTrue(MSG_INSTANTIATED, retVal != null);
+
+        retVal = (String) ReflectUtil.instantiate(JAVA_LANG_STRING, HELLO_WORLD);
+        assertTrue(MSG_INSTANTIATED, retVal != null && retVal.equals(HELLO_WORLD));
+
+        Object myHello = HELLO_WORLD;
+        Object probe = ReflectUtil.instantiate(Probe.class, new Cast(String.class, myHello), HELLO_WORLD);
+        assertTrue(MSG_PROBE_INSTANTIATED, probe != null);
+
+        try {
+            ReflectUtil.instantiate(Probe.class, new Cast(Integer.class, myHello), HELLO_WORLD);
+            fail();
+        } catch (RuntimeException ex) {
+            assertTrue(MSG_INIT_FAIL, true);
+        }
+        probe = ReflectUtil.instantiate(Probe.class, new Null(String.class), new Null(String.class));
+        assertTrue(MSG_PROBE_INSTANTIATED, probe != null);
+
+        try {
+            ReflectUtil.instantiate(Probe.class, new Null(Integer.class), new Null(String.class));
+            fail();
+        } catch (RuntimeException ex) {
+            assertTrue(MSG_INIT_FAIL, true);
+        }
+
+        //TODO (1.1) test fails, but is not used so we can live with it  
+        //probe = ReflectUtil.instantiate(Probe2.class,new Array(String.class, HELLO_WORLD, HELLO_WORLD));
+        //assertTrue("Probe must be instantiated", probe != null);
+    }
+
+    @Test
+    public void testNewObject() throws Exception {
+        String retVal = (String) ReflectUtil.newObject(String.class);
+        assertTrue(MSG_INSTANTIATED, retVal != null);
+    }
+
+    @Test
+    public void testExecuteStaticMethod() throws Exception {
+        Boolean retVal = (Boolean) ReflectUtil.executeStaticMethod(Boolean.class, "valueOf", "true");
+        assertTrue("retval must be true", retVal);
+
+        try {
+            ReflectUtil.executeStaticMethod(Boolean.class, "xx_valueOf", "true");
+            fail();
+        } catch (RuntimeException ex) {
+            assertTrue("Exception must be thrown", true);
+        }
+
+    }
+
+    @Test
+    public void testFastExecuteStaticMethod() throws Exception {
+        Boolean retVal = (Boolean) ReflectUtil.fastExecuteStaticMethod(Boolean.class, "valueOf", "true");
+        assertTrue("retval must be true", retVal);
+    }
+
+    @Test
+    public void testGetAllMethods() throws Exception {
+        Collection<Method> retVal = ReflectUtil.getAllMethods(Boolean.class, "valueOf", 1);
+        assertTrue(retVal.size() == 2);/*String and boolean*/
+        retVal = ReflectUtil.getAllMethods(Object.class, "toString", 0);
+        assertTrue(retVal.size() == 1);/*String and boolean*/
+    }
+
+    @Test
+    public void testExecuteMethod() throws Exception {
+
+        Boolean probe = true;
+        Boolean retVal = (Boolean) ReflectUtil.executeMethod(probe, "valueOf", "true");
+        assertTrue(retVal);
+        String sRetVal = (String) ReflectUtil.executeMethod(probe, "toString");
+        assertTrue(sRetVal.equals("true"));
+
+        Object hashVal = ReflectUtil.executeMethod(new Probe(), "hashCode");
+        assertTrue(hashVal != null);
+
+        try {
+            ReflectUtil.executeMethod(new Probe(), "xx_hashCode");
+            fail();
+        } catch (RuntimeException ex) {
+            assertTrue("calling must faile with an RE", true);
+        }
+    }
+
+    @Test
+    public void testFastExecuteMethod() throws Exception {
+
+        Boolean probe = true;
+        Boolean retVal = (Boolean) ReflectUtil.fastExecuteMethod(probe, "valueOf", "true");
+        assertTrue(retVal);
+        String sRetVal = (String) ReflectUtil.fastExecuteMethod(probe, "toString");
+        assertTrue(sRetVal.equals("true"));
+
+        Object hashVal = ReflectUtil.fastExecuteMethod(new Probe(), "hashCode");
+        assertTrue(hashVal != null);
+
+    }
+
+    @Test
+    public void testCast() {
+        assertTrue("Cast testing", ReflectUtil.cast(String.class, HELLO_WORLD) instanceof Cast);
+        assertTrue("Cast testing", ReflectUtil.nullCast(String.class) instanceof Null);
+    }
+}
