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;