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 2009/09/07 20:51:39 UTC

svn commit: r812255 - in /myfaces/extensions/scripting/trunk/core/src/main/java/org/apache/myfaces/scripting/loaders/java/jsr199: CompilerFacade.java ContainerFileManager.java RecompiledClassLoader.java ReflectCompilerFacade.java

Author: werpu
Date: Mon Sep  7 18:51:39 2009
New Revision: 812255

URL: http://svn.apache.org/viewvc?rev=812255&view=rev
Log:
https://issues.apache.org/jira/browse/EXTSCRIPT-11
removed splitted the file to get a better encapsulation of functionality next step will be 
to move the jci part into the reflection api to be able to go down to jdk5



Added:
    myfaces/extensions/scripting/trunk/core/src/main/java/org/apache/myfaces/scripting/loaders/java/jsr199/RecompiledClassLoader.java
    myfaces/extensions/scripting/trunk/core/src/main/java/org/apache/myfaces/scripting/loaders/java/jsr199/ReflectCompilerFacade.java
Modified:
    myfaces/extensions/scripting/trunk/core/src/main/java/org/apache/myfaces/scripting/loaders/java/jsr199/CompilerFacade.java
    myfaces/extensions/scripting/trunk/core/src/main/java/org/apache/myfaces/scripting/loaders/java/jsr199/ContainerFileManager.java

Modified: myfaces/extensions/scripting/trunk/core/src/main/java/org/apache/myfaces/scripting/loaders/java/jsr199/CompilerFacade.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/src/main/java/org/apache/myfaces/scripting/loaders/java/jsr199/CompilerFacade.java?rev=812255&r1=812254&r2=812255&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/src/main/java/org/apache/myfaces/scripting/loaders/java/jsr199/CompilerFacade.java (original)
+++ myfaces/extensions/scripting/trunk/core/src/main/java/org/apache/myfaces/scripting/loaders/java/jsr199/CompilerFacade.java Mon Sep  7 18:51:39 2009
@@ -24,7 +24,6 @@
 
 import javax.tools.*;
 import java.io.File;
-import java.io.FileInputStream;
 import java.util.Arrays;
 import java.util.Locale;
 
@@ -41,72 +40,15 @@
     JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
     DiagnosticCollector<JavaFileObject> diagnosticCollector = new DiagnosticCollector();
     ContainerFileManager fileManager = null;
-    private static File tempDir = null;
     private static final String FILE_SEPARATOR = File.separator;
 
     public CompilerFacade() {
         super();
-        fileManager = new ContainerFileManager(compiler.getStandardFileManager(diagnosticCollector, null, null));
 
-        if (tempDir == null) {
-            synchronized (this.getClass()) {
-                if (tempDir != null) {
-                    return;
-                }
-                String baseTempPath = System.getProperty("java.io.tmpdir");
-                String tempDirName = "myfaces_compilation_" + Math.random();
-
-                tempDir = new File(baseTempPath + FILE_SEPARATOR + tempDirName);
-                while (tempDir.exists()) {
-                    tempDirName = "myfaces_compilation_" + System.currentTimeMillis() + Math.random();
-                    tempDir = new File(baseTempPath + FILE_SEPARATOR + tempDirName);
-                }
-                tempDir.mkdirs();
-                tempDir.deleteOnExit();
-            }
-        }
-    }
-
-
-    class RecompiledJavaClassloader extends ClassLoader {
-        RecompiledJavaClassloader(ClassLoader classLoader) {
-            super(classLoader);
-        }
-
-        RecompiledJavaClassloader() {
-        }
-
-        @Override
-        public Class<?> loadClass(String className) throws ClassNotFoundException {
-            //check if our class exists in the tempDir
-            String classFile = className.replaceAll("\\.", FILE_SEPARATOR) + ".class";
-            File target = new File(tempDir.getAbsolutePath() + FILE_SEPARATOR + classFile);
-            if (target.exists()) {
-
-                FileInputStream iStream = null;
-                int fileLength = (int) target.length();
-                byte[] fileContent = new byte[fileLength];
-
-                try {
-                    iStream = new FileInputStream(target);
-                    iStream.read(fileContent);
-                    // Erzeugt aus dem byte Feld ein Class Object.
-                    return super.defineClass(className, fileContent, 0, fileLength);
-
-                } catch (Exception e) {
-                    throw new ClassNotFoundException(e.toString());
-                } finally {
-                    if (iStream != null) {
-                        try {
-                            iStream.close();
-                        } catch (Exception e) {
-                        }
-                    }
-                }
-            }
+        //TODO move this all into the introspection domain
+        //so that we can shift to jdk5
+        fileManager = new ContainerFileManager(compiler.getStandardFileManager(diagnosticCollector, null, null));
 
-            return super.loadClass(className);    //To change body of overridden methods use File | Settings | File Templates.
-        }
     }
 
 
