Author: dblevins
Date: Thu Feb 3 02:34:26 2011
New Revision: 1066723
URL: http://svn.apache.org/viewvc?rev=1066723&view=rev
Log:
OPENEJB-1427: PersistenceUnit jar-file paths preserved when already absolute
and points to an existing file
OPENEJB-1428: PersistenceUnit jar-file paths resolve to classpath jars when
using embedded container
Modified:
openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java
openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/persistence/PersistenceUnitInfoImpl.java
Modified:
openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
URL:
http://svn.apache.org/viewvc/openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java?rev=1066723&r1=1066722&r2=1066723&view=diff
==============================================================================
---
openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
(original)
+++
openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/config/AutoConfig.java
Thu Feb 3 02:34:26 2011
@@ -28,6 +28,7 @@ import org.apache.openejb.config.sys.Res
import org.apache.openejb.assembler.classic.ContainerInfo;
import org.apache.openejb.assembler.classic.ResourceInfo;
import org.apache.openejb.util.LinkResolver;
+import org.apache.openejb.util.URLs;
import org.apache.openejb.util.UniqueDefaultLinkResolver;
import org.apache.openejb.jee.MessageDrivenBean;
import org.apache.openejb.jee.ActivationConfig;
@@ -63,6 +64,10 @@ import static org.apache.openejb.util.Jo
import javax.jms.Queue;
import javax.jms.Topic;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
import java.util.List;
import java.util.Map;
import java.util.Properties;
@@ -1261,8 +1266,89 @@ public class AutoConfig implements Dynam
if (jtaDataSourceId != null) setJtaDataSource(unit,
jtaDataSourceId);
if (nonJtaDataSourceId != null) setNonJtaDataSource(unit,
nonJtaDataSourceId);
}
+
+ // Attempt to resolve the jar-file references to things in the actual
classpath
+ // Usually these paths are relative to the persistence unit root
inside the archive
+ // but in a classpath things are spread out side-by-side
+ if ("classpath.ear".equals(app.getModuleId())) {
+ Map<String, File> map = null;
+ for (PersistenceUnit unit : persistence.getPersistenceUnit()) {
+
+ List<String> jarFiles = unit.getJarFile();
+ for (int i = 0; i < jarFiles.size(); i++) {
+
+ String earRelativeJarFileLocation = jarFiles.get(i);
+ if (map == null) {
+ if (app.getAdditionalLibraries().size() > 0) {
+ map = mapLibs(app.getAdditionalLibraries());
+ } else {
+ map = mapLibs(classPathLibs(app));
+ }
+ }
+
+ String resolvedPath = resolveJarFileRef(map,
earRelativeJarFileLocation);
+
+
+ if (resolvedPath != null) {
+ logger.info("Adjusting
PersistenceUnit(id="+unit.getName()+")
<jar-file>"+earRelativeJarFileLocation+"</jar-file> to
<jar-file>"+resolvedPath+"</jar-file>");
+
+ jarFiles.set(i, resolvedPath);
+ }
+
+ }
+ }
+ }
}
+ private String resolveJarFileRef(Map<String, File> map, String
earRelativeJarFileLocation) {
+ File resolved = map.get(earRelativeJarFileLocation);
+
+ if (resolved != null) return resolved.getAbsolutePath();
+
+ String relative = earRelativeJarFileLocation;
+
+ search: while (resolved == null) {
+ for (String path : map.keySet()) {
+ if (path.endsWith(relative)) {
+ resolved = map.get(path);
+ break search;
+ }
+ }
+
+ // Trim off a part of the path and try again
+ int i = relative.indexOf('/');
+ if (i >= 0) {
+ relative = relative.substring(i+1);
+ } else {
+ return null;
+ }
+ }
+
+ return (resolved == null) ? null : resolved.getAbsolutePath();
+ }
+
+
+ private List<URL> classPathLibs(AppModule app) {
+ try {
+ return DeploymentsResolver.filteredClasspath(app.getClassLoader());
+ } catch (IOException e) {
+ logger.warning("Unable to determine jars in classpath for
resolving persistenceUnit.jarFile list");
+ return Collections.EMPTY_LIST;
+ }
+ }
+
+ private Map<String, File> mapLibs(List<URL> libs) {
+ Map<String, File> map = new HashMap<String, File>();
+
+ for (URL url : libs) {
+ File file = URLs.toFile(url);
+ map.put(file.getAbsolutePath(), file);
+ }
+
+ return map;
+ }
+
+
private void setNonJtaDataSource(PersistenceUnit unit, String current) {
Modified:
openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
URL:
http://svn.apache.org/viewvc/openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java?rev=1066723&r1=1066722&r2=1066723&view=diff
==============================================================================
---
openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
(original)
+++
openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/config/ConfigurationFactory.java
Thu Feb 3 02:34:26 2011
@@ -109,7 +109,7 @@ public class ConfigurationFactory implem
private DynamicDeployer deployer;
private final DeploymentLoader deploymentLoader;
private final boolean offline;
- private static final String CLASSPATH_AS_EAR =
"openejb.deployments.classpath.ear";
+ public static final String CLASSPATH_AS_EAR =
"openejb.deployments.classpath.ear";
static final String WEBSERVICES_ENABLED = "openejb.webservices.enabled";
public ConfigurationFactory() {
Modified:
openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java
URL:
http://svn.apache.org/viewvc/openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java?rev=1066723&r1=1066722&r2=1066723&view=diff
==============================================================================
---
openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java
(original)
+++
openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/config/DeploymentsResolver.java
Thu Feb 3 02:34:26 2011
@@ -145,6 +145,18 @@ public class DeploymentsResolver {
}
}
+ public static List<URL> filteredClasspath(ClassLoader classLoader) throws
IOException {
+ UrlSet urlSet = new UrlSet(classLoader);
+ urlSet = urlSet.excludeJavaExtDirs();
+ urlSet = urlSet.excludeJavaEndorsedDirs();
+ urlSet = urlSet.excludeJavaHome();
+ urlSet = urlSet.excludePaths(System.getProperty("sun.boot.class.path",
""));
+ urlSet = urlSet.exclude(".*/JavaVM.framework/.*");
+// urlSet = applyBuiltinExcludes(urlSet);
+
+ return urlSet.getUrls();
+ }
+
/**
* The algorithm of OpenEJB deployments class-path inclusion and exclusion
is implemented as follows:
* 1- If the string value of the resource URL matches the include
class-path pattern
@@ -161,7 +173,7 @@ public class DeploymentsResolver {
* 2- Loading the resource is the default behaviour in case of not
defining a value for any class-path pattern
* This appears in step 3 of the above algorithm.
*/
- public static void loadFromClasspath(FileUtils base, List<String> jarList,
ClassLoader classLoader) {
+ public static List<URL> loadFromClasspath(FileUtils base, List<String>
jarList, ClassLoader classLoader) {
Options options = SystemInstance.get().getOptions();
String include = options.get(CLASSPATH_INCLUDE, "");
@@ -196,9 +208,9 @@ public class DeploymentsResolver {
int size = urls.size();
if (size == 0 && include.length() > 0) {
logger.warning("No classpath URLs matched. Current settings:
" + CLASSPATH_EXCLUDE + "='" + exclude + "', " + CLASSPATH_INCLUDE + "='" +
include + "'");
- return;
+ return urls;
} else if (size == 0 && (!filterDescriptors &&
prefiltered.getUrls().size() == 0)) {
- return;
+ return urls;
} else if (size < 20) {
logger.debug("Inspecting classpath for applications: " +
urls.size() + " urls.");
} else {
@@ -237,7 +249,7 @@ public class DeploymentsResolver {
}
}
- if (urls.size() == 0) return;
+ if (urls.size() == 0) return urls;
if (time < 1000) {
logger.debug("Searched " + urls.size() + " classpath urls in "
+ time + " milliseconds. Average " + (time / urls.size()) + " milliseconds per
url.");
@@ -258,9 +270,12 @@ public class DeploymentsResolver {
logger.info("Matched: " + url);
}
}
+
+ return urls;
} catch (IOException e1) {
e1.printStackTrace();
logger.warning("Unable to search classpath for modules: Received
Exception: " + e1.getClass().getName() + " " + e1.getMessage(), e1);
+ return Collections.EMPTY_LIST;
}
}
Modified:
openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/persistence/PersistenceUnitInfoImpl.java
URL:
http://svn.apache.org/viewvc/openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/persistence/PersistenceUnitInfoImpl.java?rev=1066723&r1=1066722&r2=1066723&view=diff
==============================================================================
---
openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/persistence/PersistenceUnitInfoImpl.java
(original)
+++
openejb/branches/openejb-3.1.x/container/openejb-core/src/main/java/org/apache/openejb/persistence/PersistenceUnitInfoImpl.java
Thu Feb 3 02:34:26 2011
@@ -196,7 +196,12 @@ public class PersistenceUnitInfoImpl imp
try {
for (String path : jarFiles) {
- File file = new File(root, path);
+
+ File file = new File(path);
+ if (!file.isAbsolute() || !file.exists()) {
+ file = new File(root, path);
+ }
+
file = file.getCanonicalFile();
jarFileUrls.add(toUrl(file));
}