Commit 11bcac00b0f72faba0df367d841402026f3400fd

Authored by Mumfrey
1 parent 1bc2d41a

don't add file to classpath if the file is already present on the classpath - Test #67

java/common/com/mumfrey/liteloader/core/api/EnumeratorModuleFolder.java
... ... @@ -48,12 +48,13 @@ public class EnumeratorModuleFolder implements FilenameFilter, EnumeratorModule
48 48  
49 49 protected boolean readJarFiles;
50 50 protected boolean loadTweaks;
  51 + protected boolean forceInjection;
51 52  
52 53 /**
53 54 * True if this is a versioned folder and the enumerator should also try to load tweak jars which would normally be ignored
54 55 */
55 56 protected final boolean loadTweakJars;
56   -
  57 +
57 58 public EnumeratorModuleFolder(LiteLoaderCoreAPI coreAPI, File directory, boolean loadTweakJars)
58 59 {
59 60 this.coreAPI = coreAPI;
... ... @@ -66,6 +67,7 @@ public class EnumeratorModuleFolder implements FilenameFilter, EnumeratorModule
66 67 {
67 68 this.loadTweaks = properties.loadTweaksEnabled();
68 69 this.readJarFiles = properties.getAndStoreBooleanProperty(LoaderProperties.OPTION_SEARCH_JARFILES, true);
  70 + this.forceInjection = properties.getAndStoreBooleanProperty(LoaderProperties.OPTION_FORCE_INJECTION, false);
69 71  
70 72 this.coreAPI.writeDiscoverySettings();
71 73 }
... ... @@ -77,6 +79,7 @@ public class EnumeratorModuleFolder implements FilenameFilter, EnumeratorModule
77 79 public void writeSettings(LoaderEnvironment environment, LoaderProperties properties)
78 80 {
79 81 properties.setBooleanProperty(LoaderProperties.OPTION_SEARCH_JARFILES, this.readJarFiles);
  82 + properties.setBooleanProperty(LoaderProperties.OPTION_FORCE_INJECTION, this.forceInjection);
80 83 }
81 84  
82 85 /* (non-Javadoc)
... ... @@ -146,6 +149,7 @@ public class EnumeratorModuleFolder implements FilenameFilter, EnumeratorModule
146 149 for (File file : this.directory.listFiles(this.getFilenameFilter()))
147 150 {
148 151 LoadableFile candidateFile = new LoadableFile(file);
  152 + candidateFile.setForceInjection(this.forceInjection);
149 153 try
150 154 {
151 155 this.inspectFile(enumerator, candidateFile);
... ...
java/common/com/mumfrey/liteloader/interfaces/LoadableFile.java
... ... @@ -39,6 +39,8 @@ public class LoadableFile extends File implements TweakContainer<File>
39 39 */
40 40 protected boolean injected;
41 41  
  42 + protected boolean forceInjection;
  43 +
42 44 /**
43 45 * Position to inject the mod file at in the class path, if blank injects at the bottom as usual, alternatively
44 46 * the developer can specify "top" to inject at the top, "base" to inject above the game jar, or "above: name" to
... ... @@ -87,6 +89,7 @@ public class LoadableFile extends File implements TweakContainer<File>
87 89 {
88 90 super(file.getAbsolutePath());
89 91 this.displayName = this.getName();
  92 + this.forceInjection = file.forceInjection;
90 93 this.assignJarMetaData(file);
91 94 }
92 95  
... ... @@ -295,6 +298,15 @@ public class LoadableFile extends File implements TweakContainer<File>
295 298 return new ArrayList<String>();
296 299 }
297 300  
  301 + public boolean isInjectionForced()
  302 + {
  303 + return this.forceInjection;
  304 + }
  305 +
  306 + public void setForceInjection(boolean forceInjection)
  307 + {
  308 + this.forceInjection = forceInjection;
  309 + }
298 310  
299 311 @Override
300 312 public boolean isInjected()
... ... @@ -307,6 +319,15 @@ public class LoadableFile extends File implements TweakContainer&lt;File&gt;
307 319 {
308 320 if (!this.injected)
309 321 {
  322 + this.injected = true;
  323 +
  324 + boolean isOnClassPath = ClassPathUtilities.isJarOnClassPath(this, classLoader);
  325 + if (!this.forceInjection && isOnClassPath)
  326 + {
  327 + LiteLoaderLogger.info("%s already exists on the classpath, skipping injection", this);
  328 + return false;
  329 + }
  330 +
310 331 ClassPathUtilities.injectIntoClassPath(classLoader, this.getURL(), this.getInjectionStrategy());
311 332  
312 333 if (injectIntoParent)
... ... @@ -314,8 +335,8 @@ public class LoadableFile extends File implements TweakContainer&lt;File&gt;
314 335 LiteLoaderTweaker.addURLToParentClassLoader(this.getURL());
315 336 }
316 337  
317   - this.injected = true;
318 338 return true;
  339 +
319 340 }
320 341  
321 342 return false;
... ...
java/common/com/mumfrey/liteloader/launch/ClassPathUtilities.java
... ... @@ -232,11 +232,21 @@ public abstract class ClassPathUtilities
232 232 */
233 233 public static boolean isJarOnClassPath(File jarFile)
234 234 {
  235 + URLClassLoader classLoader = (URLClassLoader)Launch.class.getClassLoader();
  236 + return ClassPathUtilities.isJarOnClassPath(jarFile, classLoader);
  237 + }
  238 +
  239 + /**
  240 + * @param jarFile
  241 + * @param classLoader
  242 + */
  243 + public static boolean isJarOnClassPath(File jarFile, URLClassLoader classLoader)
  244 + {
235 245 try
236 246 {
237 247 String jarURL = jarFile.toURI().toURL().toString();
238 248  
239   - URL[] classPath = ((URLClassLoader)Launch.class.getClassLoader()).getURLs();
  249 + URL[] classPath = classLoader.getURLs();
240 250 for (URL classPathEntry : classPath)
241 251 {
242 252 if (classPathEntry.toString().equals(jarURL))
... ...
java/common/com/mumfrey/liteloader/launch/LoaderProperties.java
... ... @@ -96,4 +96,5 @@ public interface LoaderProperties
96 96 public static final String OPTION_SEARCH_MODS = "search.mods";
97 97 public static final String OPTION_SEARCH_CLASSPATH = "search.classpath";
98 98 public static final String OPTION_SEARCH_JARFILES = "search.jarfiles";
  99 + public static final String OPTION_FORCE_INJECTION = "forceInjection";
99 100 }
... ...