You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by rm...@apache.org on 2012/03/27 11:30:30 UTC
svn commit: r1305790 - in /lucene/dev/trunk/lucene:
core/src/java/org/apache/lucene/util/NamedSPILoader.java
test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java
Author: rmuir
Date: Tue Mar 27 09:30:30 2012
New Revision: 1305790
URL: http://svn.apache.org/viewvc?rev=1305790&view=rev
Log:
LUCENE-3927: allow running trunk tests with IBM JRE
Modified:
lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/util/NamedSPILoader.java
lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java
Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/util/NamedSPILoader.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/util/NamedSPILoader.java?rev=1305790&r1=1305789&r2=1305790&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/util/NamedSPILoader.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/util/NamedSPILoader.java Tue Mar 27 09:30:30 2012
@@ -31,6 +31,14 @@ import java.util.ServiceLoader;
public final class NamedSPILoader<S extends NamedSPILoader.NamedSPI> implements Iterable<S> {
private final Map<String,S> services;
+
+ /** This field is a hack for LuceneTestCase to get access
+ * to the modifiable map (to work around bugs in IBM J9) */
+ @SuppressWarnings("unused")
+ @Deprecated
+ // Hackidy-Häck-Hack for bugs in IBM J9 ServiceLoader
+ private final Map<String,S> modifiableServices;
+
private final Class<S> clazz;
public NamedSPILoader(Class<S> clazz) {
@@ -46,6 +54,7 @@ public final class NamedSPILoader<S exte
services.put(name, service);
}
}
+ this.modifiableServices = services; // hack, remove when IBM J9 is fixed!
this.services = Collections.unmodifiableMap(services);
}
Modified: lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java?rev=1305790&r1=1305789&r2=1305790&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java (original)
+++ lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java Tue Mar 27 09:30:30 2012
@@ -327,6 +327,32 @@ public abstract class LuceneTestCase ext
System.setProperty("solr.directoryFactory", "org.apache.solr.core.MockDirectoryFactory");
}
+ // enable the Lucene 3.x PreflexRW codec explicitly, to work around bugs in IBM J9 / Harmony ServiceLoader:
+ try {
+ final java.lang.reflect.Field spiLoaderField = Codec.class.getDeclaredField("loader");
+ spiLoaderField.setAccessible(true);
+ final Object spiLoader = spiLoaderField.get(null);
+ final java.lang.reflect.Field modifiableServicesField = NamedSPILoader.class.getDeclaredField("modifiableServices");
+ modifiableServicesField.setAccessible(true);
+ @SuppressWarnings({"unchecked","rawtypes"}) final Map<String,Codec> serviceMap =
+ (Map) modifiableServicesField.get(spiLoader);
+ if (!(Codec.forName("Lucene3x") instanceof PreFlexRWCodec)) {
+ if (Constants.JAVA_VENDOR.startsWith("IBM")) {
+ // definitely a buggy version
+ System.err.println("ERROR: Your VM's java.util.ServiceLoader implementation is buggy"+
+ " and does not respect classpath order, please report this to the vendor.");
+ } else {
+ // could just be a classpath issue
+ System.err.println("ERROR: fix your classpath to have tests-framework.jar before lucene-core.jar!"+
+ " If you have already done this, then your VM's java.util.ServiceLoader implementation is buggy"+
+ " and does not respect classpath order, please report this to the vendor.");
+ }
+ serviceMap.put("Lucene3x", new PreFlexRWCodec());
+ }
+ } catch (Exception e) {
+ throw new RuntimeException("Cannot access internals of Codec and NamedSPILoader classes", e);
+ }
+
// if verbose: print some debugging stuff about which codecs are loaded
if (VERBOSE) {
Set<String> codecs = Codec.availableCodecs();