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));
             }


Reply via email to