You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ad...@apache.org on 2011/03/20 21:02:48 UTC

svn commit: r1083554 - in /ofbiz/trunk/framework: base/src/org/ofbiz/base/container/ComponentContainer.java start/src/org/ofbiz/base/start/Classpath.java

Author: adrianc
Date: Sun Mar 20 20:02:48 2011
New Revision: 1083554

URL: http://svn.apache.org/viewvc?rev=1083554&view=rev
Log:
Some bug fixes and improvements to ComponentContainer.java and Classpath.java:

1. <classpath type="dir" .../> did not add jar files to the classpath. That has been fixed.
2. <classpath type="dir" .../> that contained an invalid path was added to the classpath anyway. That has been fixed.
3. Added ability to load native libraries (*.dll, *.so).

Modified:
    ofbiz/trunk/framework/base/src/org/ofbiz/base/container/ComponentContainer.java
    ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Classpath.java

Modified: ofbiz/trunk/framework/base/src/org/ofbiz/base/container/ComponentContainer.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/base/src/org/ofbiz/base/container/ComponentContainer.java?rev=1083554&r1=1083553&r2=1083554&view=diff
==============================================================================
--- ofbiz/trunk/framework/base/src/org/ofbiz/base/container/ComponentContainer.java (original)
+++ ofbiz/trunk/framework/base/src/org/ofbiz/base/container/ComponentContainer.java Sun Mar 20 20:02:48 2011
@@ -48,6 +48,7 @@ public class ComponentContainer implemen
 
     //protected static List loadedComponents2 = null;
     protected Classpath classPath = new Classpath(System.getProperty("java.class.path"));
+    protected Classpath libraryPath = new Classpath(System.getProperty("java.library.path"));
     protected String configFileLocation = null;
     private boolean loaded = false;
     private String instrumenterClassName;
@@ -137,6 +138,7 @@ public class ComponentContainer implemen
         if (updateClasspath) {
             classPath.instrument(instrumenterFile, instrumenterClassName);
             System.setProperty("java.class.path", classPath.toString());
+            System.setProperty("java.library.path", libraryPath.toString());
             ClassLoader cl = classPath.getClassLoader();
             Thread.currentThread().setContextClassLoader(cl);
         }
@@ -242,39 +244,47 @@ public class ComponentContainer implemen
             configRoot = configRoot + "/";
         }
         if (classpathInfos != null) {
+            String nativeLibExt = System.mapLibraryName("someLib").replace("someLib", "").toLowerCase();
             for (ComponentConfig.ClasspathInfo cp: classpathInfos) {
                 String location = cp.location.replace('\\', '/');
                 // set the location to not have a leading slash
                 if (location.startsWith("/")) {
                     location = location.substring(1);
                 }
-                if ("dir".equals(cp.type)) {
-                    classPath.addComponent(configRoot + location);
-                } else if ("jar".equals(cp.type)) {
-                    String dirLoc = location;
-                    if (dirLoc.endsWith("/*")) {
-                        // strip off the slash splat
-                        dirLoc = location.substring(0, location.length() - 2);
-                    }
-                    File path = FileUtil.getFile(configRoot + dirLoc);
-                    if (path.exists()) {
-                        if (path.isDirectory()) {
-                            // load all .jar and .zip files in this directory
-                            for (File file: path.listFiles()) {
-                                String fileName = file.getName();
-                                if (fileName.endsWith(".jar") || fileName.endsWith(".zip")) {
-                                    classPath.addComponent(file);
-                                }
-                            }
-                        } else {
-                            // add a single file
+                if (!"jar".equals(cp.type) && !"dir".equals(cp.type)) {
+                    Debug.logError("Classpath type '" + cp.type + "' is not supported; '" + location + "' not loaded", module);
+                    continue;
+                }
+                String dirLoc = location;
+                if (dirLoc.endsWith("/*")) {
+                    // strip off the slash splat
+                    dirLoc = location.substring(0, location.length() - 2);
+                }
+                File path = FileUtil.getFile(configRoot + dirLoc);
+                if (path.exists()) {
+                    if (path.isDirectory()) {
+                        if ("dir".equals(cp.type)) {
                             classPath.addComponent(configRoot + location);
                         }
+                        // load all .jar, .zip files and native libs in this directory
+                        boolean containsNativeLibs = false;
+                        for (File file: path.listFiles()) {
+                            String fileName = file.getName().toLowerCase();
+                            if (fileName.endsWith(".jar") || fileName.endsWith(".zip")) {
+                                classPath.addComponent(file);
+                            } else if (fileName.endsWith(nativeLibExt)) {
+                                containsNativeLibs = true;
+                            }
+                        }
+                        if (containsNativeLibs) {
+                            libraryPath.addComponent(path);
+                        }
                     } else {
-                        Debug.logWarning("Location '" + configRoot + dirLoc + "' does not exist", module);
+                        // add a single file
+                        classPath.addComponent(configRoot + location);
                     }
                 } else {
-                    Debug.logError("Classpath type '" + cp.type + "' is not supported; '" + location + "' not loaded", module);
+                    Debug.logWarning("Location '" + configRoot + dirLoc + "' does not exist", module);
                 }
             }
         }

Modified: ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Classpath.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Classpath.java?rev=1083554&r1=1083553&r2=1083554&view=diff
==============================================================================
--- ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Classpath.java (original)
+++ ofbiz/trunk/framework/start/src/org/ofbiz/base/start/Classpath.java Sun Mar 20 20:02:48 2011
@@ -133,12 +133,36 @@ public class Classpath {
     }
 
     public ClassLoader getClassLoader(ClassLoader parent) {
-        URL[] urls = getUrls();
-
-        return new URLClassLoader(urls, parent);
+        return new NativeLibClassLoader(getUrls(), parent);
     }
 
     public List<File> getElements() {
         return _elements;
     }
+
+    /*
+     * Native library class loader. This class is necessary because the
+     * bootstrap ClassLoader caches the native library path - so any
+     * changes to the library path are ignored (changes that might have
+     * been made by loading OFBiz components). 
+     */
+    private class NativeLibClassLoader extends URLClassLoader {
+
+        private NativeLibClassLoader(URL[] urls, ClassLoader parent) {
+            super(urls, parent);
+        }
+        
+        @Override
+        protected String findLibrary(String libname) {
+            String[] libPaths = System.getProperty("java.library.path").split(File.pathSeparator);
+            String libFileName = System.mapLibraryName(libname);
+            for (String path : libPaths) {
+                File libFile = new File(path, libFileName);
+                if (libFile.exists()) {
+                    return libFile.getAbsolutePath();
+                }
+            }
+            return null;
+        }
+    }
 }