Revision: 6579
          http://sourceforge.net/p/jump-pilot/code/6579
Author:   edso
Date:     2020-10-05 19:43:52 +0000 (Mon, 05 Oct 2020)
Log Message:
-----------
add multiple extension dirs support, needed eg. in eclipse where lib/ext/ and 
lib/plus/ are separate folders. might be usable in the future to place each 
extension in their own folder.
use by giving multiple -plug-in-directory params eg. -plug-in-directory 
"lib\plus" -plug-in-directory "lib\ext"

Modified Paths:
--------------
    core/trunk/src/com/vividsolutions/jump/workbench/JUMPWorkbench.java
    core/trunk/src/com/vividsolutions/jump/workbench/plugin/PlugInManager.java

Modified: core/trunk/src/com/vividsolutions/jump/workbench/JUMPWorkbench.java
===================================================================
--- core/trunk/src/com/vividsolutions/jump/workbench/JUMPWorkbench.java 
2020-10-04 21:18:10 UTC (rev 6578)
+++ core/trunk/src/com/vividsolutions/jump/workbench/JUMPWorkbench.java 
2020-10-05 19:43:52 UTC (rev 6579)
@@ -267,27 +267,44 @@
     properties = new WorkbenchPropertiesFile(files, frame);
     
     // -- end new