@@ -115,7 +57,7 @@
 
         //TODO add the core jar from our lib dir
         //the compiler otherwise cannot find the file
-        String[] options = new String[]{"-cp", fileManager.getClassPath(), "-d", tempDir.getAbsolutePath(), "-sourcepath", sourceRoot, "-g"};
+        String[] options = new String[]{"-cp", fileManager.getClassPath(), "-d", fileManager.getTempDir().getAbsolutePath(), "-sourcepath", sourceRoot, "-g"};
         compiler.getTask(null, fileManager, diagnosticCollector, Arrays.asList(options), null, fileObjects).call();
         //TODO collect the diagnostics and if an error was issued dump it on the log
         //and throw an unmanaged exeption which routes later on into myfaces
@@ -135,9 +77,9 @@
         }
 
         ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader();
-        if (!(oldClassLoader instanceof RecompiledJavaClassloader)) {
+        if (!(oldClassLoader instanceof RecompiledClassLoader)) {
             try {
-                RecompiledJavaClassloader classLoader = new RecompiledJavaClassloader(oldClassLoader);
+                RecompiledClassLoader classLoader = (RecompiledClassLoader) fileManager.getClassLoader(null);
                 Thread.currentThread().setContextClassLoader(classLoader);
                 String classFile = filePath.replaceAll("\\\\", ".").replaceAll("\\/", ".");
                 classFile = classFile.substring(0, classFile.lastIndexOf("."));

Modified: myfaces/extensions/scripting/trunk/core/src/main/java/org/apache/myfaces/scripting/loaders/java/jsr199/ContainerFileManager.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/src/main/java/org/apache/myfaces/scripting/loaders/java/jsr199/ContainerFileManager.java?rev=812255&r1=812254&r2=812255&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/src/main/java/org/apache/myfaces/scripting/loaders/java/jsr199/ContainerFileManager.java (original)
+++ myfaces/extensions/scripting/trunk/core/src/main/java/org/apache/myfaces/scripting/loaders/java/jsr199/ContainerFileManager.java Mon Sep  7 18:51:39 2009
@@ -24,6 +24,7 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.ArrayList;
+import java.util.List;
 import java.net.URLClassLoader;
 import java.net.URL;
 
@@ -39,11 +40,13 @@
 
     StandardJavaFileManager _delegate = null;
     String _classPath = null;
+    RecompiledClassLoader classLoader = null;
 
 
     protected ContainerFileManager(StandardJavaFileManager standardJavaFileManager) {
         super(standardJavaFileManager);
         _delegate = standardJavaFileManager;
+        classLoader = new RecompiledClassLoader(ClassUtils.getContextClassLoader());
     }
 
 
@@ -54,7 +57,7 @@
 
     @Override
     public ClassLoader getClassLoader(Location location) {
-        return ClassUtils.getContextClassLoader();
+        return classLoader;
     }
 
     Iterable<? extends JavaFileObject> getJavaFileObjects(File... files) {
@@ -65,34 +68,43 @@
         return _delegate.getJavaFileObjects(files);
     }
 
+
     String getClassPath() {
         if (_classPath != null) {
             return _classPath;
         }
         ClassLoader cls = getClassLoader(null);
-        while (!(cls instanceof URLClassLoader) && cls != null) {
+
+        StringBuilder retVal = new StringBuilder(500);
+        while (cls != null) {
+            if(cls instanceof URLClassLoader ) {
+                URL[] urls = ((URLClassLoader) cls).getURLs();
+                int len = urls.length;
+                
+                for (int cnt = 0; cnt < len; cnt++) {
+
+                    retVal.append(urls[cnt].getFile());
+                    if (cnt < len - 1) {
+                        retVal.append(File.pathSeparator);
+                    }
+                }
+            }
+
             cls = cls.getParent();
         }
-        if (cls == null) {
-            return "";
-        }
 
-        URL[] urls = ((URLClassLoader) cls).getURLs();
-        int len = urls.length;
-        if (len == 0) {
-            return "";
+        String retStr = retVal.toString();
+        if(retStr.length()>1) {
+            retStr = retStr.substring(0, retStr.length() - 1);
         }
-        StringBuilder retVal = new StringBuilder(len * 16);
 
-        for (int cnt = 0; cnt < len; cnt++) {
-            retVal.append(urls[cnt].getFile());
-            if (cnt < len - 1) {
-                retVal.append(File.pathSeparator);
-            }
-        }
-        return (_classPath = retVal.toString());
+        return (_classPath = retStr);
     }
 
+
+    public File getTempDir() {
+        return classLoader.getTempDir();
+    }
 }
 
 

Added: myfaces/extensions/scripting/trunk/core/src/main/java/org/apache/myfaces/scripting/loaders/java/jsr199/RecompiledClassLoader.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/src/main/java/org/apache/myfaces/scripting/loaders/java/jsr199/RecompiledClassLoader.java?rev=812255&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/core/src/main/java/org/apache/myfaces/scripting/loaders/java/jsr199/RecompiledClassLoader.java (added)
+++ myfaces/extensions/scripting/trunk/core/src/main/java/org/apache/myfaces/scripting/loaders/java/jsr199/RecompiledClassLoader.java Mon Sep  7 18:51:39 2009
@@ -0,0 +1,96 @@
+/*
+ * 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.scripting.loaders.java.jsr199;
+
+import java.io.File;
+import java.io.FileInputStream;
+
+/**
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ */
+
+public class RecompiledClassLoader extends ClassLoader {
+    File tempDir = null;
+
+    RecompiledClassLoader(ClassLoader classLoader) {
+        super(classLoader);
+        if (tempDir == null) {
+            synchronized (this.getClass()) {
+                if (tempDir != null) {
+                    return;
+                }
+                String baseTempPath = System.getProperty("java.io.tmpdir");
+                String tempDirName = "myfaces_compilation_" + Math.random();
+
+                tempDir = new File(baseTempPath + File.separator + tempDirName);
+                while (tempDir.exists()) {
+                    tempDirName = "myfaces_compilation_" + System.currentTimeMillis() + Math.random();
+                    tempDir = new File(baseTempPath + File.separator + tempDirName);
+                }
+                tempDir.mkdirs();
+                tempDir.deleteOnExit();
+            }
+        }
+    }
+
+    RecompiledClassLoader() {
+    }
+
+
+    @Override
+    public Class<?> loadClass(String className) throws ClassNotFoundException {
+        //check if our class exists in the tempDir
+        String classFile = className.replaceAll("\\.", File.separator) + ".class";
+        File target = new File(tempDir.getAbsolutePath() + File.separator + classFile);
+        if (target.exists()) {
+
+            FileInputStream iStream = null;
+            int fileLength = (int) target.length();
+            byte[] fileContent = new byte[fileLength];
+
+            try {
+                iStream = new FileInputStream(target);
+                iStream.read(fileContent);
+                // Erzeugt aus dem byte Feld ein Class Object.
+                return super.defineClass(className, fileContent, 0, fileLength);
+
+            } catch (Exception e) {
+                throw new ClassNotFoundException(e.toString());
+            } finally {
+                if (iStream != null) {
+                    try {
+                        iStream.close();
+                    } catch (Exception e) {
+                    }
+                }
+            }
+        }
+
+        return super.loadClass(className);    //To change body of overridden methods use File | Settings | File Templates.
+    }
+
+    public File getTempDir() {
+        return tempDir;
+    }
+
+    public void setTempDir(File tempDir) {
+        this.tempDir = tempDir;
+    }
+}

Added: myfaces/extensions/scripting/trunk/core/src/main/java/org/apache/myfaces/scripting/loaders/java/jsr199/ReflectCompilerFacade.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/src/main/java/org/apache/myfaces/scripting/loaders/java/jsr199/ReflectCompilerFacade.java?rev=812255&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/core/src/main/java/org/apache/myfaces/scripting/loaders/java/jsr199/ReflectCompilerFacade.java (added)
+++ myfaces/extensions/scripting/trunk/core/src/main/java/org/apache/myfaces/scripting/loaders/java/jsr199/ReflectCompilerFacade.java Mon Sep  7 18:51:39 2009
@@ -0,0 +1,27 @@
+/*
+ * 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.scripting.loaders.java.jsr199;
+
+/**
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ */
+
+public class ReflectCompilerFacade {
+}