You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomee.apache.org by Romain Manni-Bucau <rm...@gmail.com> on 2014/07/16 14:48:10 UTC

Fwd: svn commit: r1610979 - /tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CmpJarBuilder.java

Thank you very much


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:  <an...@apache.org>
Date: 2014-07-16 14:37 GMT+02:00
Subject: svn commit: r1610979 -
/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CmpJarBuilder.java
To: commits@tomee.apache.org


Author: andygumbrecht
Date: Wed Jul 16 12:37:18 2014
New Revision: 1610979

URL: http://svn.apache.org/r1610979
Log:
Not ready

Modified:
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CmpJarBuilder.java

Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CmpJarBuilder.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CmpJarBuilder.java?rev=1610979&r1=1610978&r2=1610979&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CmpJarBuilder.java
(original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CmpJarBuilder.java
Wed Jul 16 12:37:18 2014
@@ -17,8 +17,6 @@

 package org.apache.openejb.assembler.classic;

-import org.apache.commons.lang3.JavaVersion;
-import org.apache.commons.lang3.SystemUtils;
 import org.apache.openejb.ClassLoaderUtil;
 import org.apache.openejb.core.cmp.CmpUtil;
 import org.apache.openejb.core.cmp.cmp2.Cmp1Generator;
@@ -29,33 +27,9 @@ import org.apache.openejb.loader.SystemI
 import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
 import org.apache.openejb.util.UrlCache;
-import org.apache.openejb.util.classloader.URLClassLoaderFirst;
-import org.apache.openjpa.enhance.PCEnhancer;
-import org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl;
-import org.apache.openjpa.jdbc.meta.MappingRepository;
-import org.apache.openjpa.jdbc.meta.NoneMappingDefaults;
-import org.apache.openjpa.jdbc.sql.HSQLDictionary;
-import org.apache.openjpa.lib.util.BytecodeWriter;
-import org.apache.openjpa.meta.AccessCode;
-import org.apache.openjpa.meta.MetaDataModes;
-import org.apache.openjpa.meta.MetaDataRepository;
-import org.apache.openjpa.persistence.jdbc.PersistenceMappingFactory;
-import org.apache.xbean.asm5.ClassReader;
-import org.apache.xbean.asm5.ClassWriter;
-import serp.bytecode.BCClass;
-
-import java.io.BufferedInputStream;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
+
 import java.io.File;
 import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.Map;
 import java.util.Set;
 import java.util.StringTokenizer;
 import java.util.TreeSet;
@@ -106,53 +80,15 @@ public class CmpJarBuilder {
             jarOutputStream = openJarFile(this);

             // Generate CMP implementation classes
-            final Map<String, Entry> classes = new HashMap<>();
             for (final EjbJarInfo ejbJar : appInfo.ejbJars) {
                 for (final EnterpriseBeanInfo beanInfo :
ejbJar.enterpriseBeans) {
                     if (beanInfo instanceof EntityBeanInfo) {
                         final EntityBeanInfo entityBeanInfo =
(EntityBeanInfo) beanInfo;
                         if
("CONTAINER".equalsIgnoreCase(entityBeanInfo.persistenceType)) {
-                            final Entry entry =
generateClass(jarOutputStream, entityBeanInfo);
-                            classes.put(entry.clazz, entry);
-                        }
-                    }
-                }
-            }
-
-            final URLClassLoaderFirst thisClassLoader = new
URLClassLoaderFirst(new URL[0], tempClassLoader) {
-                @Override
-                public Class<?> loadClass(final String name, final
boolean resolve) throws ClassNotFoundException {
-                    final Entry e = classes.get(name);
-                    if (e != null) {
-                        final Class<?> alreadyLoaded = findLoadedClass(name);
-                        if (alreadyLoaded != null) {
-                            if (resolve) {
-                                resolveClass(alreadyLoaded);
-                            }
-                            return alreadyLoaded;
+                            generateClass(jarOutputStream, entityBeanInfo);
                         }
-
-                        final Class<?> c = defineClass(e.clazz,
e.bytes, 0, e.bytes.length);
-                        if (resolve) {
-                            resolveClass(c);
-                        }
-                        return c;
                     }
-                    return super.loadClass(name, resolve);
-                }
-
-                @Override
-                public InputStream getResourceAsStream(final String name) {
-                    final String key = name.replace('/',
'.').replace(".class", "");
-                    final Entry e = classes.get(key);
-                    return e != null ? new
ByteArrayInputStream(e.bytes) : super.getResourceAsStream(name);
                 }
-            };
-
-
-            for (final Entry e : classes.values()) {
-                // add the generated class to the jar
-                addJarEntry(jarOutputStream, e.name,
enhance(thisClassLoader, e.clazz, e.bytes));
             }
             if (appInfo.cmpMappingsXml != null) {
                 // System.out.println(appInfo.cmpMappingsXml);
@@ -204,12 +140,12 @@ public class CmpJarBuilder {
      * @param entityBeanInfo  The descriptor for the entity bean we
need to wrapper.
      * @throws IOException
      */
-    private Entry generateClass(final JarOutputStream
jarOutputStream, final EntityBeanInfo entityBeanInfo) throws
IOException {
+    private void generateClass(final JarOutputStream jarOutputStream,
final EntityBeanInfo entityBeanInfo) throws IOException {
         // don't generate if there is aleady an implementation class
         final String cmpImplClass =
CmpUtil.getCmpImplClassName(entityBeanInfo.abstractSchemaName,
entityBeanInfo.ejbClass);
         final String entryName = cmpImplClass.replace(".", "/") + ".class";
         if (entries.contains(entryName) ||
tempClassLoader.getResource(entryName) != null) {
-            return null;
+            return;
         }

         // load the bean class, which is used by the generator
@@ -265,7 +201,8 @@ public class CmpJarBuilder {
             bytes = cmp2Generator.generate();
         }

-        return new Entry(cmpImplClass, entryName, bytes);
+        // add the generated class to the jar
+        addJarEntry(jarOutputStream, entryName, bytes);
     }

     /**
@@ -302,81 +239,6 @@ public class CmpJarBuilder {
         }
     }

-    private byte[] enhance(final ClassLoader thisClassLoader, final
String clazz, final byte[] bytes) {
-        try {
-            final ByteArrayOutputStream baos = new
ByteArrayOutputStream(bytes.length * 2);
-            final JDBCConfigurationImpl conf = new JDBCConfigurationImpl();
-            conf.setDBDictionary(new HSQLDictionary());
-            final MappingRepository repos = new MappingRepository();
-
-            final Class<?> tmpClass = thisClassLoader.loadClass(clazz);
-            repos.setConfiguration(conf);
-            repos.setMetaDataFactory(new PersistenceMappingFactory() {
-                @Override
-                public Set getPersistentTypeNames(boolean devpath,
ClassLoader envLoader) {
-                    return Collections.singleton(tmpClass);
-                }
-            });
-            repos.setMappingDefaults(NoneMappingDefaults.getInstance());
-            repos.setResolve(MetaDataModes.MODE_NONE);
-            repos.setValidate(MetaDataRepository.VALIDATE_NONE);
-            repos.addMetaData(tmpClass, AccessCode.PROPERTY);
-
-            final PCEnhancer.Flags flags = new PCEnhancer.Flags();
-            flags.tmpClassLoader = false;
-
-            final BytecodeWriter writer = new BytecodeWriter() {
-                @Override
-                public void write(final BCClass type) throws IOException {
-                    final byte[] b = type.toByteArray();
-                    if
(SystemUtils.isJavaVersionAtLeast(JavaVersion.JAVA_1_7)) {
-                        final ByteArrayInputStream bais = new
ByteArrayInputStream(b);
-                        final BufferedInputStream bis = new
BufferedInputStream(bais);
-
-                        final ClassWriter cw = new
ClassWriter(ClassWriter.COMPUTE_FRAMES) {
-                            protected String
getCommonSuperClass(String type1, String type2) {
-                                Class<?> class1;
-                                Class<?> class2;
-                                try {
-                                    class1 =
thisClassLoader.loadClass(type1.replace('/', '.'));
-                                    class2 =
thisClassLoader.loadClass(type2.replace('/', '.'));
-                                } catch (final ClassNotFoundException ex) {
-                                    throw new RuntimeException(ex);
-                                }
-                                if (class1.isAssignableFrom(class2)) {
-                                    return type1;
-                                }
-                                if (class2.isAssignableFrom(class1)) {
-                                    return type2;
-                                }
-                                if (class1.isInterface() ||
class2.isInterface()) {
-                                    return "java/lang/Object";
-                                }
-                                do {
-                                    class1 = class1.getSuperclass();
-                                } while (!class1.isAssignableFrom(class2));
-                                return class1.getName().replace('.', '/');
-                            }
-                        };
-                        final ClassReader cr = new ClassReader(bis);
-                        cr.accept(cw, 0);
-                        baos.write(cw.toByteArray());
-                    } else {
-                        baos.write(b);
-                    }
-                }
-            };
-            PCEnhancer.run(conf, null, flags, repos, writer, thisClassLoader);
-            final byte[] enhanced = baos.toByteArray();
-            if (enhanced.length > 0) {
-                return enhanced;
-            }
-        } catch (final Exception e) {
-            // no-op: we should surely log something, maybe a warning
-        }
-        return bytes;
-    }
-
     private static synchronized JarOutputStream openJarFile(final
CmpJarBuilder instance) throws IOException {

         if (instance.jarFile != null) {
@@ -424,16 +286,4 @@ public class CmpJarBuilder {
             }
         }
     }
-
-    private static class Entry {
-        private final String clazz;
-        private final String name;
-        private final byte[] bytes;
-
-        private Entry(final String clazz, final String name, final
byte[] bytes) {
-            this.clazz = clazz;
-            this.name = name;
-            this.bytes = bytes;
-        }
-    }
-}
\ No newline at end of file
+}