Hi Andy,

can you merge it in
http://svn.apache.org/repos/asf/openejb/branches/openejb-4.5.1-b/ +
create a jira please?

(if you can't i'll do it later)

Romain Manni-Bucau
Twitter: @rmannibucau
Blog: http://rmannibucau.wordpress.com/
LinkedIn: http://fr.linkedin.com/in/rmannibucau
Github: https://github.com/rmannibucau




---------- Forwarded message ----------
From:  <andygumbre...@apache.org>
Date: 2012/12/6
Subject: svn commit: r1417802 - in
/openejb/trunk/openejb/container/openejb-core/src:
main/java/org/apache/openejb/core/TempClassLoader.java
test/java/org/apache/openejb/core/TempClassLoaderTest.java
To: comm...@openejb.apache.org


Author: andygumbrecht
Date: Thu Dec  6 10:48:39 2012
New Revision: 1417802

URL: http://svn.apache.org/viewvc?rev=1417802&view=rev
Log:
Reuse ByteArrayOutputStream.
Finals.

Modified:
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/TempClassLoader.java
    
openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/core/TempClassLoaderTest.java

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/TempClassLoader.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/TempClassLoader.java?rev=1417802&r1=1417801&r2=1417802&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/TempClassLoader.java
(original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/TempClassLoader.java
Thu Dec  6 10:48:39 2012
@@ -46,26 +46,31 @@ import java.util.Set;
  */
 // Note: this class is a fork from OpenJPA
 public class TempClassLoader extends URLClassLoader {
+
     private final Set<Skip> skip;
     private final ClassLoader system;
     private final boolean embedded;

-    public TempClassLoader(ClassLoader parent) {
+    // 80% of class files are smaller then 6k
+    private final ByteArrayOutputStream bout = new
ByteArrayOutputStream(6 * 1024);
+
+    public TempClassLoader(final ClassLoader parent) {
         super(new URL[0], parent);
-        skip =
SystemInstance.get().getOptions().getAll("openejb.tempclassloader.skip",
Skip.NONE);
-        system = ClassLoader.getSystemClassLoader();
-        embedded = getClass().getClassLoader() == system;
+        this.skip =
SystemInstance.get().getOptions().getAll("openejb.tempclassloader.skip",
Skip.NONE);
+        this.system = ClassLoader.getSystemClassLoader();
+        this.embedded = this.getClass().getClassLoader() == this.system;
     }

     /*
      * Needed for testing
      */
-    public void skip(Skip s) {
+    public void skip(final Skip s) {
         this.skip.add(s);
     }

-    public Class loadClass(String name) throws ClassNotFoundException {
-        return loadClass(name, false);
+    @Override
+    public Class loadClass(final String name) throws ClassNotFoundException {
+        return this.loadClass(name, false);
     }

     @Override
@@ -73,11 +78,12 @@ public class TempClassLoader extends URL
         return URLClassLoaderFirst.filterResources(name,
super.getResources(name));
     }

-    protected synchronized Class loadClass(String name, boolean
resolve) throws ClassNotFoundException {
+    @Override
+    protected synchronized Class loadClass(final String name, final
boolean resolve) throws ClassNotFoundException {
         if (name == null) throw new NullPointerException("name cannot
be null");
-
+
         // see if we've already loaded it
-        Class c = findLoadedClass(name);
+        Class c = this.findLoadedClass(name);
         if (c != null) {
             return c;
         }
@@ -96,16 +102,16 @@ public class TempClassLoader extends URL
          * 2. Since this class loader uses Class.forName to load
classes starting with java, javax or sun, it cannot load
javax.faces.FacesServlet
          * 3. Result is , AnnotationDeployer throws a ClassNotFoundException
          */
-        if (skip(name)) {
-            return Class.forName(name, resolve, getClass().getClassLoader());
+        if (this.skip(name)) {
+            return Class.forName(name, resolve,
this.getClass().getClassLoader());
         }

         // don't load classes from app classloader
         // we do it after the previous one since it will probably
result to the same
         // Class and the previous one is faster than this one
-        if (!embedded && URLClassLoaderFirst.canBeLoadedFromSystem(name)) {
+        if (!this.embedded &&
URLClassLoaderFirst.canBeLoadedFromSystem(name)) {
             try {
-                c = system.loadClass(name);
+                c = this.system.loadClass(name);
                 if (c != null) {
                     return c;
                 }
@@ -115,23 +121,28 @@ public class TempClassLoader extends URL
         }

 //        ( && !name.startsWith("javax.faces.") )||
-        String resourceName = name.replace('.', '/') + ".class";
-        InputStream in = getResourceAsStream(resourceName);
-        if (in != null && !(in instanceof BufferedInputStream)) {
-            in = new BufferedInputStream(in);
-        }
-        if (in == null) {
-            throw new ClassNotFoundException(name);
-        }
+        final String resourceName = name.replace('.', '/') + ".class";

-        // 80% of class files are smaller then 6k
-        ByteArrayOutputStream bout = new ByteArrayOutputStream(8 * 1024);
+        //Copy the input stream into a byte array
+        final byte[] bytes;
+        this.bout.reset();
+        InputStream in = null;

-        // copy the input stream into a byte array
-        byte[] bytes;
         try {
-            IO.copy(in, bout);
-            bytes = bout.toByteArray();
+
+            in = this.getResourceAsStream(resourceName);
+
+            if (in != null && !(in instanceof BufferedInputStream)) {
+                in = new BufferedInputStream(in);
+            }
+
+            if (in == null) {
+                throw new ClassNotFoundException(name);
+            }
+
+            IO.copy(in, this.bout);
+            bytes = this.bout.toByteArray();
+
         } catch (IOException e) {
             throw new ClassNotFoundException(name, e);
         } finally {
@@ -140,26 +151,26 @@ public class TempClassLoader extends URL

         // Annotation classes must be loaded by the normal classloader
         // So must Enum classes to prevent problems with the sun jdk.
-        if (skip.contains(Skip.ANNOTATIONS) && isAnnotationClass(bytes)) {
-            return Class.forName(name, resolve, getClass().getClassLoader());
+        if (this.skip.contains(Skip.ANNOTATIONS) && isAnnotationClass(bytes)) {
+            return Class.forName(name, resolve,
this.getClass().getClassLoader());
         }

-        if (skip.contains(Skip.ENUMS) && isEnum(bytes)) {
-            return Class.forName(name, resolve, getClass().getClassLoader());
+        if (this.skip.contains(Skip.ENUMS) && isEnum(bytes)) {
+            return Class.forName(name, resolve,
this.getClass().getClassLoader());
         }

         // define the package
-        int packageEndIndex = name.lastIndexOf('.');
+        final int packageEndIndex = name.lastIndexOf('.');
         if (packageEndIndex != -1) {
-            String packageName = name.substring(0, packageEndIndex);
-            if (getPackage(packageName) == null) {
-                definePackage(packageName, null, null, null, null,
null, null, null);
+            final String packageName = name.substring(0, packageEndIndex);
+            if (this.getPackage(packageName) == null) {
+                this.definePackage(packageName, null, null, null,
null, null, null, null);
             }
         }

         // define the class
         try {
-            return defineClass(name, bytes, 0, bytes.length);
+            return this.defineClass(name, bytes, 0, bytes.length);
         } catch (SecurityException e) {
             // possible prohibited package: defer to the parent
             return super.loadClass(name, resolve);
@@ -170,8 +181,8 @@ public class TempClassLoader extends URL
     }

     // TODO: for jsf it can be useful to include commons-logging and
openwebbeans...
-    private boolean skip(String name) {
-        return skip.contains(Skip.ALL) || URLClassLoaderFirst.shouldSkip(name);
+    private boolean skip(final String name) {
+        return this.skip.contains(Skip.ALL) ||
URLClassLoaderFirst.shouldSkip(name);
     }

     public static enum Skip {
@@ -182,9 +193,9 @@ public class TempClassLoader extends URL
      * Fast-parse the given class bytecode to determine if it is an
      * enum class.
      */
-    private static boolean isEnum(byte[] bytes) {
-        IsEnumVisitor isEnumVisitor = new IsEnumVisitor();
-        ClassReader classReader = new ClassReader(bytes);
+    private static boolean isEnum(final byte[] bytes) {
+        final IsEnumVisitor isEnumVisitor = new IsEnumVisitor();
+        final ClassReader classReader = new ClassReader(bytes);
         classReader.accept(isEnumVisitor, ClassReader.SKIP_DEBUG);
         return isEnumVisitor.isEnum;
     }
@@ -193,9 +204,9 @@ public class TempClassLoader extends URL
      * Fast-parse the given class bytecode to determine if it is an
      * annotation class.
      */
-    private static boolean isAnnotationClass(byte[] bytes) {
-        IsAnnotationVisitor isAnnotationVisitor = new IsAnnotationVisitor();
-        ClassReader classReader = new ClassReader(bytes);
+    private static boolean isAnnotationClass(final byte[] bytes) {
+        final IsAnnotationVisitor isAnnotationVisitor = new
IsAnnotationVisitor();
+        final ClassReader classReader = new ClassReader(bytes);
         classReader.accept(isAnnotationVisitor, ClassReader.SKIP_DEBUG);
         return isAnnotationVisitor.isAnnotation;
     }
@@ -203,17 +214,19 @@ public class TempClassLoader extends URL
     public static class IsAnnotationVisitor extends EmptyVisitor {
         public boolean isAnnotation = false;

-        public void visit(int version, int access, String name,
String signature, String superName, String[] interfaces) {
-            isAnnotation = (access & Opcodes.ACC_ANNOTATION) != 0;
+        @Override
+        public void visit(final int version, final int access, final
String name, final String signature, final String superName, final
String[] interfaces) {
+            this.isAnnotation = (access & Opcodes.ACC_ANNOTATION) != 0;
         }

     }
-
+
     public static class IsEnumVisitor extends EmptyVisitor {
         public boolean isEnum = false;

-        public void visit(int version, int access, String name,
String signature, String superName, String[] interfaces) {
-            isEnum = (access & Opcodes.ACC_ENUM) != 0;
+        @Override
+        public void visit(final int version, final int access, final
String name, final String signature, final String superName, final
String[] interfaces) {
+            this.isEnum = (access & Opcodes.ACC_ENUM) != 0;
         }

     }

Modified: 
openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/core/TempClassLoaderTest.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/core/TempClassLoaderTest.java?rev=1417802&r1=1417801&r2=1417802&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/core/TempClassLoaderTest.java
(original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/test/java/org/apache/openejb/core/TempClassLoaderTest.java
Thu Dec  6 10:48:39 2012
@@ -41,7 +41,7 @@ public class TempClassLoaderTest {

     @Test
     public void test() throws Exception {
-        ClassLoader tempCL = new TempClassLoader(getClass().getClassLoader());
+        final ClassLoader tempCL = new
TempClassLoader(this.getClass().getClassLoader());
         Class<?> clazz;

         // normal classes should be loaded by the temp class loader
@@ -63,7 +63,7 @@ public class TempClassLoaderTest {

     @Test
     public void testHackEnabled() throws Exception {
-        TempClassLoader tempCL = new
TempClassLoader(getClass().getClassLoader());
+        final TempClassLoader tempCL = new
TempClassLoader(this.getClass().getClassLoader());
         tempCL.skip(TempClassLoader.Skip.ANNOTATIONS);

         Class<?> clazz;

Reply via email to