-    File extensionsDirectory;
+    
+    File extensionsDirectory = null;
+    List<File> moreDirs = new ArrayList<File>();
     if (commandLine.hasOption(PLUG_IN_DIRECTORY_OPTION)) {
-      extensionsDirectory = new File(commandLine.getOption(
-          PLUG_IN_DIRECTORY_OPTION).getArg(0));
-      if (!extensionsDirectory.exists()) {
-        Logger.warn("Extensions directory does not exist: "
-                + extensionsDirectory);
-        extensionsDirectory = null;
+      // we support multiple -plug-in-directory definitions, where the first 
is set default
+      // and all others and contained jar/zip files get added to classpath 
below
+      // this mainly helps when run during development where lib/plus/ & 
lib/ext/ are different folders
+      Iterator<String> paths = 
commandLine.getAllArguments(PLUG_IN_DIRECTORY_OPTION);
+      while (paths.hasNext()) {
+        String path = paths.next();
+        if (extensionsDirectory == null) {
+          // first entry get's default
+          extensionsDirectory = new File(path);
+          Logger.debug("Set plugin-dir -> "+path);
+          continue;
+        }
+        // rest get's added to classloader
+        File dir = new File(path);
+        if (!dir.exists()) {
+          Logger.error("given parameter "+PLUG_IN_DIRECTORY_OPTION+" 
'"+path+"' does not exist.");
+          continue;
+        }
+        Logger.debug("Add plugin-dir -> "+path);
+        moreDirs.add(dir);
       }
     } else {
       extensionsDirectory = new File("lib/ext");
-      if (!extensionsDirectory.exists()) {
-        // Added further information so that debug user will know where
-        // it is actually looking for as the extension directory. [Ed Deen]
-        Logger.warn("Extensions directory does not exist: "
-                + extensionsDirectory + " where homedir = ["
-                + System.getProperty("user.dir") + "]");
-        extensionsDirectory = null;
-      }
     }
 
+    if (!extensionsDirectory.exists()) {
+      // Added further information so that debug user will know where
+      // it is actually looking for as the extension directory. [Ed Deen]
+      Logger.error("Extensions directory does not exist: "
+              + extensionsDirectory + " where homedir = ["
+              + System.getProperty("user.dir") + "]");
+      extensionsDirectory = null;
+    }
+
     // [ede 12.2012] deprecated -project option
     if (commandLine.hasOption(INITIAL_PROJECT_FILE)) {
       String task = commandLine.getOption(INITIAL_PROJECT_FILE).getArg(0);
@@ -308,7 +325,14 @@
       }
     }
 
+    // create plugin manager
     plugInManager = new PlugInManager(context, extensionsDirectory, monitor);
+    // add secondary extension folders (mainly for dev where we have lib/ext/ 
& lib/plus/)
+    for (File dir : moreDirs) {
+      plugInManager.addExtensionDir(dir);
+    }
+    // debugging output of all urls in our classloader
+    Logger.debug("Classpath -> 
"+Arrays.toString(plugInManager.getClassLoader().getURLs()));
 
     // Load drivers before initializing the frame because part of the frame
     // initialization is the initialization of the driver dialogs. [Jon

Modified: 
core/trunk/src/com/vividsolutions/jump/workbench/plugin/PlugInManager.java
===================================================================
--- core/trunk/src/com/vividsolutions/jump/workbench/plugin/PlugInManager.java  
2020-10-04 21:18:10 UTC (rev 6578)
+++ core/trunk/src/com/vividsolutions/jump/workbench/plugin/PlugInManager.java  
2020-10-05 19:43:52 UTC (rev 6579)
@@ -30,7 +30,6 @@
 import java.io.FileFilter;
 import java.net.MalformedURLException;
 import java.net.URL;
-import java.net.URLClassLoader;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -67,9 +66,9 @@
 
     private TaskMonitor monitor;
     private WorkbenchContext context;
-    private Collection configurations = new ArrayList();
+    private Collection<Configuration> configurations = new ArrayList();
 
-    private File plugInDirectory;
+    private List<File> extensionDirs = new ArrayList<File>();
     private PlugInClassLoader classLoader;
 
     /**
@@ -79,8 +78,6 @@
     public PlugInManager(WorkbenchContext context, File plugInDirectory,
             TaskMonitor monitor) throws Exception {
         this.monitor = monitor;
-        Assert.isTrue((plugInDirectory == null)
-                || plugInDirectory.isDirectory());
 
 //          class ExtendedURLClassLoader extends URLClassLoader{
 //
@@ -144,7 +141,6 @@
         // add plugin folder and recursively all jar/zip files in it to 
classpath
         if ( plugInDirectory instanceof File ) {
           addExtensionDir(plugInDirectory);
-          this.plugInDirectory = plugInDirectory;
         }
 
         I18N.setClassLoader(classLoader);
@@ -152,10 +148,17 @@
     }
 
     public void addExtensionDir(File dir) {
+      // already added? we don't want duplicates
+      if (extensionDirs.contains(dir))
+        return;
+
+      // add contained jars/zips and base folder to classloader
       ArrayList<File> files = new ArrayList();
       files.add( dir );
       files.addAll( findFilesRecursively( dir,true) );
       classLoader.addUrls(toURLs(files));
+      // add to internal list
+      extensionDirs.add(dir);
     }
 
     // pretty much the main method, finds and loads extensions from
@@ -170,9 +173,11 @@
   
       // Find the configurations right away so they get reported to the splash
       // screen ASAP. [Jon Aquino]
-      if (plugInDirectory != null) {
+      if (!extensionDirs.isEmpty()) {
         start = Timer.milliSecondsSince(0);
-        configurations.addAll(findConfigurations(plugInDirectory));
+        for (File dir : extensionDirs) {
+          configurations.addAll(findConfigurations(dir));
+        }
         Logger.info("Finding all OJ extensions took "
             + Timer.secondsSinceString(start) + "s");
       }
@@ -511,10 +516,21 @@
     public PlugInClassLoader getClassLoader() {
         return classLoader;
     }
+
     /**
+     * fetch a list of folders holding extension jars that were added during 
start 
+     */
+    public List<File> getExtensionDirs(){
+      return Collections.unmodifiableList(extensionDirs);
+    }
+
+    /**
+     * get extension folder, cloned to prevent modification
+     * @deprecated use {@link #getExtensionDirs()}
      * @return possibly null
      */
+    @Deprecated
     public File getPlugInDirectory() {
-        return plugInDirectory;
+      return extensionDirs.isEmpty() ? null : new 
File(extensionDirs.get(0).toURI());
     }
 }
\ No newline at end of file



_______________________________________________
Jump-pilot-devel mailing list
Jump-pilot-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel

Reply via email to