You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by us...@apache.org on 2015/09/13 03:24:20 UTC

svn commit: r1702691 - in /lucene/dev/branches/branch_5x: ./ lucene/ lucene/core/ lucene/core/src/java/org/apache/lucene/index/ lucene/core/src/java/org/apache/lucene/store/ lucene/core/src/java/org/apache/lucene/util/ lucene/core/src/test/org/apache/l...

Author: uschindler
Date: Sun Sep 13 01:24:20 2015
New Revision: 1702691

URL: http://svn.apache.org/r1702691
Log:
Merged revision(s) 1702690 from lucene/dev/trunk:
LUCENE-6795: Forbid AccessibleObject#setAccessible and suppress legitimate uses / wrap with doPrivileged

Added:
    lucene/dev/branches/branch_5x/lucene/test-framework/src/java/org/apache/lucene/index/IndexWriterMaxDocsChanger.java
      - copied unchanged from r1702690, lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/index/IndexWriterMaxDocsChanger.java
Modified:
    lucene/dev/branches/branch_5x/   (props changed)
    lucene/dev/branches/branch_5x/lucene/   (props changed)
    lucene/dev/branches/branch_5x/lucene/core/   (props changed)
    lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterDeleteQueue.java
    lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/store/MMapDirectory.java
    lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/util/AttributeImpl.java
    lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/index/TestDocumentsWriterDeleteQueue.java
    lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterOnJRECrash.java
    lucene/dev/branches/branch_5x/lucene/sandbox/   (props changed)
    lucene/dev/branches/branch_5x/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/regex/JakartaRegexpCapabilities.java
    lucene/dev/branches/branch_5x/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/regex/JavaUtilRegexCapabilities.java
    lucene/dev/branches/branch_5x/lucene/test-framework/   (props changed)
    lucene/dev/branches/branch_5x/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java
    lucene/dev/branches/branch_5x/lucene/test-framework/src/java/org/apache/lucene/util/RamUsageTester.java
    lucene/dev/branches/branch_5x/lucene/tools/   (props changed)
    lucene/dev/branches/branch_5x/lucene/tools/forbiddenApis/base.txt
    lucene/dev/branches/branch_5x/solr/   (props changed)
    lucene/dev/branches/branch_5x/solr/contrib/   (props changed)
    lucene/dev/branches/branch_5x/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/FieldStreamDataSource.java
    lucene/dev/branches/branch_5x/solr/core/   (props changed)
    lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/SolrXmlInZkTest.java
    lucene/dev/branches/branch_5x/solr/solrj/   (props changed)
    lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/client/solrj/beans/DocumentObjectBinder.java
    lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/common/cloud/SolrZooKeeper.java
    lucene/dev/branches/branch_5x/solr/solrj/src/test/org/apache/solr/client/solrj/SolrExampleTests.java
    lucene/dev/branches/branch_5x/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleStreamingTest.java

Modified: lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterDeleteQueue.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterDeleteQueue.java?rev=1702691&r1=1702690&r2=1702691&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterDeleteQueue.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/index/DocumentsWriterDeleteQueue.java Sun Sep 13 01:24:20 2015
@@ -79,8 +79,9 @@ final class DocumentsWriterDeleteQueue i
 
   private final DeleteSlice globalSlice;
   private final BufferedUpdates globalBufferedUpdates;
-  /* only acquired to update the global deletes */
-  private final ReentrantLock globalBufferLock = new ReentrantLock();
+  
+  // only acquired to update the global deletes, pkg-private for access by tests:
+  final ReentrantLock globalBufferLock = new ReentrantLock();
 
   final long generation;
   

Modified: lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/store/MMapDirectory.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/store/MMapDirectory.java?rev=1702691&r1=1702690&r2=1702691&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/store/MMapDirectory.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/store/MMapDirectory.java Sun Sep 13 01:24:20 2015
@@ -35,6 +35,7 @@ import java.lang.reflect.Method;
 
 import org.apache.lucene.store.ByteBufferIndexInput.BufferCleaner;
 import org.apache.lucene.util.Constants;
+import org.apache.lucene.util.SuppressForbidden;
 
 /** File-based {@link Directory} implementation that uses
  *  mmap for reading, and {@link
@@ -164,6 +165,7 @@ public class MMapDirectory extends FSDir
    */
   public static final boolean UNMAP_SUPPORTED = AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
     @Override
