Author: andygumbrecht
Date: Mon Dec 17 16:52:12 2012
New Revision: 1423017
URL: http://svn.apache.org/viewvc?rev=1423017&view=rev
Log:
Fix potential win paths.
CmpJarBuilder#addJarEntry
ClassLoaderUtil#configurer
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/ClassLoaderUtil.java
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CmpJarBuilder.java
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/ClassLoaderUtil.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/ClassLoaderUtil.java?rev=1423017&r1=1423016&r2=1423017&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/ClassLoaderUtil.java
(original)
+++
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/ClassLoaderUtil.java
Mon Dec 17 16:52:12 2012
@@ -70,24 +70,24 @@ public class ClassLoaderUtil {
});
}
- public static File getUrlCachedName(String appId, URL url) {
+ public static File getUrlCachedName(final String appId, final URL url) {
return localUrlCache.getUrlCachedName(appId, url);
}
- public static boolean isUrlCached(String appId, URL url) {
+ public static boolean isUrlCached(final String appId, final URL url) {
return localUrlCache.isUrlCached(appId, url);
}
- public static URL getUrlKeyCached(String appId, File file) {
- return localUrlCache.getUrlKeyCached(appId, file);
+ public static URL getUrlKeyCached(final String appId, final File file) {
+ return localUrlCache.getUrlKeyCached(appId, file);
}
- public static URLClassLoader createClassLoaderFirst(String appId, URL[]
urls, ClassLoader parent) {
+ public static URLClassLoader createClassLoaderFirst(final String appId,
final URL[] urls, final ClassLoader parent) {
return cacheClassLoader(appId, new
URLClassLoaderFirst(localUrlCache.cacheUrls(appId, urls), parent));
}
- public static URLClassLoader createClassLoader(String appId, URL[] urls,
ClassLoader parent) {
- return cacheClassLoader(appId, new
URLClassLoader(localUrlCache.cacheUrls(appId, urls), parent));
+ public static URLClassLoader createClassLoader(final String appId, final
URL[] urls, final ClassLoader parent) {
+ return cacheClassLoader(appId, new
URLClassLoader(localUrlCache.cacheUrls(appId, urls), parent));
}
private static URLClassLoader cacheClassLoader(final String appId, final
URLClassLoader classLoader) {
@@ -113,17 +113,17 @@ public class ClassLoaderUtil {
*
* @param classLoader ClassLoader to destroy.
*/
- public static void destroyClassLoader(ClassLoader classLoader) {
+ public static void destroyClassLoader(final ClassLoader classLoader) {
logger.debug("Destroying classLoader " + toString(classLoader));
// remove from the indexes
- Set<String> apps = appsByClassLoader.remove(classLoader);
+ final Set<String> apps = appsByClassLoader.remove(classLoader);
if (apps != null) {
List<ClassLoader> classLoaders;
- for (String appId : apps) {
+ for (final String appId : apps) {
classLoaders = classLoadersByApp.get(appId);
@@ -145,8 +145,6 @@ public class ClassLoaderUtil {
for (final String jar : getClosedJarFiles(classLoader)) {
clearSunJarFileFactoryCache(jar);
}
-
- classLoader = null;
}
/**
@@ -162,16 +160,16 @@ public class ClassLoaderUtil {
if (null != cl && cl instanceof URLClassLoader) {
final URLClassLoader ucl = (URLClassLoader) cl;
- Class clazz = java.net.URLClassLoader.class;
+ final Class clazz = java.net.URLClassLoader.class;
try {
- java.lang.reflect.Field ucp = clazz.getDeclaredField("ucp");
+ final java.lang.reflect.Field ucp =
clazz.getDeclaredField("ucp");
ucp.setAccessible(true);
- Object cp = ucp.get(ucl);
- java.lang.reflect.Field loaders =
cp.getClass().getDeclaredField("loaders");
+ final Object cp = ucp.get(ucl);
+ final java.lang.reflect.Field loaders =
cp.getClass().getDeclaredField("loaders");
loaders.setAccessible(true);
- java.util.Collection c = (java.util.Collection)
loaders.get(cp);
+ final java.util.Collection c = (java.util.Collection)
loaders.get(cp);
java.lang.reflect.Field loader;
java.util.jar.JarFile jf;
@@ -194,10 +192,10 @@ public class ClassLoaderUtil {
return files;
}
- public boolean finalizeNativeLibs(ClassLoader cl) {
+ public boolean finalizeNativeLibs(final ClassLoader cl) {
boolean res = false;
- Class classClassLoader = ClassLoader.class;
+ final Class classClassLoader = ClassLoader.class;
java.lang.reflect.Field nativeLibraries = null;
try {
@@ -224,13 +222,11 @@ public class ClassLoaderUtil {
}
res = true;
- Vector java_lang_ClassLoader_NativeLibrary = (Vector) obj;
+ final Vector java_lang_ClassLoader_NativeLibrary = (Vector) obj;
java.lang.reflect.Method finalize;
for (final Object lib : java_lang_ClassLoader_NativeLibrary) {
- finalize = null;
-
try {
finalize = lib.getClass().getDeclaredMethod("finalize", new
Class[0]);
@@ -251,10 +247,10 @@ public class ClassLoaderUtil {
return res;
}
- public static void destroyClassLoader(String appId) {
+ public static void destroyClassLoader(final String appId) {
logger.debug("Destroying classLoaders for application " + appId);
- List<ClassLoader> classLoaders = classLoadersByApp.remove(appId);
+ final List<ClassLoader> classLoaders = classLoadersByApp.remove(appId);
if (classLoaders != null) {
@@ -277,8 +273,6 @@ public class ClassLoaderUtil {
it.remove();
appsByClassLoader.remove(cl);
destroyClassLoader(cl);
- cl = null;
-
System.gc();
} else {
logger.debug("ClassLoader " + toString(cl) + " held open
by the applications: " + apps);
@@ -290,11 +284,11 @@ public class ClassLoaderUtil {
clearSunJarFileFactoryCache(appId);
}
- public static URLClassLoader createTempClassLoader(ClassLoader parent) {
+ public static URLClassLoader createTempClassLoader(final ClassLoader
parent) {
return new TempClassLoader(parent);
}
- public static URLClassLoader createTempClassLoader(String appId, URL[]
rawUrls, ClassLoader parent) {
+ public static URLClassLoader createTempClassLoader(final String appId,
final URL[] rawUrls, final ClassLoader parent) {
String updatedAppId = appId;
if (appId != null) { // here we often get the full path of the app as
id where later it is simply the name of the file/dir
final File file = new File(appId);
@@ -313,7 +307,7 @@ public class ClassLoaderUtil {
}
if (configurer != null) {
final Collection<URL> urlList = new ArrayList<URL>();
- for (URL rawUrl : rawUrls) {
+ for (final URL rawUrl : rawUrls) {
if (configurer.accept(rawUrl)) {
urlList.add(rawUrl);
}
@@ -462,8 +456,8 @@ public class ClassLoaderUtil {
}
}
- private static boolean isParent(String jarLocation, File file) {
- File dir = new File(jarLocation);
+ private static boolean isParent(final String jarLocation, File file) {
+ final File dir = new File(jarLocation);
while (file != null) {
if (file.equals(dir)) {
return true;
@@ -482,10 +476,10 @@ public class ClassLoaderUtil {
* @param clazz the name of the class containing the cache field
* @param fieldName the name of the cache field
*/
- public static void clearSunSoftCache(final Class clazz, String fieldName) {
+ public static void clearSunSoftCache(final Class clazz, final String
fieldName) {
synchronized (clazz) {
try {
- Field field = clazz.getDeclaredField(fieldName);
+ final Field field = clazz.getDeclaredField(fieldName);
field.setAccessible(true);
final Map cache = (Map) field.get(null);
cache.clear();
@@ -495,17 +489,17 @@ public class ClassLoaderUtil {
}
}
- public static void cleanOpenJPACache(ClassLoader classLoader) {
+ public static void cleanOpenJPACache(final ClassLoader classLoader) {
try {
- Class<?> pcRegistryClass =
ClassLoaderUtil.class.getClassLoader().loadClass("org.apache.openjpa.enhance.PCRegistry");
- Method deRegisterMethod = pcRegistryClass.getMethod("deRegister",
ClassLoader.class);
+ final Class<?> pcRegistryClass =
ClassLoaderUtil.class.getClassLoader().loadClass("org.apache.openjpa.enhance.PCRegistry");
+ final Method deRegisterMethod =
pcRegistryClass.getMethod("deRegister", ClassLoader.class);
deRegisterMethod.invoke(null, classLoader);
} catch (Throwable ignored) {
// there is nothing a user could do about this anyway
}
}
- private static String toString(ClassLoader classLoader) {
+ private static String toString(final ClassLoader classLoader) {
if (classLoader == null) {
return "null";
} else {
@@ -519,7 +513,7 @@ public class ClassLoaderUtil {
public static ClassLoaderConfigurer configurer(final String rawId) {
String id = rawId;
- if (id != null && id.startsWith("/") && !new File(id).exists() &&
id.length() > 1) {
+ if (id != null && (id.startsWith("/") || id.startsWith("\\")) && !new
File(id).exists() && id.length() > 1) {
id = id.substring(1);
}
@@ -567,10 +561,10 @@ public class ClassLoaderUtil {
private static ClassLoaderConfigurer createConfigurer(final String key,
final String impl) {
try {
final ObjectRecipe recipe = new ObjectRecipe(impl);
- for (Map.Entry<Object, Object> entry :
SystemInstance.get().getProperties().entrySet()) {
- String entryKey = entry.getKey().toString();
+ for (final Map.Entry<Object, Object> entry :
SystemInstance.get().getProperties().entrySet()) {
+ final String entryKey = entry.getKey().toString();
if (entryKey.startsWith(key)) {
- String newKey = entryKey.substring(key.length());
+ final String newKey = entryKey.substring(key.length());
if (!"clazz".equals(newKey)) {
recipe.setProperty(newKey, entry.getValue());
}
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CmpJarBuilder.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CmpJarBuilder.java?rev=1423017&r1=1423016&r2=1423017&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CmpJarBuilder.java
(original)
+++
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/CmpJarBuilder.java
Mon Dec 17 16:52:12 2012
@@ -16,6 +16,14 @@
*/
package org.apache.openejb.assembler.classic;
+import org.apache.openejb.ClassLoaderUtil;
+import org.apache.openejb.core.cmp.CmpUtil;
+import org.apache.openejb.core.cmp.cmp2.Cmp1Generator;
+import org.apache.openejb.core.cmp.cmp2.Cmp2Generator;
+import org.apache.openejb.core.cmp.cmp2.CmrField;
+import org.apache.openejb.loader.IO;
+import org.apache.openejb.util.UrlCache;
+
import java.io.File;
import java.io.IOException;
import java.util.Set;
@@ -24,25 +32,18 @@ import java.util.TreeSet;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
-import org.apache.openejb.core.cmp.cmp2.Cmp2Generator;
-import org.apache.openejb.core.cmp.cmp2.CmrField;
-import org.apache.openejb.core.cmp.cmp2.Cmp1Generator;
-import org.apache.openejb.core.cmp.CmpUtil;
-import org.apache.openejb.ClassLoaderUtil;
-import org.apache.openejb.loader.IO;
-import org.apache.openejb.util.UrlCache;
-
/**
* Creates a jar file which contains the CMP implementation classes and the
cmp entity mappings xml file.
*/
public class CmpJarBuilder {
+
private final ClassLoader tempClassLoader;
private File jarFile;
private final Set<String> entries = new TreeSet<String>();
private final AppInfo appInfo;
- public CmpJarBuilder(AppInfo appInfo, ClassLoader classLoader) {
+ public CmpJarBuilder(final AppInfo appInfo, final ClassLoader classLoader)
{
this.appInfo = appInfo;
tempClassLoader = ClassLoaderUtil.createTempClassLoader(classLoader);
}
@@ -55,12 +56,12 @@ public class CmpJarBuilder {
}
/**
- * Generate the CMP jar file associated with this
- * deployed application. The generated jar file will
- * contain generated classes and metadata that will
- * allow the JPA engine to manage the bean persistence.
- *
- * @exception IOException
+ * Generate the CMP jar file associated with this
+ * deployed application. The generated jar file will
+ * contain generated classes and metadata that will
+ * allow the JPA engine to manage the bean persistence.
+ *
+ * @throws IOException
*/
private void generate() throws IOException {
// Don't generate an empty jar. If there are no container-managed
beans defined in this
@@ -70,13 +71,13 @@ public class CmpJarBuilder {
}
boolean threwException = false;
- JarOutputStream jarOutputStream = openJarFile();
+ final JarOutputStream jarOutputStream = openJarFile();
try {
// Generate CMP implementation classes
- for (EjbJarInfo ejbJar : appInfo.ejbJars) {
- for (EnterpriseBeanInfo beanInfo : ejbJar.enterpriseBeans) {
+ for (final EjbJarInfo ejbJar : appInfo.ejbJars) {
+ for (final EnterpriseBeanInfo beanInfo :
ejbJar.enterpriseBeans) {
if (beanInfo instanceof EntityBeanInfo) {
- EntityBeanInfo entityBeanInfo = (EntityBeanInfo)
beanInfo;
+ final EntityBeanInfo entityBeanInfo = (EntityBeanInfo)
beanInfo;
if
("CONTAINER".equalsIgnoreCase(entityBeanInfo.persistenceType)) {
generateClass(jarOutputStream, entityBeanInfo);
}
@@ -93,27 +94,29 @@ public class CmpJarBuilder {
} finally {
close(jarOutputStream);
if (threwException) {
- jarFile.delete();
+ if (!jarFile.delete()) {
+ jarFile.deleteOnExit();
+ }
jarFile = null;
}
}
}
/**
- * Test if an application contains and CMP beans that
- * need to be mapped to the JPA persistence engine. This
- * will search all of the ejb jars contained within
- * the application looking for Entity beans with
- * a CONTAINER persistence type.
- *
- * @return true if the application uses container managed beans,
+ * Test if an application contains and CMP beans that
+ * need to be mapped to the JPA persistence engine. This
+ * will search all of the ejb jars contained within
+ * the application looking for Entity beans with
+ * a CONTAINER persistence type.
+ *
+ * @return true if the application uses container managed beans,
* false if none are found.
*/
private boolean hasCmpBeans() {
- for (EjbJarInfo ejbJar : appInfo.ejbJars) {
- for (EnterpriseBeanInfo beanInfo : ejbJar.enterpriseBeans) {
+ for (final EjbJarInfo ejbJar : appInfo.ejbJars) {
+ for (final EnterpriseBeanInfo beanInfo : ejbJar.enterpriseBeans) {
if (beanInfo instanceof EntityBeanInfo) {
- EntityBeanInfo entityBeanInfo = (EntityBeanInfo) beanInfo;
+ final EntityBeanInfo entityBeanInfo = (EntityBeanInfo)
beanInfo;
if
("CONTAINER".equalsIgnoreCase(entityBeanInfo.persistenceType)) {
return true;
}
@@ -124,21 +127,18 @@ public class CmpJarBuilder {
}
/**
- * Generate a class file for a CMP bean, writing the
- * byte data for the generated class into the jar file
- * we're constructing.
- *
- * @param jarOutputStream
- * The target jarfile.
- * @param entityBeanInfo
- * The descriptor for the entity bean we need to wrapper.
- *
- * @exception IOException
+ * Generate a class file for a CMP bean, writing the
+ * byte data for the generated class into the jar file
+ * we're constructing.
+ *
+ * @param jarOutputStream The target jarfile.
+ * @param entityBeanInfo The descriptor for the entity bean we need to
wrapper.
+ * @throws IOException
*/
- private void generateClass(JarOutputStream jarOutputStream, 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
- String cmpImplClass =
CmpUtil.getCmpImplClassName(entityBeanInfo.abstractSchemaName,
entityBeanInfo.ejbClass);
- String entryName = cmpImplClass.replace(".", "/") + ".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;
}
@@ -148,7 +148,7 @@ public class CmpJarBuilder {
try {
beanClass = tempClassLoader.loadClass(entityBeanInfo.ejbClass);
} catch (ClassNotFoundException e) {
- throw (IOException)new IOException("Could not find entity bean
class " + beanClass).initCause(e);
+ throw (IOException) new IOException("Could not find entity bean
class " + beanClass).initCause(e);
}
// and the primary key class, if defined.
@@ -157,15 +157,15 @@ public class CmpJarBuilder {
try {
primKeyClass =
tempClassLoader.loadClass(entityBeanInfo.primKeyClass);
} catch (ClassNotFoundException e) {
- throw (IOException)new IOException("Could not find entity
primary key class " + entityBeanInfo.primKeyClass).initCause(e);
+ throw (IOException) new IOException("Could not find entity
primary key class " + entityBeanInfo.primKeyClass).initCause(e);
}
}
// now generate a class file using the appropriate level of CMP
generator.
- byte[] bytes;
+ final byte[] bytes;
// NB: We'll need to change this test of CMP 3 is ever defined!
if (entityBeanInfo.cmpVersion != 2) {
- Cmp1Generator cmp1Generator = new Cmp1Generator(cmpImplClass,
beanClass);
+ final Cmp1Generator cmp1Generator = new
Cmp1Generator(cmpImplClass, beanClass);
// A primary key class defined as Object is an unknown key. Mark
it that
// way so the generator will create the automatically generated
key.
if ("java.lang.Object".equals(entityBeanInfo.primKeyClass)) {
@@ -175,22 +175,22 @@ public class CmpJarBuilder {
} else {
// generate the implementation class
- Cmp2Generator cmp2Generator = new Cmp2Generator(cmpImplClass,
- beanClass,
- entityBeanInfo.primKeyField,
- primKeyClass,
- entityBeanInfo.cmpFieldNames.toArray(new
String[entityBeanInfo.cmpFieldNames.size()]));
+ final Cmp2Generator cmp2Generator = new Cmp2Generator(cmpImplClass,
+ beanClass,
+
entityBeanInfo.primKeyField,
+ primKeyClass,
+
entityBeanInfo.cmpFieldNames.toArray(new
String[entityBeanInfo.cmpFieldNames.size()]));
// we need to have a complete set of the defined CMR fields
available for the
// generation process as well.
- for (CmrFieldInfo cmrFieldInfo : entityBeanInfo.cmrFields) {
- EntityBeanInfo roleSource = cmrFieldInfo.mappedBy.roleSource;
- CmrField cmrField = new CmrField(cmrFieldInfo.fieldName,
- cmrFieldInfo.fieldType,
-
CmpUtil.getCmpImplClassName(roleSource.abstractSchemaName, roleSource.ejbClass),
- roleSource.local,
- cmrFieldInfo.mappedBy.fieldName,
- cmrFieldInfo.synthetic);
+ for (final CmrFieldInfo cmrFieldInfo : entityBeanInfo.cmrFields) {
+ final EntityBeanInfo roleSource =
cmrFieldInfo.mappedBy.roleSource;
+ final CmrField cmrField = new CmrField(cmrFieldInfo.fieldName,
+ cmrFieldInfo.fieldType,
+
CmpUtil.getCmpImplClassName(roleSource.abstractSchemaName, roleSource.ejbClass),
+ roleSource.local,
+
cmrFieldInfo.mappedBy.fieldName,
+ cmrFieldInfo.synthetic);
cmp2Generator.addCmrField(cmrField);
}
bytes = cmp2Generator.generate();
@@ -200,22 +200,20 @@ public class CmpJarBuilder {
addJarEntry(jarOutputStream, entryName, bytes);
}
-
/**
- * Insert a file resource into the generated jar file.
- *
- * @param jarOutputStream
- * The target jar file.
- * @param fileName The name we're inserting.
- * @param bytes The file byte data.
- *
- * @exception IOException
+ * Insert a file resource into the generated jar file.
+ *
+ * @param jarOutputStream The target jar file.
+ * @param fileName The name we're inserting.
+ * @param bytes The file byte data.
+ * @throws IOException
*/
- private void addJarEntry(JarOutputStream jarOutputStream, String fileName,
byte[] bytes) throws IOException {
- // add all missing directory entried
+ private void addJarEntry(final JarOutputStream jarOutputStream, String
fileName, final byte[] bytes) throws IOException {
+ // add all missing directory entries
+ fileName = fileName.replace('\\', '/');
String path = "";
- for (StringTokenizer tokenizer = new StringTokenizer(fileName, "/");
tokenizer.hasMoreTokens();) {
- String part = tokenizer.nextToken();
+ for (StringTokenizer tokenizer = new StringTokenizer(fileName, "/");
tokenizer.hasMoreTokens(); ) {
+ final String part = tokenizer.nextToken();
if (tokenizer.hasMoreTokens()) {
path += part + "/";
if (!entries.contains(path)) {
@@ -247,11 +245,10 @@ public class CmpJarBuilder {
Thread.yield();
jarFile.deleteOnExit();
- JarOutputStream jarOutputStream = new
JarOutputStream(IO.write(jarFile));
- return jarOutputStream;
+ return new JarOutputStream(IO.write(jarFile));
}
- private void close(JarOutputStream jarOutputStream) {
+ private void close(final JarOutputStream jarOutputStream) {
if (jarOutputStream != null) {
try {
jarOutputStream.close();