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