+    @SuppressForbidden(reason = "Java 9 Jigsaw whitelists access to sun.misc.Cleaner, so setAccessible works")
     public Boolean run() {
       try {
         Class<?> clazz = Class.forName("java.nio.DirectByteBuffer");
@@ -313,6 +315,7 @@ public class MMapDirectory extends FSDir
       try {
         AccessController.doPrivileged(new PrivilegedExceptionAction<Void>() {
           @Override
+          @SuppressForbidden(reason = "Java 9 Jigsaw whitelists access to sun.misc.Cleaner, so setAccessible works")
           public Void run() throws Exception {
             final Method getCleanerMethod = buffer.getClass()
               .getMethod("cleaner");

Modified: lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/util/AttributeImpl.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/util/AttributeImpl.java?rev=1702691&r1=1702690&r2=1702691&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/util/AttributeImpl.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/java/org/apache/lucene/util/AttributeImpl.java Sun Sep 13 01:24:20 2015
@@ -106,6 +106,7 @@ public abstract class AttributeImpl impl
       if (Modifier.isStatic(f.getModifiers())) continue;
       reflector.reflect(interf, f.getName(), AccessController.doPrivileged(new PrivilegedAction<Object>() {
         @Override
+        @SuppressForbidden(reason = "This methods needs to access private attribute fields. Method will be abstract in 6.x")
         public Object run() {
           try {
             f.setAccessible(true);

Modified: lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/index/TestDocumentsWriterDeleteQueue.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/index/TestDocumentsWriterDeleteQueue.java?rev=1702691&r1=1702690&r2=1702691&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/index/TestDocumentsWriterDeleteQueue.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/index/TestDocumentsWriterDeleteQueue.java Sun Sep 13 01:24:20 2015
@@ -17,7 +17,6 @@ package org.apache.lucene.index;
  * the License.
  */
 
-import java.lang.reflect.Field;
 import java.util.HashSet;
 import java.util.Set;
 import java.util.concurrent.CountDownLatch;
@@ -149,10 +148,7 @@ public class TestDocumentsWriterDeleteQu
       NoSuchFieldException, IllegalArgumentException, IllegalAccessException,
       InterruptedException {
     final DocumentsWriterDeleteQueue queue = new DocumentsWriterDeleteQueue();
-    Field field = DocumentsWriterDeleteQueue.class
-        .getDeclaredField("globalBufferLock");
-    field.setAccessible(true);
-    ReentrantLock lock = (ReentrantLock) field.get(queue);
+    ReentrantLock lock = queue.globalBufferLock;
     lock.lock();
     Thread t = new Thread() {
       @Override

Modified: lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterOnJRECrash.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterOnJRECrash.java?rev=1702691&r1=1702690&r2=1702691&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterOnJRECrash.java (original)
+++ lucene/dev/branches/branch_5x/lucene/core/src/test/org/apache/lucene/index/TestIndexWriterOnJRECrash.java Sun Sep 13 01:24:20 2015
@@ -41,6 +41,7 @@ import org.apache.lucene.util.SuppressFo
 import org.apache.lucene.util.TestUtil;
 
 import com.carrotsearch.randomizedtesting.SeedUtils;
+
 /**
  * Runs TestNRTThreads in a separate process, crashes the JRE in the middle
  * of execution, then runs checkindex to make sure it's not corrupt.
@@ -187,6 +188,7 @@ public class TestIndexWriterOnJRECrash e
   /**
    * currently, this only works/tested on Sun and IBM.
    */
+  @SuppressForbidden(reason = "We need Unsafe to actually crush :-)")
   public void crashJRE() {
     final String vendor = Constants.JAVA_VENDOR;
     final boolean supportsUnsafeNpeDereference = 

Modified: lucene/dev/branches/branch_5x/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/regex/JakartaRegexpCapabilities.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/regex/JakartaRegexpCapabilities.java?rev=1702691&r1=1702690&r2=1702691&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/regex/JakartaRegexpCapabilities.java (original)
+++ lucene/dev/branches/branch_5x/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/regex/JakartaRegexpCapabilities.java Sun Sep 13 01:24:20 2015
@@ -18,9 +18,8 @@ package org.apache.lucene.sandbox.querie
  */
 
 import org.apache.lucene.util.BytesRef;
-import org.apache.lucene.util.CharsRef;
 import org.apache.lucene.util.CharsRefBuilder;
-import org.apache.lucene.util.UnicodeUtil;
+import org.apache.lucene.util.SuppressForbidden;
 import org.apache.regexp.CharacterIterator;
 import org.apache.regexp.RE;
 import org.apache.regexp.REProgram;
@@ -40,6 +39,11 @@ public class JakartaRegexpCapabilities i
   private static Method getPrefixMethod;
 
   static {
+    initClass();
+  }
+  
+  @SuppressForbidden(reason = "TODO: Remove this class completely and also the hack around setAccessible!")
+  private static void initClass() {
     try {
       getPrefixMethod = REProgram.class.getMethod("getPrefix");
     } catch (Exception e) {

Modified: lucene/dev/branches/branch_5x/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/regex/JavaUtilRegexCapabilities.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/regex/JavaUtilRegexCapabilities.java?rev=1702691&r1=1702690&r2=1702691&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/regex/JavaUtilRegexCapabilities.java (original)
+++ lucene/dev/branches/branch_5x/lucene/sandbox/src/java/org/apache/lucene/sandbox/queries/regex/JavaUtilRegexCapabilities.java Sun Sep 13 01:24:20 2015
@@ -21,9 +21,7 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import org.apache.lucene.util.BytesRef;
-import org.apache.lucene.util.CharsRef;
 import org.apache.lucene.util.CharsRefBuilder;
-import org.apache.lucene.util.UnicodeUtil;
 
 /**
  * An implementation tying Java's built-in java.util.regex to RegexQuery.

Modified: lucene/dev/branches/branch_5x/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java?rev=1702691&r1=1702690&r2=1702691&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java (original)
+++ lucene/dev/branches/branch_5x/lucene/test-framework/src/java/org/apache/lucene/util/LuceneTestCase.java Sun Sep 13 01:24:20 2015
@@ -29,7 +29,6 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.nio.file.NoSuchFileException;
 import java.nio.file.Path;
@@ -685,23 +684,12 @@ public abstract class LuceneTestCase ext
   /** Tells {@link IndexWriter} to enforce the specified limit as the maximum number of documents in one index; call
    *  {@link #restoreIndexWriterMaxDocs} once your test is done. */
   public void setIndexWriterMaxDocs(int limit) {
-    Method m;
-    try {
-      m = IndexWriter.class.getDeclaredMethod("setMaxDocs", int.class);
-    } catch (NoSuchMethodException nsme) {
-      throw new RuntimeException(nsme);
-    }
-    m.setAccessible(true);
-    try {
-      m.invoke(IndexWriter.class, limit);
-    } catch (IllegalAccessException | InvocationTargetException iae) {
-      throw new RuntimeException(iae);
-    }
+    IndexWriterMaxDocsChanger.setMaxDocs(limit);
   }
 
-  /** Returns the default {@link IndexWriter#MAX_DOCS} limit. */
+  /** Returns to the default {@link IndexWriter#MAX_DOCS} limit. */
   public void restoreIndexWriterMaxDocs() {
-    setIndexWriterMaxDocs(IndexWriter.MAX_DOCS);
+    IndexWriterMaxDocsChanger.restoreMaxDocs();
   }
 
   // -----------------------------------------------------------------

Modified: lucene/dev/branches/branch_5x/lucene/test-framework/src/java/org/apache/lucene/util/RamUsageTester.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/test-framework/src/java/org/apache/lucene/util/RamUsageTester.java?rev=1702691&r1=1702690&r2=1702691&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/test-framework/src/java/org/apache/lucene/util/RamUsageTester.java (original)
+++ lucene/dev/branches/branch_5x/lucene/test-framework/src/java/org/apache/lucene/util/RamUsageTester.java Sun Sep 13 01:24:20 2015
@@ -20,6 +20,8 @@ package org.apache.lucene.util;
 import java.lang.reflect.Array;
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
 import java.util.AbstractList;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -199,8 +201,14 @@ public final class RamUsageTester {
           shallowInstanceSize = RamUsageEstimator.adjustForField(shallowInstanceSize, f);
 
           if (!f.getType().isPrimitive()) {
-            f.setAccessible(true);
-            referenceFields.add(f);
+            referenceFields.add(AccessController.doPrivileged(new PrivilegedAction<Field>() {
+              @Override
+              @SuppressForbidden(reason = "We need to access private fields of measured objects.")
+              public Field run() {
+                f.setAccessible(true);
+                return f;
+              }
+            }));
           }
         }
       }

Modified: lucene/dev/branches/branch_5x/lucene/tools/forbiddenApis/base.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/lucene/tools/forbiddenApis/base.txt?rev=1702691&r1=1702690&r2=1702691&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/lucene/tools/forbiddenApis/base.txt (original)
+++ lucene/dev/branches/branch_5x/lucene/tools/forbiddenApis/base.txt Sun Sep 13 01:24:20 2015
@@ -27,10 +27,13 @@ java.util.Properties#load(java.io.InputS
 java.util.Properties#save(java.io.OutputStream,java.lang.String)
 java.util.Properties#store(java.io.OutputStream,java.lang.String)
 
+@defaultMessage Accessing private members of foreign classes breaks in security-sensitive environments. In addition, it no longer works with Java 9 on runtime classes.
+java.lang.reflect.AccessibleObject#setAccessible(boolean)
+java.lang.reflect.AccessibleObject#setAccessible(java.lang.reflect.AccessibleObject[],boolean)
+
 java.lang.Character#codePointBefore(char[],int) @ Implicit start offset is error-prone when the char[] is a buffer and the first chars are random chars
 java.lang.Character#codePointAt(char[],int) @ Implicit end offset is error-prone when the char[] is a buffer and the last chars are random chars
 
 java.io.File#delete() @ use Files.delete for real exception, IOUtils.deleteFilesIgnoringExceptions if you dont care
 
-@defaultMessage Use shuffle(List, Random) instead so that it can be reproduced
-java.util.Collections#shuffle(java.util.List)
+java.util.Collections#shuffle(java.util.List) @ Use shuffle(List, Random) instead so that it can be reproduced

Modified: lucene/dev/branches/branch_5x/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/FieldStreamDataSource.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/FieldStreamDataSource.java?rev=1702691&r1=1702690&r2=1702691&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/FieldStreamDataSource.java (original)
+++ lucene/dev/branches/branch_5x/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/FieldStreamDataSource.java Sun Sep 13 01:24:20 2015
@@ -16,17 +16,16 @@
  */
 package org.apache.solr.handler.dataimport;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import static org.apache.solr.handler.dataimport.DataImportHandlerException.SEVERE;
 
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
 import java.sql.Blob;
+import java.sql.SQLException;
 import java.util.Properties;
 
-import static org.apache.solr.handler.dataimport.DataImportHandlerException.SEVERE;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 
 /**
@@ -62,24 +61,13 @@ public class FieldStreamDataSource exten
     Object o = wrapper.getVariableResolver().resolve(dataField);
     if (o == null) {
       throw new DataImportHandlerException(SEVERE, "No field available for name : " + dataField);
-    }
-    if (o instanceof Blob) {
+    } else if (o instanceof Blob) {
       Blob blob = (Blob) o;
       try {
-        //Most of the JDBC drivers have getBinaryStream defined as public
-        // so let us just check it
-        Method m = blob.getClass().getDeclaredMethod("getBinaryStream");
-        if (Modifier.isPublic(m.getModifiers())) {
-          return (InputStream) m.invoke(blob);
-        } else {
-          // force invoke
-          m.setAccessible(true);
-          return (InputStream) m.invoke(blob);
-        }
-      } catch (Exception e) {
+        return blob.getBinaryStream();
+      } catch (SQLException sqle) {
         LOG.info("Unable to get data from BLOB");
         return null;
-
       }
     } else if (o instanceof byte[]) {
       byte[] bytes = (byte[]) o;

Modified: lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/SolrXmlInZkTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/SolrXmlInZkTest.java?rev=1702691&r1=1702690&r2=1702691&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/SolrXmlInZkTest.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/cloud/SolrXmlInZkTest.java Sun Sep 13 01:24:20 2015
@@ -17,8 +17,10 @@ package org.apache.solr.cloud;
  */
 
 import com.carrotsearch.randomizedtesting.rules.SystemPropertiesRestoreRule;
+
 import org.apache.commons.io.FileUtils;
 import org.apache.solr.SolrTestCaseJ4;
+import org.apache.solr.common.SolrException;
 import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.core.NodeConfig;
@@ -30,8 +32,6 @@ import org.junit.rules.RuleChain;
 import org.junit.rules.TestRule;
 
 import java.io.File;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
 import java.nio.charset.StandardCharsets;
 import java.util.Properties;
 
@@ -50,15 +50,6 @@ public class SolrXmlInZkTest extends Sol
 
   private NodeConfig cfg;
 
-  private SolrDispatchFilter solrDispatchFilter;
-
-  @After
-  public void after() {
-    if (solrDispatchFilter != null) {
-      solrDispatchFilter.destroy();
-    }
-  }
-
   private void setUpZkAndDiskXml(boolean toZk, boolean leaveOnLocal) throws Exception {
     File tmpDir = createTempDir().toFile();
     File solrHome = new File(tmpDir, "home");
@@ -95,13 +86,7 @@ public class SolrXmlInZkTest extends Sol
     props.setProperty("solr.test.sys.prop1", "propone");
     props.setProperty("solr.test.sys.prop2", "proptwo");
 
-    Method method = SolrDispatchFilter.class.getDeclaredMethod("loadNodeConfig", String.class, Properties.class);
-    method.setAccessible(true);
-    if (solrDispatchFilter != null) solrDispatchFilter.destroy();
-    solrDispatchFilter = new SolrDispatchFilter();
-    Object obj = method.invoke(solrDispatchFilter, solrHome.getAbsolutePath(), props);
-    cfg = (NodeConfig) obj;
-
+    cfg = SolrDispatchFilter.loadNodeConfig(solrHome.getAbsolutePath(), props);
     log.info("####SETUP_END " + getTestName());
   }
 
@@ -155,9 +140,9 @@ public class SolrXmlInZkTest extends Sol
       System.setProperty("hostPort", "8787");
       setUpZkAndDiskXml(false, false); // solr.xml not on disk either
       fail("Should have thrown an exception here");
-    } catch (InvocationTargetException ite) {
+    } catch (SolrException solre) {
       assertTrue("Should be failing to create default solr.xml in code",
-          ite.getCause().getMessage().contains("solr.xml does not exist"));
+          solre.getMessage().contains("solr.xml does not exist"));
     } finally {
       closeZK();
     }

Modified: lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/client/solrj/beans/DocumentObjectBinder.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/client/solrj/beans/DocumentObjectBinder.java?rev=1702691&r1=1702690&r2=1702691&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/client/solrj/beans/DocumentObjectBinder.java (original)
+++ lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/client/solrj/beans/DocumentObjectBinder.java Sun Sep 13 01:24:20 2015
@@ -19,8 +19,11 @@ package org.apache.solr.client.solrj.bea
 import org.apache.solr.common.SolrDocumentList;
 import org.apache.solr.common.SolrDocument;
 import org.apache.solr.common.SolrInputDocument;
+import org.apache.solr.common.util.SuppressForbidden;
 
 import java.lang.reflect.*;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
 import java.util.*;
 import java.util.regex.Pattern;
 import java.util.concurrent.ConcurrentHashMap;
@@ -134,9 +137,16 @@ public class DocumentObjectBinder {
       superClazz = superClazz.getSuperclass();
     }
     boolean childFieldFound = false;
-    for (AccessibleObject member : members) {
+    for (final AccessibleObject member : members) {
       if (member.isAnnotationPresent(Field.class)) {
-        member.setAccessible(true);
+        AccessController.doPrivileged(new PrivilegedAction<Void>() {
+          @Override
+          @SuppressForbidden(reason = "Needs access to possibly private @Field annotated fields/methods")
+          public Void run() {
+            member.setAccessible(true);
+            return null;
+          }
+        });
         DocField df = new DocField(member);
         if (df.child != null) {
           if (childFieldFound)

Modified: lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/common/cloud/SolrZooKeeper.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/common/cloud/SolrZooKeeper.java?rev=1702691&r1=1702690&r2=1702691&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/common/cloud/SolrZooKeeper.java (original)
+++ lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/common/cloud/SolrZooKeeper.java Sun Sep 13 01:24:20 2015
@@ -22,9 +22,12 @@ import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.net.SocketAddress;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
 import java.util.Set;
 import java.util.concurrent.CopyOnWriteArraySet;
 
+import org.apache.solr.common.util.SuppressForbidden;
 import org.apache.zookeeper.ClientCnxn;
 import org.apache.zookeeper.Watcher;
 import org.apache.zookeeper.ZooKeeper;
@@ -55,34 +58,45 @@ public class SolrZooKeeper extends ZooKe
       @Override
       public void run() {
         try {
-          final ClientCnxn cnxn = getConnection();
-          synchronized (cnxn) {
-            try {
-              final Field sendThreadFld = cnxn.getClass().getDeclaredField("sendThread");
-              sendThreadFld.setAccessible(true);
-              Object sendThread = sendThreadFld.get(cnxn);
-              if (sendThread != null) {
-                Method method = sendThread.getClass().getDeclaredMethod("testableCloseSocket");
-                method.setAccessible(true);
-                try {
-                  method.invoke(sendThread);
-                } catch (InvocationTargetException e) {
-                  // is fine
-                }
-              }
-            } catch (Exception e) {
-              throw new RuntimeException("Closing Zookeeper send channel failed.", e);
+          AccessController.doPrivileged(new PrivilegedAction<Void>() {
+            @Override
+            public Void run() {
+              return closeZookeeperChannel();
             }
-          }
+          });
         } finally {
           spawnedThreads.remove(this);
         }
       }
+      
+      @SuppressForbidden(reason = "Hack for Zookeper needs access to private methods.")
+      Void closeZookeeperChannel() {
+        final ClientCnxn cnxn = getConnection();
+        synchronized (cnxn) {
+          try {
+            final Field sendThreadFld = cnxn.getClass().getDeclaredField("sendThread");
+            sendThreadFld.setAccessible(true);
+            Object sendThread = sendThreadFld.get(cnxn);
+            if (sendThread != null) {
+              Method method = sendThread.getClass().getDeclaredMethod("testableCloseSocket");
+              method.setAccessible(true);
+              try {
+                method.invoke(sendThread);
+              } catch (InvocationTargetException e) {
+                // is fine
+              }
+            }
+          } catch (Exception e) {
+            throw new RuntimeException("Closing Zookeeper send channel failed.", e);
+          }
+        }
+        return null; // Void
+      }
     };
     spawnedThreads.add(t);
     t.start();
   }
-
+  
   @Override
   public synchronized void close() throws InterruptedException {
     for (Thread t : spawnedThreads) {

Modified: lucene/dev/branches/branch_5x/solr/solrj/src/test/org/apache/solr/client/solrj/SolrExampleTests.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/solrj/src/test/org/apache/solr/client/solrj/SolrExampleTests.java?rev=1702691&r1=1702690&r2=1702691&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/solrj/src/test/org/apache/solr/client/solrj/SolrExampleTests.java (original)
+++ lucene/dev/branches/branch_5x/solr/solrj/src/test/org/apache/solr/client/solrj/SolrExampleTests.java Sun Sep 13 01:24:20 2015
@@ -25,10 +25,9 @@ import junit.framework.Assert;
 import org.apache.lucene.util.TestUtil;
 import org.apache.solr.SolrTestCaseJ4.SuppressSSL;
 import org.apache.solr.client.solrj.embedded.EmbeddedSolrServer;
+import org.apache.solr.client.solrj.embedded.SolrExampleStreamingTest.ErrorTrackingConcurrentUpdateSolrClient;
 import org.apache.solr.client.solrj.impl.BinaryResponseParser;
-import org.apache.solr.client.solrj.impl.ConcurrentUpdateSolrClient;
 import org.apache.solr.client.solrj.impl.HttpSolrClient;
-import org.apache.solr.client.solrj.impl.HttpSolrClient.RemoteSolrException;
 import org.apache.solr.client.solrj.impl.NoOpResponseParser;
 import org.apache.solr.client.solrj.impl.XMLResponseParser;
 import org.apache.solr.client.solrj.request.AbstractUpdateRequest;
@@ -48,7 +47,6 @@ import org.apache.solr.client.solrj.resp
 import org.apache.solr.common.SolrDocument;
 import org.apache.solr.common.SolrDocumentList;
 import org.apache.solr.common.SolrException;
-import org.apache.solr.common.SolrException.ErrorCode;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.params.AnalysisParams;
 import org.apache.solr.common.params.CommonParams;
@@ -61,7 +59,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
-import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -458,27 +455,18 @@ abstract public class SolrExampleTests e
       } catch (Throwable t) {
         Assert.fail("should have thrown a SolrException! not: " + t);
       }
-    } else if (client instanceof ConcurrentUpdateSolrClient) {
+    } else if (client instanceof ErrorTrackingConcurrentUpdateSolrClient) {
       //XXX concurrentupdatesolrserver reports errors differently
-      ConcurrentUpdateSolrClient concurrentClient = (ConcurrentUpdateSolrClient) client;
-      Field field = getConcurrentClientExceptionField(concurrentClient);
-      field.set(concurrentClient, null);
+      ErrorTrackingConcurrentUpdateSolrClient concurrentClient = (ErrorTrackingConcurrentUpdateSolrClient) client;
+      concurrentClient.lastError = null;
       concurrentClient.add(doc);
       concurrentClient.blockUntilFinished();
-      Throwable lastError = (Throwable)field.get(concurrentClient);
-      assertNotNull("Should throw exception!", lastError); //XXX 
+      assertNotNull("Should throw exception!", concurrentClient.lastError); 
     } else {
       log.info("Ignoring update test for client:" + client.getClass().getName());
     }
   }
   
-  private static Field getConcurrentClientExceptionField(Object cs)
-      throws SecurityException, NoSuchFieldException, IllegalArgumentException {
-    Field field = cs.getClass().getDeclaredField("lastError");
-    field.setAccessible(true);
-    return field;
-  }
-
   @Test
   public void testAugmentFields() throws Exception
   {    
@@ -1639,7 +1627,9 @@ abstract public class SolrExampleTests e
         fail("Operation should throw an exception!");
       } else {
         client.commit(); //just to be sure the client has sent the doc
-        assertTrue("ConcurrentUpdateSolrClient did not report an error", ((Throwable) getConcurrentClientExceptionField(client).get(client)).getMessage().contains("Conflict"));
+        ErrorTrackingConcurrentUpdateSolrClient concurrentClient = (ErrorTrackingConcurrentUpdateSolrClient) client;
+        assertNotNull("ConcurrentUpdateSolrClient did not report an error", concurrentClient.lastError);
+        assertTrue("ConcurrentUpdateSolrClient did not report an error", concurrentClient.lastError.getMessage().contains("Conflict"));
       }
     } catch (SolrException se) {
       assertTrue("No identifiable error message", se.getMessage().contains("version conflict for unique"));

Modified: lucene/dev/branches/branch_5x/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleStreamingTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleStreamingTest.java?rev=1702691&r1=1702690&r2=1702691&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleStreamingTest.java (original)
+++ lucene/dev/branches/branch_5x/solr/solrj/src/test/org/apache/solr/client/solrj/embedded/SolrExampleStreamingTest.java Sun Sep 13 01:24:20 2015
@@ -46,6 +46,19 @@ public class SolrExampleStreamingTest ex
   public static void beforeTest() throws Exception {
     createJetty(legacyExampleCollection1SolrHome());
   }
+  
+  public class ErrorTrackingConcurrentUpdateSolrClient extends ConcurrentUpdateSolrClient {
+    public Throwable lastError = null;
+
+    public ErrorTrackingConcurrentUpdateSolrClient(String solrServerUrl, int queueSize, int threadCount) {
+      super(solrServerUrl, queueSize, threadCount);
+    }
+    
+    @Override
+    public void handleError(Throwable ex) {
+      handledException = lastError = ex;
+    }
+  }
 
   @Override
   public SolrClient createNewSolrClient()
@@ -54,15 +67,7 @@ public class SolrExampleStreamingTest ex
       // setup the server...
       String url = jetty.getBaseUrl().toString() + "/collection1";
       // smaller queue size hits locks more often
-      ConcurrentUpdateSolrClient concurrentClient = new ConcurrentUpdateSolrClient( url, 2, 5 ) {
-        
-        public Throwable lastError = null;
-        @Override
-        public void handleError(Throwable ex) {
-          handledException = lastError = ex;
-        }
-      };
-
+      ConcurrentUpdateSolrClient concurrentClient = new ErrorTrackingConcurrentUpdateSolrClient( url, 2, 5 );
       concurrentClient.setParser(new XMLResponseParser());
       concurrentClient.setRequestWriter(new RequestWriter());
       return concurrentClient;