You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by no...@apache.org on 2016/09/03 18:11:37 UTC
[1/2] lucene-solr:apiv2: SOLR-8029: more feedback from Steve
addressed. ADDROLE, REMOVEROLE commands added
Repository: lucene-solr
Updated Branches:
refs/heads/apiv2 327aaffae -> 92411981a
SOLR-8029: more feedback from Steve addressed. ADDROLE, REMOVEROLE commands added
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/baec9703
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/baec9703
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/baec9703
Branch: refs/heads/apiv2
Commit: baec97036a2c0413830f0717f5adf1d7871b5b3c
Parents: 22f1be6
Author: Noble Paul <no...@apache.org>
Authored: Sat Sep 3 22:11:13 2016 +0530
Committer: Noble Paul <no...@apache.org>
Committed: Sat Sep 3 22:11:13 2016 +0530
----------------------------------------------------------------------
solr/core/src/java/org/apache/solr/api/Api.java | 6 +-
.../src/java/org/apache/solr/api/ApiBag.java | 62 ++--
.../java/org/apache/solr/api/SpecProvider.java | 4 +-
.../java/org/apache/solr/api/V2HttpCall.java | 14 +-
.../apache/solr/handler/DumpRequestHandler.java | 2 +-
.../solr/handler/UpdateRequestHandler.java | 2 +-
.../solr/handler/UpdateRequestHandlerApi.java | 2 -
.../apache/solr/handler/admin/ApiCommand.java | 5 -
.../handler/admin/BaseHandlerApiSupport.java | 4 +-
.../handler/admin/CollectionHandlerApi.java | 30 +-
.../apache/solr/request/SolrQueryRequest.java | 2 +-
.../solr/request/SolrQueryRequestBase.java | 6 +-
.../apache/solr/security/BasicAuthPlugin.java | 4 +-
.../security/RuleBasedAuthorizationPlugin.java | 8 +-
.../security/Sha256AuthenticationProvider.java | 5 +-
.../org/apache/solr/servlet/HttpSolrCall.java | 12 +-
.../apache/solr/servlet/SolrRequestParsers.java | 2 +-
.../src/java/org/apache/solr/util/PathTrie.java | 35 ++-
.../src/resources/apispec/cluster.Commands.json | 48 +++
.../core/src/resources/apispec/node.invoke.json | 8 +-
.../test/org/apache/solr/api/TestPathTrie.java | 23 +-
.../apache/solr/core/TestSolrConfigHandler.java | 9 +-
.../solr/handler/admin/TestApiFramework.java | 10 +-
.../solr/handler/admin/TestCollectionAPIs.java | 11 +-
.../org/apache/solr/util/JsonValidatorTest.java | 8 +-
.../java/org/apache/solr/common/util/Map2.java | 303 -------------------
.../org/apache/solr/common/util/Predicate.java | 31 --
.../solr/common/util/PredicateWithErrMsg.java | 31 ++
.../solr/common/util/ValidatingJsonMap.java | 291 ++++++++++++++++++
29 files changed, 510 insertions(+), 468 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/java/org/apache/solr/api/Api.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/api/Api.java b/solr/core/src/java/org/apache/solr/api/Api.java
index 96b9316..b672621 100644
--- a/solr/core/src/java/org/apache/solr/api/Api.java
+++ b/solr/core/src/java/org/apache/solr/api/Api.java
@@ -21,7 +21,7 @@ package org.apache.solr.api;
import java.util.Map;
import com.google.common.collect.ImmutableMap;
-import org.apache.solr.common.util.Map2;
+import org.apache.solr.common.util.ValidatingJsonMap;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.response.SolrQueryResponse;
import org.apache.solr.util.JsonSchemaValidator;
@@ -38,7 +38,7 @@ public abstract class Api implements SpecProvider {
if (commandSchema == null) {
synchronized (this) {
if(commandSchema == null) {
- Map2 commands = getSpec().getMap("commands", null);
+ ValidatingJsonMap commands = getSpec().getMap("commands", null);
commandSchema = commands != null ?
ImmutableMap.copyOf(ApiBag.getParsedSchema(commands)) :
ImmutableMap.of();
@@ -51,7 +51,7 @@ public abstract class Api implements SpecProvider {
public abstract void call(SolrQueryRequest req , SolrQueryResponse rsp);
@Override
- public Map2 getSpec() {
+ public ValidatingJsonMap getSpec() {
return spec.getSpec();
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/java/org/apache/solr/api/ApiBag.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/api/ApiBag.java b/solr/core/src/java/org/apache/solr/api/ApiBag.java
index ddc3643..dd90ee9 100644
--- a/solr/core/src/java/org/apache/solr/api/ApiBag.java
+++ b/solr/core/src/java/org/apache/solr/api/ApiBag.java
@@ -33,7 +33,7 @@ import java.util.concurrent.ConcurrentHashMap;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import org.apache.solr.common.SolrException;
-import org.apache.solr.common.util.Map2;
+import org.apache.solr.common.util.ValidatingJsonMap;
import org.apache.solr.common.util.Utils;
import org.apache.solr.core.PluginBag;
import org.apache.solr.core.PluginInfo;
@@ -50,8 +50,8 @@ import org.slf4j.LoggerFactory;
import static org.apache.solr.client.solrj.SolrRequest.SUPPORTED_METHODS;
import static org.apache.solr.common.params.CommonParams.NAME;
-import static org.apache.solr.common.util.Map2.ENUM_OF;
-import static org.apache.solr.common.util.Map2.NOT_NULL;
+import static org.apache.solr.common.util.ValidatingJsonMap.ENUM_OF;
+import static org.apache.solr.common.util.ValidatingJsonMap.NOT_NULL;
import static org.apache.solr.common.util.StrUtils.formatString;
public class ApiBag {
@@ -59,13 +59,13 @@ public class ApiBag {
private final Map<String, PathTrie<Api>> apis = new ConcurrentHashMap<>();
- public static Map2 getResource(String name) {
+ public static ValidatingJsonMap getResource(String name) {
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(name);
if (is == null)
throw new RuntimeException("invalid API spec :" + name );
- Map2 map1 = null;
+ ValidatingJsonMap map1 = null;
try {
- map1 = Map2.fromJSON(is);
+ map1 = ValidatingJsonMap.fromJSON(is);
} catch (Exception e) {
log.error("Error in JSON : " + name, e);
if (e instanceof RuntimeException) {
@@ -75,7 +75,7 @@ public class ApiBag {
}
if (map1 == null) throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, "Empty value for " + name);
- return Map2.getDeepCopy(map1, 5, false);
+ return ValidatingJsonMap.getDeepCopy(map1, 5, false);
}
@@ -95,30 +95,30 @@ public class ApiBag {
}
private void validateAndRegister(Api api, Map<String, String> nameSubstitutes) {
- Map2 spec = api.getSpec();
+ ValidatingJsonMap spec = api.getSpec();
Api introspect = new IntrospectApi(api);
List<String> methods = spec.getList("methods", ENUM_OF, SUPPORTED_METHODS);
for (String method : methods) {
PathTrie<Api> registry = apis.get(method);
if (registry == null) apis.put(method, registry = new PathTrie<>(ImmutableSet.of("_introspect")));
- Map2 url = spec.getMap("url", NOT_NULL);
- Map2 params = url.getMap("params", null);
+ ValidatingJsonMap url = spec.getMap("url", NOT_NULL);
+ ValidatingJsonMap params = url.getMap("params", null);
if (params != null) {
for (Object o : params.keySet()) {
- Map2 param = params.getMap(o.toString(), NOT_NULL);
+ ValidatingJsonMap param = params.getMap(o.toString(), NOT_NULL);
param.get("type", ENUM_OF, KNOWN_TYPES);
param.get("description", NOT_NULL);
}
}
List<String> paths = url.getList("paths", NOT_NULL);
- Map2 parts = url.getMap("parts", null);
+ ValidatingJsonMap parts = url.getMap("parts", null);
if (parts != null) {
Set<String> wildCardNames = getWildCardNames(paths);
for (Object o : parts.keySet()) {
if (!wildCardNames.contains(o.toString()))
throw new RuntimeException("" + o + " is not a valid part name");
- Map2 pathMeta = parts.getMap(o.toString(), NOT_NULL);
+ ValidatingJsonMap pathMeta = parts.getMap(o.toString(), NOT_NULL);
pathMeta.get("type", ENUM_OF, ImmutableSet.of("enum", "string", "int", "number", "boolean"));
}
}
@@ -141,14 +141,14 @@ public class ApiBag {
public void call(SolrQueryRequest req, SolrQueryResponse rsp) {
String cmd = req.getParams().get("command");
- Map2 result = null;
+ ValidatingJsonMap result = null;
if (cmd == null) {
result = baseApi.getSpec();
} else {
- Map2 specCopy = Map2.getDeepCopy(baseApi.getSpec(), 5, true);
- Map2 commands = specCopy.getMap("commands", null);
+ ValidatingJsonMap specCopy = ValidatingJsonMap.getDeepCopy(baseApi.getSpec(), 5, true);
+ ValidatingJsonMap commands = specCopy.getMap("commands", null);
if (commands != null) {
- Map2 m = commands.getMap(cmd, null);
+ ValidatingJsonMap m = commands.getMap(cmd, null);
specCopy.put("commands", Collections.singletonMap(cmd, m));
}
result = specCopy;
@@ -159,7 +159,7 @@ public class ApiBag {
}
}
- public static Map<String, JsonSchemaValidator> getParsedSchema(Map2 commands) {
+ public static Map<String, JsonSchemaValidator> getParsedSchema(ValidatingJsonMap commands) {
Map<String,JsonSchemaValidator> validators = new HashMap<>();
for (Object o : commands.entrySet()) {
Map.Entry cmd = (Map.Entry) o;
@@ -173,8 +173,8 @@ public class ApiBag {
}
- private void verifyCommands(Map2 spec) {
- Map2 commands = spec.getMap("commands", null);
+ private void verifyCommands(ValidatingJsonMap spec) {
+ ValidatingJsonMap commands = spec.getMap("commands", null);
if (commands == null) return;
getParsedSchema(commands);
@@ -183,7 +183,7 @@ public class ApiBag {
private Set<String> getWildCardNames(List<String> paths) {
Set<String> wildCardNames = new HashSet<>();
for (String path : paths) {
- List<String> p = PathTrie.getParts(path);
+ List<String> p = PathTrie.getTemplateVariables(path);
for (String s : p) {
String wildCard = PathTrie.wildCardName(s);
if (wildCard != null) wildCardNames.add(wildCard);
@@ -210,24 +210,24 @@ public class ApiBag {
public static SpecProvider getSpec(final String name) {
return () -> {
String jsonName = APISPEC_LOCATION + name + ".json";
- Map2 map = getResource(jsonName);
- Map2 result = map;
- Map2 cmds = result.getMap("commands", null);
+ ValidatingJsonMap map = getResource(jsonName);
+ ValidatingJsonMap result = map;
+ ValidatingJsonMap cmds = result.getMap("commands", null);
if (cmds != null) {
- Map<String, Map2> comands2BReplaced = new Map2<>();
+ Map comands2BReplaced = new ValidatingJsonMap();
for (Object o : cmds.keySet()) {
Object val = cmds.get(o);
if (val instanceof String) {
String s = (String) val;
- Map2 cmdSpec = getResource(APISPEC_LOCATION + s + ".json");
+ ValidatingJsonMap cmdSpec = getResource(APISPEC_LOCATION + s + ".json");
comands2BReplaced.put(o.toString(), cmdSpec);
}
}
if (!comands2BReplaced.isEmpty()) {
- Map2 mapCopy = Map2.getDeepCopy(result, 4, true);
+ ValidatingJsonMap mapCopy = ValidatingJsonMap.getDeepCopy(result, 4, true);
mapCopy.getMap("commands", NOT_NULL).putAll(comands2BReplaced);
- result = Map2.getDeepCopy(mapCopy, 4, false);
+ result = ValidatingJsonMap.getDeepCopy(mapCopy, 4, false);
}
}
@@ -269,7 +269,7 @@ public class ApiBag {
public static final String INTROSPECT = "/_introspect";
- public static final SpecProvider EMPTY_SPEC = () -> Map2.EMPTY;
+ public static final SpecProvider EMPTY_SPEC = () -> ValidatingJsonMap.EMPTY;
public static final String HANDLER_NAME = "handlerName";
public static final Set<String> KNOWN_TYPES = ImmutableSet.of("string", "boolean", "list", "int", "double", "object");
@@ -277,7 +277,7 @@ public class ApiBag {
return apis.get(method);
}
- public <T> void registerLazy(PluginBag.PluginHolder<SolrRequestHandler> holder, PluginInfo info) {
+ public void registerLazy(PluginBag.PluginHolder<SolrRequestHandler> holder, PluginInfo info) {
String specName = info.attributes.get("spec");
if (specName == null) specName = "emptySpec";
register(new LazyLoadedApi(ApiBag.getSpec(specName), holder), Collections.singletonMap(HANDLER_NAME, info.attributes.get(NAME)));
@@ -288,7 +288,7 @@ public class ApiBag {
if (specObj == null) specObj = "emptySpec";
if (specObj instanceof Map) {
Map map = (Map) specObj;
- return () -> Map2.getDeepCopy(map, 4, false);
+ return () -> ValidatingJsonMap.getDeepCopy(map, 4, false);
} else {
return ApiBag.getSpec((String) specObj);
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/java/org/apache/solr/api/SpecProvider.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/api/SpecProvider.java b/solr/core/src/java/org/apache/solr/api/SpecProvider.java
index 1d1ad32..88a06c8 100644
--- a/solr/core/src/java/org/apache/solr/api/SpecProvider.java
+++ b/solr/core/src/java/org/apache/solr/api/SpecProvider.java
@@ -17,8 +17,8 @@ package org.apache.solr.api;
* limitations under the License.
*/
-import org.apache.solr.common.util.Map2;
+import org.apache.solr.common.util.ValidatingJsonMap;
public interface SpecProvider {
- Map2 getSpec();
+ ValidatingJsonMap getSpec();
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/java/org/apache/solr/api/V2HttpCall.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/api/V2HttpCall.java b/solr/core/src/java/org/apache/solr/api/V2HttpCall.java
index 997ccce..b997c42 100644
--- a/solr/core/src/java/org/apache/solr/api/V2HttpCall.java
+++ b/solr/core/src/java/org/apache/solr/api/V2HttpCall.java
@@ -33,7 +33,7 @@ import org.apache.solr.common.SolrException;
import org.apache.solr.common.cloud.DocCollection;
import org.apache.solr.common.cloud.ZkStateReader;
import org.apache.solr.common.params.CommonParams;
-import org.apache.solr.common.util.Map2;
+import org.apache.solr.common.util.ValidatingJsonMap;
import org.apache.solr.core.CoreContainer;
import org.apache.solr.core.PluginBag;
import org.apache.solr.core.SolrCore;
@@ -52,7 +52,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static org.apache.solr.servlet.SolrDispatchFilter.Action.PASSTHROUGH;
-import static org.apache.solr.util.PathTrie.getParts;
+import static org.apache.solr.util.PathTrie.getTemplateVariables;
import static org.apache.solr.common.params.CommonParams.JSON;
import static org.apache.solr.common.params.CommonParams.WT;
import static org.apache.solr.servlet.SolrDispatchFilter.Action.ADMIN;
@@ -77,7 +77,7 @@ public class V2HttpCall extends HttpSolrCall {
String path = this.path;
String fullPath = path = path.substring(3);//strip off '/v2'
try {
- pieces = getParts(path);
+ pieces = getTemplateVariables(path);
if (pieces.size() == 0) {
prefix = "c";
path = "/c";
@@ -175,7 +175,7 @@ public class V2HttpCall extends HttpSolrCall {
}
if (api == null) {
- // this is to return the user with all the subpaths for a given 4044 request
+ // this is to return the user with all the subpaths for a given 404 request
// the request begins with /collections , /cores or a /c and the current lookup is on container level handlers
// So the subsequent per core lookup would find a path
if (containerHandlerLookup && commonPaths4ContainerLevelAndCoreLevel.contains(prefix)) return null;
@@ -249,7 +249,7 @@ public class V2HttpCall extends HttpSolrCall {
}
private static Api getSubPathImpl(final Map<String, Set<String>> subpaths, String path, boolean addMsg) {
- return new Api(() -> Map2.EMPTY) {
+ return new Api(() -> ValidatingJsonMap.EMPTY) {
@Override
public void call(SolrQueryRequest req, SolrQueryResponse rsp) {
if(addMsg) rsp.add("msg", "Invalid path, try the following");
@@ -273,8 +273,6 @@ public class V2HttpCall extends HttpSolrCall {
try {
api.call(solrReq, rsp);
} catch (RuntimeException e) {
- //todo remove. for debugging only
- log.error("error execute()", e);
throw e;
}
}
@@ -296,7 +294,7 @@ public class V2HttpCall extends HttpSolrCall {
}
@Override
- protected Map2 getSpec() {
+ protected ValidatingJsonMap getSpec() {
return api == null ? null : api.getSpec();
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/java/org/apache/solr/handler/DumpRequestHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/DumpRequestHandler.java b/solr/core/src/java/org/apache/solr/handler/DumpRequestHandler.java
index 7dd69a5..c5b899f 100644
--- a/solr/core/src/java/org/apache/solr/handler/DumpRequestHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/DumpRequestHandler.java
@@ -46,7 +46,7 @@ public class DumpRequestHandler extends RequestHandlerBase
Map map = new LinkedHashMap<>();
rsp.getValues().add("urlPart", map);
for (String part : parts) {
- map.put(part, req.getPathValues().get(part));
+ map.put(part, req.getPathTemplateValues().get(part));
}
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandler.java b/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandler.java
index b3c7b17..d2da05e 100644
--- a/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandler.java
@@ -150,7 +150,7 @@ public class UpdateRequestHandler extends ContentStreamHandlerBase implements Pe
pathVsLoaders.put(JSON_PATH,registry.get("application/json"));
pathVsLoaders.put(DOC_PATH,registry.get("application/json"));
pathVsLoaders.put(CSV_PATH,registry.get("application/csv"));
- pathVsLoaders.put(BIN_PATH,registry.get("application/csv"));
+ pathVsLoaders.put(BIN_PATH,registry.get("application/javabin"));
return registry;
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandlerApi.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandlerApi.java b/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandlerApi.java
index 1e07277..a1035aa 100644
--- a/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandlerApi.java
+++ b/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandlerApi.java
@@ -23,11 +23,9 @@ import java.util.Collections;
import java.util.Map;
import com.google.common.collect.ImmutableMap;
-import org.apache.solr.api.SpecProvider;
import org.apache.solr.common.SolrException;
import org.apache.solr.api.Api;
import org.apache.solr.api.ApiBag;
-import org.apache.solr.common.util.Map2;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.response.SolrQueryResponse;
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/java/org/apache/solr/handler/admin/ApiCommand.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/ApiCommand.java b/solr/core/src/java/org/apache/solr/handler/admin/ApiCommand.java
index 8899a7a..940eee1 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/ApiCommand.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/ApiCommand.java
@@ -32,11 +32,6 @@ public interface ApiCommand<T> {
V2EndPoint getEndPoint();
-
- /* void command(SolrQueryRequest req, SolrQueryResponse rsp, CommandOperation c, T handler) throws Exception;
-
- void GET(SolrQueryRequest req, SolrQueryResponse rsp, T handler) throws Exception;
-*/
default Collection<String> getParamNames(CommandOperation op) {
return BaseHandlerApiSupport.getParamNames(op, this);
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/java/org/apache/solr/handler/admin/BaseHandlerApiSupport.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/BaseHandlerApiSupport.java b/solr/core/src/java/org/apache/solr/handler/admin/BaseHandlerApiSupport.java
index aaf229b..efda446 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/BaseHandlerApiSupport.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/BaseHandlerApiSupport.java
@@ -28,11 +28,9 @@ import java.util.Map;
import java.util.Objects;
import com.google.common.collect.ImmutableList;
-import org.apache.solr.api.SpecProvider;
import org.apache.solr.client.solrj.SolrRequest;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.params.SolrParams;
-import org.apache.solr.common.util.Map2;
import org.apache.solr.common.util.Utils;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.response.SolrQueryResponse;
@@ -126,7 +124,7 @@ public abstract class BaseHandlerApiSupport implements ApiSupport {
}
private static void wrapParams(final SolrQueryRequest req, final CommandOperation co, final ApiCommand cmd, final boolean useRequestParams) {
- final Map<String, String> pathValues = req.getPathValues();
+ final Map<String, String> pathValues = req.getPathTemplateValues();
final Map<String, Object> map = co == null || !(co.getCommandData() instanceof Map) ?
Collections.singletonMap("", co.getCommandData()) : co.getDataMap();
final SolrParams origParams = req.getParams();
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/java/org/apache/solr/handler/admin/CollectionHandlerApi.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/CollectionHandlerApi.java b/solr/core/src/java/org/apache/solr/handler/admin/CollectionHandlerApi.java
index 502a0d1..56e5191 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/CollectionHandlerApi.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/CollectionHandlerApi.java
@@ -71,7 +71,7 @@ public class CollectionHandlerApi extends BaseHandlerApiSupport {
GET_COLLECTIONS(EndPoint.COLLECTIONS, GET, LIST_OP),
GET_CLUSTER(EndPoint.CLUSTER, GET, LIST_OP, "/cluster", null),
GET_CLUSTER_OVERSEER(EndPoint.CLUSTER, GET, OVERSEERSTATUS_OP, "/cluster/overseer", null),
- GET_CLUSTER_CMD(EndPoint.CLUSTER_CMD, GET, REQUESTSTATUS_OP),
+ GET_CLUSTER_CMD(EndPoint.CLUSTER_CMD_STATUS, GET, REQUESTSTATUS_OP),
GET_A_COLLECTION(EndPoint.COLLECTION_STATE, GET, CLUSTERSTATUS_OP),
CREATE_COLLECTION(EndPoint.COLLECTIONS_COMMANDS,
POST,
@@ -163,13 +163,22 @@ public class CollectionHandlerApi extends BaseHandlerApiSupport {
POST,
DELETEREPLICAPROP_OP,
"delete-property",
- ImmutableMap.of("property", ""));
+ ImmutableMap.of("property", "")),
+ ADDROLE(EndPoint.CLUSTER_CMD,
+ POST,
+ ADDROLE_OP,
+ "add-role",null),
+ REMOVEROLE(EndPoint.CLUSTER_CMD,
+ POST,
+ REMOVEROLE_OP,
+ "remove-role",null),
+ ;
public final String commandName;
public final EndPoint endPoint;
public final SolrRequest.METHOD method;
public final CollectionOperation target;
public final Map<String, String> paramstoAttr;
- public final Map<String, String> prefixSubStitutes;
+ public final Map<String, String> prefixSubstitutes;
public SolrRequest.METHOD getMethod() {
return method;
@@ -187,13 +196,13 @@ public class CollectionHandlerApi extends BaseHandlerApiSupport {
}
Cmd(EndPoint endPoint, SolrRequest.METHOD method, CollectionOperation target,
- String commandName, Map<String, String> paramstoAttr, Map<String, String> prefixSubStitutes) {
+ String commandName, Map<String, String> paramstoAttr, Map<String, String> prefixSubstitutes) {
this.commandName = commandName;
this.endPoint = endPoint;
this.method = method;
this.target = target;
this.paramstoAttr = paramstoAttr == null ? Collections.EMPTY_MAP : paramstoAttr;
- this.prefixSubStitutes = prefixSubStitutes;
+ this.prefixSubstitutes = prefixSubstitutes;
}
@@ -216,9 +225,9 @@ public class CollectionHandlerApi extends BaseHandlerApiSupport {
@Override
public Collection<String> getParamNames(CommandOperation op) {
Collection<String> paramNames = BaseHandlerApiSupport.getParamNames(op, this);
- if (!prefixSubStitutes.isEmpty()) {
+ if (!prefixSubstitutes.isEmpty()) {
Collection<String> result = new ArrayList<>(paramNames.size());
- for (Map.Entry<String, String> e : prefixSubStitutes.entrySet()) {
+ for (Map.Entry<String, String> e : prefixSubstitutes.entrySet()) {
for (String paramName : paramNames) {
if (paramName.startsWith(e.getKey())) {
result.add(paramName.replace(e.getKey(), e.getValue()));
@@ -236,8 +245,8 @@ public class CollectionHandlerApi extends BaseHandlerApiSupport {
@Override
public String getParamSubstitute(String param) {
String s = paramstoAttr.containsKey(param) ? paramstoAttr.get(param) : param;
- if (prefixSubStitutes != null) {
- for (Map.Entry<String, String> e : prefixSubStitutes.entrySet()) {
+ if (prefixSubstitutes != null) {
+ for (Map.Entry<String, String> e : prefixSubstitutes.entrySet()) {
if (s.startsWith(e.getValue())) return s.replace(e.getValue(), e.getKey());
}
}
@@ -248,7 +257,8 @@ public class CollectionHandlerApi extends BaseHandlerApiSupport {
enum EndPoint implements V2EndPoint {
CLUSTER("cluster"),
- CLUSTER_CMD("cluster.commandstatus"),
+ CLUSTER_CMD("cluster.Commands"),
+ CLUSTER_CMD_STATUS("cluster.commandstatus"),
COLLECTIONS_COMMANDS("collections.Commands"),
COLLECTIONS("collections"),
COLLECTION_STATE("collection"),
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/java/org/apache/solr/request/SolrQueryRequest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/request/SolrQueryRequest.java b/solr/core/src/java/org/apache/solr/request/SolrQueryRequest.java
index 7674427..d975be8 100644
--- a/solr/core/src/java/org/apache/solr/request/SolrQueryRequest.java
+++ b/solr/core/src/java/org/apache/solr/request/SolrQueryRequest.java
@@ -106,7 +106,7 @@ public interface SolrQueryRequest extends AutoCloseable {
return (String) getContext().get("path");
}
- default Map<String, String> getPathValues() {
+ default Map<String, String> getPathTemplateValues() {
return Collections.emptyMap();
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/java/org/apache/solr/request/SolrQueryRequestBase.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/request/SolrQueryRequestBase.java b/solr/core/src/java/org/apache/solr/request/SolrQueryRequestBase.java
index 42d0814..4b0e4d6 100644
--- a/solr/core/src/java/org/apache/solr/request/SolrQueryRequestBase.java
+++ b/solr/core/src/java/org/apache/solr/request/SolrQueryRequestBase.java
@@ -17,12 +17,10 @@
package org.apache.solr.request;
import org.apache.solr.api.ApiBag;
-import org.apache.solr.api.V2HttpCall;
import org.apache.solr.common.SolrException;
-import org.apache.solr.common.util.Map2;
+import org.apache.solr.common.util.ValidatingJsonMap;
import org.apache.solr.common.util.SuppressForbidden;
import org.apache.solr.search.SolrIndexSearcher;
-import org.apache.solr.servlet.HttpSolrCall;
import org.apache.solr.util.CommandOperation;
import org.apache.solr.util.JsonSchemaValidator;
import org.apache.solr.util.RTimerTree;
@@ -213,7 +211,7 @@ public abstract class SolrQueryRequestBase implements SolrQueryRequest, Closeabl
}
- protected Map2 getSpec() {
+ protected ValidatingJsonMap getSpec() {
return null;
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java b/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java
index ef2932d..f9f71cf 100644
--- a/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java
+++ b/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java
@@ -37,7 +37,7 @@ import org.apache.http.Header;
import org.apache.http.auth.BasicUserPrincipal;
import org.apache.http.message.BasicHeader;
import org.apache.solr.common.SolrException;
-import org.apache.solr.common.util.Map2;
+import org.apache.solr.common.util.ValidatingJsonMap;
import org.apache.solr.util.CommandOperation;
import org.apache.solr.api.SpecProvider;
import org.slf4j.Logger;
@@ -168,7 +168,7 @@ public class BasicAuthPlugin extends AuthenticationPlugin implements ConfigEdita
}
@Override
- public Map2 getSpec() {
+ public ValidatingJsonMap getSpec() {
return zkAuthentication.getSpec();
}
public boolean getBlockUnknown(){
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/java/org/apache/solr/security/RuleBasedAuthorizationPlugin.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/security/RuleBasedAuthorizationPlugin.java b/solr/core/src/java/org/apache/solr/security/RuleBasedAuthorizationPlugin.java
index 1b4ec13..3388147 100644
--- a/solr/core/src/java/org/apache/solr/security/RuleBasedAuthorizationPlugin.java
+++ b/solr/core/src/java/org/apache/solr/security/RuleBasedAuthorizationPlugin.java
@@ -27,11 +27,7 @@ import java.util.Map;
import java.util.Set;
import java.util.function.Function;
-import com.google.common.collect.ImmutableSet;
-import org.apache.solr.common.SolrException;
-import org.apache.solr.common.params.CollectionParams;
-import org.apache.solr.common.util.Map2;
-import org.apache.solr.common.util.Utils;
+import org.apache.solr.common.util.ValidatingJsonMap;
import org.apache.solr.util.CommandOperation;
import org.apache.solr.api.ApiBag;
import org.apache.solr.api.SpecProvider;
@@ -241,7 +237,7 @@ public class RuleBasedAuthorizationPlugin implements AuthorizationPlugin, Config
@Override
- public Map2 getSpec() {
+ public ValidatingJsonMap getSpec() {
return ApiBag.getSpec("cluster.security.RuleBasedAuthorization").getSpec();
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/java/org/apache/solr/security/Sha256AuthenticationProvider.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/security/Sha256AuthenticationProvider.java b/solr/core/src/java/org/apache/solr/security/Sha256AuthenticationProvider.java
index 7427422..f270524 100644
--- a/solr/core/src/java/org/apache/solr/security/Sha256AuthenticationProvider.java
+++ b/solr/core/src/java/org/apache/solr/security/Sha256AuthenticationProvider.java
@@ -30,8 +30,7 @@ import java.util.Set;
import com.google.common.collect.ImmutableSet;
import org.apache.commons.codec.binary.Base64;
-import org.apache.solr.api.SpecProvider;
-import org.apache.solr.common.util.Map2;
+import org.apache.solr.common.util.ValidatingJsonMap;
import org.apache.solr.util.CommandOperation;
import org.apache.solr.api.ApiBag;
import org.slf4j.Logger;
@@ -156,7 +155,7 @@ public class Sha256AuthenticationProvider implements ConfigEditablePlugin, Basi
}
@Override
- public Map2 getSpec() {
+ public ValidatingJsonMap getSpec() {
return ApiBag.getSpec("cluster.security.BasicAuth.Commands").getSpec();
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java b/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
index 19b95c2..5d023e2 100644
--- a/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
+++ b/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
@@ -22,10 +22,7 @@ import javax.servlet.http.HttpServletResponse;
import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
-import java.io.InputStreamReader;
import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.io.StringWriter;
import java.io.UnsupportedEncodingException;
import java.lang.invoke.MethodHandles;
import java.security.Principal;
@@ -37,12 +34,10 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
-import java.util.Locale;
import java.util.Map;
import java.util.Random;
import java.util.Set;
-import com.google.common.collect.ImmutableSet;
import org.apache.commons.io.IOUtils;
import org.apache.commons.io.input.CloseShieldInputStream;
import org.apache.commons.io.output.CloseShieldOutputStream;
@@ -61,7 +56,6 @@ import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.entity.InputStreamEntity;
-import org.apache.http.util.EntityUtils;
import org.apache.solr.api.ApiBag;
import org.apache.solr.client.solrj.impl.CloudSolrClient;
import org.apache.solr.client.solrj.impl.HttpClientUtil;
@@ -79,7 +73,7 @@ import org.apache.solr.common.params.MapSolrParams;
import org.apache.solr.common.params.ModifiableSolrParams;
import org.apache.solr.common.params.SolrParams;
import org.apache.solr.common.util.ContentStream;
-import org.apache.solr.common.util.Map2;
+import org.apache.solr.common.util.ValidatingJsonMap;
import org.apache.solr.common.util.NamedList;
import org.apache.solr.common.util.SimpleOrderedMap;
import org.apache.solr.common.util.StrUtils;
@@ -96,7 +90,6 @@ import org.apache.solr.request.SolrRequestInfo;
import org.apache.solr.response.QueryResponseWriter;
import org.apache.solr.response.QueryResponseWriterUtil;
import org.apache.solr.response.SolrQueryResponse;
-import org.apache.solr.schema.IndexSchema;
import org.apache.solr.security.AuthenticationPlugin;
import org.apache.solr.security.AuthorizationContext;
import org.apache.solr.security.AuthorizationContext.CollectionRequest;
@@ -114,7 +107,6 @@ import org.apache.zookeeper.KeeperException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import static java.nio.charset.StandardCharsets.UTF_8;
import static org.apache.solr.common.cloud.ZkStateReader.BASE_URL_PROP;
import static org.apache.solr.common.cloud.ZkStateReader.COLLECTION_PROP;
import static org.apache.solr.common.cloud.ZkStateReader.CORE_NAME_PROP;
@@ -1090,7 +1082,7 @@ public class HttpSolrCall {
}
return CommandOperation.clone(parsedCommands);
}
- protected Map2 getSpec() {
+ protected ValidatingJsonMap getSpec() {
return null;
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java b/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java
index 9f613d9..e9b4c36 100644
--- a/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java
+++ b/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java
@@ -241,7 +241,7 @@ public class SolrRequestParsers
}
@Override
- public Map<String, String> getPathValues() {
+ public Map<String, String> getPathTemplateValues() {
if (httpSolrCall != null && httpSolrCall instanceof V2HttpCall) {
return ((V2HttpCall) httpSolrCall).getUrlParts();
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/java/org/apache/solr/util/PathTrie.java
----------------------------------------------------------------------
diff --git a/solr/core/src/java/org/apache/solr/util/PathTrie.java b/solr/core/src/java/org/apache/solr/util/PathTrie.java
index c9f1521..8976353 100644
--- a/solr/core/src/java/org/apache/solr/util/PathTrie.java
+++ b/solr/core/src/java/org/apache/solr/util/PathTrie.java
@@ -42,7 +42,7 @@ public class PathTrie<T> {
public void insert(String path, Map<String, String> replacements, T o) {
- List<String> parts = getParts(path);
+ List<String> parts = getTemplateVariables(path);
if (parts.isEmpty()) {
root.obj = o;
return;
@@ -63,7 +63,7 @@ public class PathTrie<T> {
root.insert(parts, o);
}
- public static List<String> getParts(String path) {
+ public static List<String> getTemplateVariables(String path) {
if (path == null || path.isEmpty()) return emptyList();
List<String> parts = new ArrayList<String>() {
@Override
@@ -78,11 +78,11 @@ public class PathTrie<T> {
public T lookup(String uri, Map<String, String> parts) {
- return root.lookup(getParts(uri), 0, parts);
+ return root.lookup(getTemplateVariables(uri), 0, parts);
}
public T lookup(String path, Map<String, String> parts, Set<String> paths) {
- return root.lookup(getParts(path), 0, parts, paths);
+ return root.lookup(getTemplateVariables(path), 0, parts, paths);
}
public static String wildCardName(String part) {
@@ -137,7 +137,7 @@ public class PathTrie<T> {
}
- void findValidChildren(String path, Set<String> availableSubPaths) {
+ void findAvailableChildren(String path, Set<String> availableSubPaths) {
if (availableSubPaths == null) return;
if (children != null) {
for (Node node : children.values()) {
@@ -148,29 +148,36 @@ public class PathTrie<T> {
}
for (Node node : children.values()) {
- node.findValidChildren(path + "/" + node.name, availableSubPaths);
+ node.findAvailableChildren(path + "/" + node.name, availableSubPaths);
}
}
}
- public T lookup(List<String> pieces, int i, Map<String, String> parts) {
- return lookup(pieces, i, parts, null);
+ public T lookup(List<String> pieces, int i, Map<String, String> templateValues) {
+ return lookup(pieces, i, templateValues, null);
}
- public T lookup(List<String> pieces, int i, Map<String, String> parts, Set<String> availableSubPaths) {
- if (varName != null) parts.put(varName, pieces.get(i - 1));
- if (pieces.size() < i + 1) {
- findValidChildren("", availableSubPaths);
+ /**
+ *
+ * @param pieces pieces in the url /a/b/c has pieces as 'a' , 'b' , 'c'
+ * @param index current index of the pieces that we are looking at in /a/b/c 0='a' and 1='b'
+ * @param templateVariables The mapping of template variable to its value
+ * @param availableSubPaths If not null , available sub paths will be returned in this set
+ */
+ public T lookup(List<String> pieces, int index, Map<String, String> templateVariables, Set<String> availableSubPaths) {
+ if (varName != null) templateVariables.put(varName, pieces.get(index - 1));
+ if (pieces.size() < index + 1) {
+ findAvailableChildren("", availableSubPaths);
return obj;
}
- String piece = pieces.get(i);
+ String piece = pieces.get(index);
if (children == null) return null;
Node n = children.get(piece);
if (n == null && !reserved.contains(piece)) n = children.get("");
if (n == null) return null;
- return n.lookup(pieces, i + 1, parts, availableSubPaths);
+ return n.lookup(pieces, index + 1, templateVariables, availableSubPaths);
}
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/resources/apispec/cluster.Commands.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/cluster.Commands.json b/solr/core/src/resources/apispec/cluster.Commands.json
new file mode 100644
index 0000000..7e72d40
--- /dev/null
+++ b/solr/core/src/resources/apispec/cluster.Commands.json
@@ -0,0 +1,48 @@
+{
+ "documentation": "https://cwiki.apache.org/confluence/display/solr/Collections+API",
+ "Description": "Cluster-wide commands",
+ "methods": [
+ "POST"
+ ],
+ "url": {
+ "paths": [
+ "/cluster"
+ ]
+ },
+ "commands": {
+ "add-role":{
+ "type":"object",
+ "documentation":"https://cwiki.apache.org/confluence/display/solr/Collections+API#CollectionsAPI-api15AddRole",
+ "description":"Add a specific role to a node in the cluster ",
+ "properties": {
+ "role": {
+ "type": "string",
+ "description": "The name of the role. The only supported role as of now is overseer."
+
+ },
+ "node": {
+ "type": "string",
+ "description": "The name of the node. It is possible to assign a role even before that node is started"
+
+ }
+ }
+ },
+ "remove-role":{
+ "type":"object",
+ "documentation":"https://cwiki.apache.org/confluence/display/solr/Collections+API#CollectionsAPI-api16RemoveRole",
+ "description":"",
+ "properties": {
+ "role": {
+ "type": "string",
+ "description": "The name of the role. The only supported role as of now is overseer."
+
+ },
+ "node": {
+ "type": "string",
+ "description": "The name of the node. It is possible to assign a role even before that node is started"
+ }
+ }
+ }
+
+ }
+}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/resources/apispec/node.invoke.json
----------------------------------------------------------------------
diff --git a/solr/core/src/resources/apispec/node.invoke.json b/solr/core/src/resources/apispec/node.invoke.json
index a615aca..c8a9f69 100644
--- a/solr/core/src/resources/apispec/node.invoke.json
+++ b/solr/core/src/resources/apispec/node.invoke.json
@@ -5,6 +5,12 @@
"url": {
"paths": [
"/node/invoke"
- ]
+ ],
+ "params": {
+ "class": {
+ "type": "string",
+ "description": "Name of the class that must be invoked. "
+ }
+ }
}
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/test/org/apache/solr/api/TestPathTrie.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/api/TestPathTrie.java b/solr/core/src/test/org/apache/solr/api/TestPathTrie.java
index e370ed8..9e0723d 100644
--- a/solr/core/src/test/org/apache/solr/api/TestPathTrie.java
+++ b/solr/core/src/test/org/apache/solr/api/TestPathTrie.java
@@ -41,17 +41,20 @@ public class TestPathTrie extends SolrTestCaseJ4 {
pathTrie.insert("/aa/bb/{cc}/{xx}", emptyMap(), "b");
pathTrie.insert("/aa/bb", emptyMap(), "c");
- HashMap parts = new HashMap<>();
- assertEquals("R", pathTrie.lookup("/", parts, null));
- assertEquals("d", pathTrie.lookup("/aa", parts, null));
- assertEquals("a", pathTrie.lookup("/aa/bb/hello/dd", parts, null));
- assertEquals("test", pathTrie.lookup("/test/hello/dd", parts, null));
- assertEquals("hello", parts.get("cc"));
- assertEquals("b", pathTrie.lookup("/aa/bb/hello/world", parts, null));
- assertEquals("hello", parts.get("cc"));
- assertEquals("world", parts.get("xx"));
+ HashMap templateValues = new HashMap<>();
+ assertEquals("R", pathTrie.lookup("/", templateValues, null));
+ assertEquals("d", pathTrie.lookup("/aa", templateValues, null));
+ assertEquals("a", pathTrie.lookup("/aa/bb/hello/dd", templateValues, null));
+ templateValues.clear();
+ assertEquals("test", pathTrie.lookup("/test/hello/dd", templateValues, null));
+ assertEquals("hello", templateValues.get("cc"));
+ templateValues.clear();
+ assertEquals("b", pathTrie.lookup("/aa/bb/hello/world", templateValues, null));
+ assertEquals("hello", templateValues.get("cc"));
+ assertEquals("world", templateValues.get("xx"));
Set<String> subPaths = new HashSet<>();
- pathTrie.lookup("/aa",parts, subPaths);
+ templateValues.clear();
+ pathTrie.lookup("/aa",templateValues, subPaths);
assertEquals(3, subPaths.size());
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/test/org/apache/solr/core/TestSolrConfigHandler.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/core/TestSolrConfigHandler.java b/solr/core/src/test/org/apache/solr/core/TestSolrConfigHandler.java
index 5cec10f..32b2323 100644
--- a/solr/core/src/test/org/apache/solr/core/TestSolrConfigHandler.java
+++ b/solr/core/src/test/org/apache/solr/core/TestSolrConfigHandler.java
@@ -33,11 +33,10 @@ import com.google.common.collect.ImmutableList;
import org.apache.commons.io.FileUtils;
import org.apache.solr.SolrTestCaseJ4;
import org.apache.solr.client.solrj.impl.CloudSolrClient;
-import org.apache.solr.common.util.Predicate;
+import org.apache.solr.common.util.PredicateWithErrMsg;
import org.apache.solr.common.util.StrUtils;
import org.apache.solr.common.util.Utils;
import org.apache.solr.handler.TestBlobHandler;
-import org.apache.solr.handler.TestSolrConfigHandlerCloud;
import org.apache.solr.handler.TestSolrConfigHandlerConcurrent;
import org.apache.solr.util.RESTfulServerProvider;
import org.apache.solr.util.RestTestBase;
@@ -482,8 +481,8 @@ public class TestSolrConfigHandler extends RestTestBase {
}
Object actual = Utils.getObjectByPath(m, false, jsonPath);
- if (expected instanceof Predicate) {
- Predicate predicate = (Predicate) expected;
+ if (expected instanceof PredicateWithErrMsg) {
+ PredicateWithErrMsg predicate = (PredicateWithErrMsg) expected;
if (predicate.test(actual) == null) {
success = true;
break;
@@ -752,7 +751,7 @@ public class TestSolrConfigHandler extends RestTestBase {
"/something/part1_Value/fixed/part2_Value?urlPart=part1&urlPart=part2",
null,
Arrays.asList("urlPart"),
- (Predicate) new Predicate() {
+ (PredicateWithErrMsg) new PredicateWithErrMsg() {
@Override
public String test(Object o) {
if (o instanceof Map) {
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/test/org/apache/solr/handler/admin/TestApiFramework.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/TestApiFramework.java b/solr/core/src/test/org/apache/solr/handler/admin/TestApiFramework.java
index d1ec3ba..f57c1f3 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/TestApiFramework.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/TestApiFramework.java
@@ -24,9 +24,8 @@ import java.util.Map;
import org.apache.solr.SolrTestCaseJ4;
import org.apache.solr.client.solrj.SolrRequest;
-import org.apache.solr.common.params.CommonParams;
import org.apache.solr.common.params.MapSolrParams;
-import org.apache.solr.common.util.Predicate;
+import org.apache.solr.common.util.PredicateWithErrMsg;
import org.apache.solr.common.util.StrUtils;
import org.apache.solr.common.util.Utils;
import org.apache.solr.core.CoreContainer;
@@ -42,11 +41,10 @@ import org.apache.solr.api.V2HttpCall;
import org.apache.solr.util.CommandOperation;
import static org.apache.solr.client.solrj.SolrRequest.METHOD.GET;
-import static org.apache.solr.client.solrj.SolrRequest.METHOD.POST;
import static org.apache.solr.common.params.CommonParams.COLLECTIONS_HANDLER_PATH;
import static org.apache.solr.common.params.CommonParams.CONFIGSETS_HANDLER_PATH;
import static org.apache.solr.common.params.CommonParams.CORES_HANDLER_PATH;
-import static org.apache.solr.common.util.Map2.NOT_NULL;
+import static org.apache.solr.common.util.ValidatingJsonMap.NOT_NULL;
public class TestApiFramework extends SolrTestCaseJ4 {
@@ -176,8 +174,8 @@ public class TestApiFramework extends SolrTestCaseJ4 {
List<String> parts = StrUtils.splitSmart(path, path.charAt(0) == '/' ? '/':' ');
if (parts.get(0).isEmpty()) parts.remove(0);
Object val = Utils.getObjectByPath(root, false, parts);
- if (e.getValue() instanceof Predicate) {
- Predicate value = (Predicate) e.getValue();
+ if (e.getValue() instanceof PredicateWithErrMsg) {
+ PredicateWithErrMsg value = (PredicateWithErrMsg) e.getValue();
String err = value.test(val);
if(err != null){
assertEquals(err + " for " + e.getKey() + " in :" + Utils.toJSONString(root), e.getValue(), val);
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/test/org/apache/solr/handler/admin/TestCollectionAPIs.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/TestCollectionAPIs.java b/solr/core/src/test/org/apache/solr/handler/admin/TestCollectionAPIs.java
index 6cfbf92..e3e6cda 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/TestCollectionAPIs.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/TestCollectionAPIs.java
@@ -123,6 +123,15 @@ public class TestCollectionAPIs extends SolrTestCaseJ4 {
"{modify : {rule : 'replica:*,cores:<5', autoAddReplicas : false} }", null,
"{collection: collName, operation : modifycollection , autoAddReplicas : 'false', rule : [{replica: '*', cores : '<5' }]}"
);
+ compareOutput(apiBag, "/cluster", POST,
+ "{add-role : {role : overseer, node : 'localhost_8978'} }", null,
+ "{operation : addrole ,role : overseer, node : 'localhost_8978'}"
+ );
+
+ compareOutput(apiBag, "/cluster", POST,
+ "{remove-role : {role : overseer, node : 'localhost_8978'} }", null,
+ "{operation : removerole ,role : overseer, node : 'localhost_8978'}"
+ );
System.out.println();
@@ -159,7 +168,7 @@ public class TestCollectionAPIs extends SolrTestCaseJ4 {
}
@Override
- public Map<String, String> getPathValues() {
+ public Map<String, String> getPathTemplateValues() {
return parts;
}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/core/src/test/org/apache/solr/util/JsonValidatorTest.java
----------------------------------------------------------------------
diff --git a/solr/core/src/test/org/apache/solr/util/JsonValidatorTest.java b/solr/core/src/test/org/apache/solr/util/JsonValidatorTest.java
index 9c3b490..0bfdc12 100644
--- a/solr/core/src/test/org/apache/solr/util/JsonValidatorTest.java
+++ b/solr/core/src/test/org/apache/solr/util/JsonValidatorTest.java
@@ -22,11 +22,11 @@ import java.util.Map;
import org.apache.solr.SolrTestCaseJ4;
import org.apache.solr.api.ApiBag;
-import org.apache.solr.common.util.Map2;
+import org.apache.solr.common.util.ValidatingJsonMap;
import org.apache.solr.common.util.StrUtils;
import org.apache.solr.common.util.Utils;
-import static org.apache.solr.common.util.Map2.NOT_NULL;
+import static org.apache.solr.common.util.ValidatingJsonMap.NOT_NULL;
import static org.apache.solr.common.util.Utils.toJSONString;
public class JsonValidatorTest extends SolrTestCaseJ4 {
@@ -49,7 +49,7 @@ public class JsonValidatorTest extends SolrTestCaseJ4 {
public void testSchemaValidation() {
- Map2 spec = ApiBag.getSpec("collections.commands").getSpec();
+ ValidatingJsonMap spec = ApiBag.getSpec("collections.commands").getSpec();
Map createSchema = spec.getMap("commands", NOT_NULL).getMap("create-alias", NOT_NULL);
JsonSchemaValidator validator = new JsonSchemaValidator(createSchema);
List<String> errs = validator.validateJson(Utils.fromJSONString("{name : x, collections: [ c1 , c2]}"));
@@ -88,7 +88,7 @@ public class JsonValidatorTest extends SolrTestCaseJ4 {
}
private void checkSchema(String name) {
- Map2 spec = ApiBag.getSpec(name).getSpec();
+ ValidatingJsonMap spec = ApiBag.getSpec(name).getSpec();
Map commands = (Map) spec.get("commands");
for (Object o : commands.entrySet()) {
Map.Entry cmd = (Map.Entry) o;
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/solrj/src/java/org/apache/solr/common/util/Map2.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/Map2.java b/solr/solrj/src/java/org/apache/solr/common/util/Map2.java
deleted file mode 100644
index 69a85be..0000000
--- a/solr/solrj/src/java/org/apache/solr/common/util/Map2.java
+++ /dev/null
@@ -1,303 +0,0 @@
-package org.apache.solr.common.util;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-
-import org.noggit.JSONParser;
-import org.noggit.ObjectBuilder;
-
-import static java.nio.charset.StandardCharsets.UTF_8;
-import static java.util.Collections.unmodifiableList;
-import static java.util.Collections.unmodifiableSet;
-
-public class Map2<K, V> implements Map<K, V> {
-
- public static final Predicate<Object> NOT_NULL = o -> {
- if (o == null) return " Must not be NULL";
- return null;
- };
- public static final Predicate<Pair> NOT_NULL_OF_TYPE = pair -> {
- if (pair.first() == null) return " Must not be NULL";
- if (pair.second() instanceof Class) {
- return ((Class) pair.first()).isAssignableFrom(pair.first().getClass()) ?
- null :
- " Must be of type " + ((Class) pair.second()).getName();
- }
- return " Unknown Type";
- };
- public static final Predicate<Pair> ENUM_OF = pair -> {
- if (pair.second() instanceof Set) {
- Set set = (Set) pair.second();
- if (pair.first() instanceof Collection) {
- for (Object o : (Collection) pair.first()) {
- if (!set.contains(o)) {
- return " Must be one of " + pair.second();
- }
- }
- } else {
- if (!set.contains(pair.first())) return " Must be one of " + pair.second() + ", got " + pair.first();
- }
- return null;
- } else {
- return " Unknown type";
- }
-
- };
- private final Map<K, V> delegate;
-
- public Map2(Map<K, V> delegate) {
- this.delegate = delegate;
- }
-
- public Map2(int i) {
- delegate = new LinkedHashMap<>(i);
- }
-
- public Map2() {
- delegate = new LinkedHashMap<>();
- }
-
- @Override
- public int size() {
- return delegate.size();
- }
-
- @Override
- public boolean isEmpty() {
- return delegate.isEmpty();
- }
-
- @Override
- public boolean containsKey(Object key) {
- return delegate.containsKey(key);
- }
-
- @Override
- public boolean containsValue(Object value) {
- return delegate.containsValue(value);
- }
-
- @Override
- public V get(Object key) {
- return delegate.get(key);
- }
-
- @Override
- public V put(K key, V value) {
- return delegate.put(key, value);
- }
-
- @Override
- public V remove(Object key) {
- return delegate.remove(key);
- }
-
- @Override
- public void putAll(Map<? extends K, ? extends V> m) {
- delegate.putAll(m);
-
- }
-
- @Override
- public void clear() {
- delegate.clear();
-
- }
-
- @Override
- public Set<K> keySet() {
- return delegate.keySet();
- }
-
- @Override
- public Collection<V> values() {
- return delegate.values();
- }
-
- @Override
- public Set<Entry<K, V>> entrySet() {
- return delegate.entrySet();
- }
-
- public V get(K k, Predicate predicate) {
- V v = get(k);
- if (predicate != null) {
- String msg = predicate.test(v);
- if (msg != null) {
- throw new RuntimeException("" + k + msg);
- }
- }
- return v;
- }
-
- public Boolean getBool(K k, Boolean def) {
- V v = get(k);
- if (v == null) return def;
- if (v instanceof Boolean) return (Boolean) v;
- try {
- return Boolean.parseBoolean(v.toString());
- } catch (NumberFormatException e) {
- throw new RuntimeException("value of " + k + "must be an boolean");
- }
- }
-
- public Integer getInt(K k, Integer def) {
- V v = get(k);
- if (v == null) return def;
- if (v instanceof Integer) return (Integer) v;
- try {
- return Integer.parseInt(v.toString());
- } catch (NumberFormatException e) {
- throw new RuntimeException("value of " + k + "must be an integer");
- }
- }
- public Map2 getMap(String key, Predicate predicate) {
- return getMap(key, predicate, null);
-
- }
-
- public Map2 getMap(String key, Predicate predicate, String message) {
- V v = get(key);
- if (v != null && !(v instanceof Map)) {
- throw new RuntimeException("" + key + " should be of type map");
- }
-
- if (predicate != null) {
- String msg = predicate.test(v);
- if (msg != null) {
- msg = message != null ? message : key + msg;
- throw new RuntimeException(msg);
- }
- }
- return wrap((Map) v);
- }
-
- public List getList(String key, Predicate predicate) {
- return getList(key, predicate, null);
- }
-
- public List getList(String key, Predicate predicate, Object test) {
- V v = get(key);
- if (v != null && !(v instanceof List)) {
- throw new RuntimeException("" + key + " should be of type List");
- }
-
- if (predicate != null) {
- String msg = predicate.test(test == null ? v : new Pair(v, test));
- if (msg != null) {
- throw new RuntimeException("" + key + msg);
- }
- }
-
- return (List) v;
- }
-
- public V get(K k, Predicate<Pair> predicate, Object arg) {
- V v = get(k);
- String test = predicate.test(new Pair(v, arg));
- if (test != null) {
- throw new RuntimeException("" + k + test);
- }
- return v;
- }
-
- public V get(K k, V def) {
- V v = get(k);
- if (v == null) return def;
- return v;
- }
-
- static <K, V> Map2<K, V> wrap(Map<K, V> map) {
- if (map == null) return null;
- if (map instanceof Map2) {
- return (Map2) map;
- } else {
- return new Map2<>(map);
- }
-
- }
-
- public static Map2 fromJSON(InputStream is) {
- return fromJSON(new InputStreamReader(is, UTF_8));
- }
-
- public static Map2 fromJSON(Reader s) {
- try {
- return (Map2) (getObjectBuilder(new JSONParser(s)).getObject());
- } catch (IOException e) {
- throw new RuntimeException();
- }
- }
-
- public static Map2 getDeepCopy(Map map, int maxDepth, boolean mutable) {
- if (map == null) return null;
- if (maxDepth < 1) return Map2.wrap(map);
- Map2 copy = mutable ? new Map2(map.size()) : new Map2<>();
- for (Object o : map.entrySet()) {
- Map.Entry e = (Map.Entry) o;
- Object v = e.getValue();
- if (v instanceof Map) v = getDeepCopy((Map) v, maxDepth - 1, mutable);
- else if (v instanceof Collection) v = getDeepCopy((Collection) v, maxDepth - 1, mutable);
- copy.put(e.getKey(), v);
- }
- return mutable ? copy : new Map2<>(Collections.unmodifiableMap(copy));
- }
-
- public static Collection getDeepCopy(Collection c, int maxDepth, boolean mutable) {
- if (c == null || maxDepth < 1) return c;
- Collection result = c instanceof Set ? new HashSet() : new ArrayList();
- for (Object o : c) {
- if (o instanceof Map) {
- o = getDeepCopy((Map) o, maxDepth - 1, mutable);
- }
- result.add(o);
- }
- return mutable ? result : result instanceof Set ? unmodifiableSet((Set) result) : unmodifiableList((List) result);
- }
-
- private static ObjectBuilder getObjectBuilder(final JSONParser jp) throws IOException {
- return new ObjectBuilder(jp) {
- @Override
- public Object newObject() throws IOException {
- return new Map2();
- }
- };
- }
-
-
- @Override
- public boolean equals(Object that) {
- return that instanceof Map && this.delegate.equals(that);
- }
-
- public static final Map2 EMPTY = new Map2(Collections.EMPTY_MAP);
-}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/solrj/src/java/org/apache/solr/common/util/Predicate.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/Predicate.java b/solr/solrj/src/java/org/apache/solr/common/util/Predicate.java
deleted file mode 100644
index 493532b..0000000
--- a/solr/solrj/src/java/org/apache/solr/common/util/Predicate.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package org.apache.solr.common.util;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-public interface Predicate<T> {
-
- /**
- * Test the object abd return null if the predicate is true
- * or return a string with a message;
- *
- * @param t test value
- * @return null if test succeeds or an error description if test fails
- */
- String test(T t);
-
-}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/solrj/src/java/org/apache/solr/common/util/PredicateWithErrMsg.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/PredicateWithErrMsg.java b/solr/solrj/src/java/org/apache/solr/common/util/PredicateWithErrMsg.java
new file mode 100644
index 0000000..0a79724
--- /dev/null
+++ b/solr/solrj/src/java/org/apache/solr/common/util/PredicateWithErrMsg.java
@@ -0,0 +1,31 @@
+package org.apache.solr.common.util;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+public interface PredicateWithErrMsg<T> {
+
+ /**
+ * Test the object and return null if the predicate is true
+ * or return a string with a message;
+ *
+ * @param t test value
+ * @return null if test succeeds or an error description if test fails
+ */
+ String test(T t);
+
+}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/baec9703/solr/solrj/src/java/org/apache/solr/common/util/ValidatingJsonMap.java
----------------------------------------------------------------------
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/ValidatingJsonMap.java b/solr/solrj/src/java/org/apache/solr/common/util/ValidatingJsonMap.java
new file mode 100644
index 0000000..553d134
--- /dev/null
+++ b/solr/solrj/src/java/org/apache/solr/common/util/ValidatingJsonMap.java
@@ -0,0 +1,291 @@
+package org.apache.solr.common.util;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.noggit.JSONParser;
+import org.noggit.ObjectBuilder;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Collections.unmodifiableList;
+import static java.util.Collections.unmodifiableSet;
+
+public class ValidatingJsonMap implements Map<String, Object> {
+
+ public static final PredicateWithErrMsg<Object> NOT_NULL = o -> {
+ if (o == null) return " Must not be NULL";
+ return null;
+ };
+ public static final PredicateWithErrMsg<Pair> ENUM_OF = pair -> {
+ if (pair.second() instanceof Set) {
+ Set set = (Set) pair.second();
+ if (pair.first() instanceof Collection) {
+ for (Object o : (Collection) pair.first()) {
+ if (!set.contains(o)) {
+ return " Must be one of " + pair.second();
+ }
+ }
+ } else {
+ if (!set.contains(pair.first())) return " Must be one of " + pair.second() + ", got " + pair.first();
+ }
+ return null;
+ } else {
+ return " Unknown type";
+ }
+
+ };
+ private final Map<String, Object> delegate;
+
+ public ValidatingJsonMap(Map<String, Object> delegate) {
+ this.delegate = delegate;
+ }
+
+ public ValidatingJsonMap(int i) {
+ delegate = new LinkedHashMap<>(i);
+ }
+
+ public ValidatingJsonMap() {
+ delegate = new LinkedHashMap<>();
+ }
+
+ @Override
+ public int size() {
+ return delegate.size();
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return delegate.isEmpty();
+ }
+
+ @Override
+ public boolean containsKey(Object key) {
+ return delegate.containsKey(key);
+ }
+
+ @Override
+ public boolean containsValue(Object value) {
+ return delegate.containsValue(value);
+ }
+
+ @Override
+ public Object get(Object key) {
+ return delegate.get(key);
+ }
+
+ @Override
+ public Object put(String key, Object value) {
+ return delegate.put(key, value);
+ }
+
+ @Override
+ public Object remove(Object key) {
+ return null;
+ }
+
+ @Override
+ public void putAll(Map<? extends String, ?> m) {
+ delegate.putAll(m);
+ }
+
+ @Override
+ public void clear() {
+ delegate.clear();
+
+ }
+
+ @Override
+ public Set<String> keySet() {
+ return delegate.keySet();
+ }
+
+ @Override
+ public Collection<Object> values() {
+ return delegate.values();
+ }
+
+ @Override
+ public Set<Entry<String, Object>> entrySet() {
+ return delegate.entrySet();
+ }
+
+ public Object get(String key, PredicateWithErrMsg predicate) {
+ Object v = get(key);
+ if (predicate != null) {
+ String msg = predicate.test(v);
+ if (msg != null) {
+ throw new RuntimeException("" + key + msg);
+ }
+ }
+ return v;
+ }
+
+ public Boolean getBool(String key, Boolean def) {
+ Object v = get(key);
+ if (v == null) return def;
+ if (v instanceof Boolean) return (Boolean) v;
+ try {
+ return Boolean.parseBoolean(v.toString());
+ } catch (NumberFormatException e) {
+ throw new RuntimeException("value of " + key + "must be an boolean");
+ }
+ }
+
+ public Integer getInt(String key, Integer def) {
+ Object v = get(key);
+ if (v == null) return def;
+ if (v instanceof Integer) return (Integer) v;
+ try {
+ return Integer.parseInt(v.toString());
+ } catch (NumberFormatException e) {
+ throw new RuntimeException("value of " + key + "must be an integer");
+ }
+ }
+ public ValidatingJsonMap getMap(String key, PredicateWithErrMsg predicate) {
+ return getMap(key, predicate, null);
+
+ }
+
+ public ValidatingJsonMap getMap(String key, PredicateWithErrMsg predicate, String message) {
+ Object v = get(key);
+ if (v != null && !(v instanceof Map)) {
+ throw new RuntimeException("" + key + " should be of type map");
+ }
+
+ if (predicate != null) {
+ String msg = predicate.test(v);
+ if (msg != null) {
+ msg = message != null ? message : key + msg;
+ throw new RuntimeException(msg);
+ }
+ }
+ return wrap((Map) v);
+ }
+
+ public List getList(String key, PredicateWithErrMsg predicate) {
+ return getList(key, predicate, null);
+ }
+
+ public List getList(String key, PredicateWithErrMsg predicate, Object test) {
+ Object v = get(key);
+ if (v != null && !(v instanceof List)) {
+ throw new RuntimeException("" + key + " should be of type List");
+ }
+
+ if (predicate != null) {
+ String msg = predicate.test(test == null ? v : new Pair(v, test));
+ if (msg != null) {
+ throw new RuntimeException("" + key + msg);
+ }
+ }
+
+ return (List) v;
+ }
+
+ public Object get(String key, PredicateWithErrMsg<Pair> predicate, Object arg) {
+ Object v = get(key);
+ String test = predicate.test(new Pair(v, arg));
+ if (test != null) {
+ throw new RuntimeException("" + key + test);
+ }
+ return v;
+ }
+
+ public Object get(String k, Object def) {
+ Object v = get(k);
+ if (v == null) return def;
+ return v;
+ }
+
+ static ValidatingJsonMap wrap(Map<String, Object> map) {
+ if (map == null) return null;
+ if (map instanceof ValidatingJsonMap) {
+ return (ValidatingJsonMap) map;
+ } else {
+ return new ValidatingJsonMap(map);
+ }
+
+ }
+
+ public static ValidatingJsonMap fromJSON(InputStream is) {
+ return fromJSON(new InputStreamReader(is, UTF_8));
+ }
+
+ public static ValidatingJsonMap fromJSON(Reader s) {
+ try {
+ return (ValidatingJsonMap) (getObjectBuilder(new JSONParser(s)).getObject());
+ } catch (IOException e) {
+ throw new RuntimeException();
+ }
+ }
+
+ public static ValidatingJsonMap getDeepCopy(Map map, int maxDepth, boolean mutable) {
+ if (map == null) return null;
+ if (maxDepth < 1) return ValidatingJsonMap.wrap(map);
+ ValidatingJsonMap copy = mutable ? new ValidatingJsonMap(map.size()) : new ValidatingJsonMap();
+ for (Object o : map.entrySet()) {
+ Map.Entry<String,Object> e = (Entry<String, Object>) o;
+ Object v = e.getValue();
+ if (v instanceof Map) v = getDeepCopy((Map) v, maxDepth - 1, mutable);
+ else if (v instanceof Collection) v = getDeepCopy((Collection) v, maxDepth - 1, mutable);
+ copy.put(e.getKey(), v);
+ }
+ return mutable ? copy : new ValidatingJsonMap(Collections.unmodifiableMap(copy));
+ }
+
+ public static Collection getDeepCopy(Collection c, int maxDepth, boolean mutable) {
+ if (c == null || maxDepth < 1) return c;
+ Collection result = c instanceof Set ? new HashSet() : new ArrayList();
+ for (Object o : c) {
+ if (o instanceof Map) {
+ o = getDeepCopy((Map) o, maxDepth - 1, mutable);
+ }
+ result.add(o);
+ }
+ return mutable ? result : result instanceof Set ? unmodifiableSet((Set) result) : unmodifiableList((List) result);
+ }
+
+ private static ObjectBuilder getObjectBuilder(final JSONParser jp) throws IOException {
+ return new ObjectBuilder(jp) {
+ @Override
+ public Object newObject() throws IOException {
+ return new ValidatingJsonMap();
+ }
+ };
+ }
+
+
+ @Override
+ public boolean equals(Object that) {
+ return that instanceof Map && this.delegate.equals(that);
+ }
+
+ public static final ValidatingJsonMap EMPTY = new ValidatingJsonMap(Collections.EMPTY_MAP);
+}
[2/2] lucene-solr:apiv2: Merge remote-tracking branch 'origin/apiv2'
into apiv2
Posted by no...@apache.org.
Merge remote-tracking branch 'origin/apiv2' into apiv2
Conflicts:
solr/core/src/java/org/apache/solr/api/SpecProvider.java
solr/core/src/java/org/apache/solr/security/RuleBasedAuthorizationPlugin.java
solr/core/src/java/org/apache/solr/security/Sha256AuthenticationProvider.java
solr/core/src/test/org/apache/solr/util/JsonValidatorTest.java
solr/solrj/src/java/org/apache/solr/common/util/PredicateWithErrMsg.java
Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/92411981
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/92411981
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/92411981
Branch: refs/heads/apiv2
Commit: 92411981a82256d2add58e45e13f1065dad27ab4
Parents: baec970 327aaff
Author: Noble Paul <no...@apache.org>
Authored: Sat Sep 3 23:35:58 2016 +0530
Committer: Noble Paul <no...@apache.org>
Committed: Sat Sep 3 23:35:58 2016 +0530
----------------------------------------------------------------------
build.xml | 39 +-
.../dot.settings/org.eclipse.jdt.core.prefs | 3 +
.../idea/.idea/copyright/profiles_settings.xml | 1 -
.../test-framework/lucene-test-framework.iml | 1 +
.../lucene/analysis/common/pom.xml.template | 13 +
dev-tools/maven/pom.xml.template | 4 +-
.../contrib/analysis-extras/pom.xml.template | 7 +
dev-tools/maven/solr/pom.xml.template | 6 +-
.../maven/solr/test-framework/pom.xml.template | 5 +-
dev-tools/scripts/addBackcompatIndexes.py | 30 +-
dev-tools/scripts/addVersion.py | 19 +-
dev-tools/scripts/releasedJirasRegex.py | 93 +
dev-tools/scripts/scriptutil.py | 7 +-
lucene/CHANGES.txt | 182 +-
lucene/MIGRATE.txt | 103 +-
lucene/analysis/common/build.xml | 39 +-
.../lucene/analysis/ar/ArabicAnalyzer.java | 20 +-
.../lucene/analysis/bg/BulgarianAnalyzer.java | 17 +-
.../lucene/analysis/br/BrazilianAnalyzer.java | 17 +-
.../lucene/analysis/ca/CatalanAnalyzer.java | 18 +-
.../charfilter/HTMLStripCharFilter.java | 5 +-
.../charfilter/HTMLStripCharFilter.jflex | 1 +
.../apache/lucene/analysis/cjk/CJKAnalyzer.java | 15 +-
.../lucene/analysis/ckb/SoraniAnalyzer.java | 23 +-
.../analysis/commongrams/CommonGramsFilter.java | 4 +-
.../commongrams/CommonGramsFilterFactory.java | 3 +-
.../compound/CompoundWordTokenFilterBase.java | 8 +-
.../DictionaryCompoundWordTokenFilter.java | 2 +-
...ictionaryCompoundWordTokenFilterFactory.java | 8 +-
.../HyphenationCompoundWordTokenFilter.java | 7 +-
...phenationCompoundWordTokenFilterFactory.java | 11 +-
.../lucene/analysis/core/LowerCaseFilter.java | 50 -
.../analysis/core/LowerCaseFilterFactory.java | 2 +-
.../lucene/analysis/core/SimpleAnalyzer.java | 7 +
.../lucene/analysis/core/StopAnalyzer.java | 31 +-
.../apache/lucene/analysis/core/StopFilter.java | 111 -
.../lucene/analysis/core/StopFilterFactory.java | 11 +-
.../lucene/analysis/core/TypeTokenFilter.java | 2 +-
.../lucene/analysis/core/UpperCaseFilter.java | 3 +-
.../lucene/analysis/custom/CustomAnalyzer.java | 28 +-
.../lucene/analysis/cz/CzechAnalyzer.java | 25 +-
.../lucene/analysis/da/DanishAnalyzer.java | 19 +-
.../lucene/analysis/de/GermanAnalyzer.java | 20 +-
.../lucene/analysis/el/GreekAnalyzer.java | 13 +-
.../apache/lucene/analysis/el/GreekStemmer.java | 2 +-
.../lucene/analysis/en/EnglishAnalyzer.java | 15 +-
.../org/apache/lucene/analysis/en/KStemmer.java | 2 +-
.../lucene/analysis/es/SpanishAnalyzer.java | 19 +-
.../lucene/analysis/eu/BasqueAnalyzer.java | 17 +-
.../lucene/analysis/fa/PersianAnalyzer.java | 22 +-
.../lucene/analysis/fi/FinnishAnalyzer.java | 19 +-
.../lucene/analysis/fr/FrenchAnalyzer.java | 32 +-
.../lucene/analysis/ga/IrishAnalyzer.java | 16 +-
.../lucene/analysis/gl/GalicianAnalyzer.java | 19 +-
.../lucene/analysis/hi/HindiAnalyzer.java | 23 +-
.../lucene/analysis/hu/HungarianAnalyzer.java | 19 +-
.../lucene/analysis/hunspell/Stemmer.java | 2 +-
.../lucene/analysis/hy/ArmenianAnalyzer.java | 17 +-
.../lucene/analysis/id/IndonesianAnalyzer.java | 17 +-
.../lucene/analysis/it/ItalianAnalyzer.java | 20 +-
.../lucene/analysis/lt/LithuanianAnalyzer.java | 17 +-
.../lucene/analysis/lv/LatvianAnalyzer.java | 19 +-
.../lucene/analysis/minhash/MinHashFilter.java | 6 +-
.../analysis/minhash/MinHashFilterFactory.java | 5 +-
.../miscellaneous/CapitalizationFilter.java | 2 +-
.../CapitalizationFilterFactory.java | 8 +-
.../miscellaneous/CodepointCountFilter.java | 2 +-
.../miscellaneous/DateRecognizerFilter.java | 2 +-
.../miscellaneous/FingerprintFilter.java | 2 +-
.../analysis/miscellaneous/KeepWordFilter.java | 4 +-
.../miscellaneous/KeepWordFilterFactory.java | 8 +-
.../KeywordMarkerFilterFactory.java | 2 +-
.../analysis/miscellaneous/LengthFilter.java | 2 +-
.../RemoveDuplicatesTokenFilter.java | 2 +-
.../ScandinavianFoldingFilterFactory.java | 10 +-
.../ScandinavianNormalizationFilterFactory.java | 10 +-
.../miscellaneous/SetKeywordMarkerFilter.java | 2 +-
.../miscellaneous/WordDelimiterFilter.java | 10 +-
.../WordDelimiterFilterFactory.java | 16 +-
.../lucene/analysis/ngram/NGramTokenizer.java | 2 +-
.../lucene/analysis/nl/DutchAnalyzer.java | 29 +-
.../lucene/analysis/no/NorwegianAnalyzer.java | 19 +-
.../lucene/analysis/pt/PortugueseAnalyzer.java | 19 +-
.../lucene/analysis/pt/RSLPStemmerBase.java | 2 +-
.../query/QueryAutoStopWordAnalyzer.java | 4 +-
.../lucene/analysis/ro/RomanianAnalyzer.java | 17 +-
.../lucene/analysis/ru/RussianAnalyzer.java | 23 +-
.../analysis/snowball/SnowballFilter.java | 4 +-
.../snowball/SnowballPorterFilterFactory.java | 6 +-
.../analysis/standard/ASCIITLD.jflex-macro | 2 +-
.../analysis/standard/ClassicAnalyzer.java | 15 +-
.../analysis/standard/ClassicTokenizer.java | 1 +
.../standard/ClassicTokenizerImpl.jflex | 1 +
.../analysis/standard/StandardAnalyzer.java | 98 -
.../analysis/standard/StandardFilter.java | 38 -
.../analysis/standard/StandardTokenizer.java | 201 -
.../standard/StandardTokenizerImpl.java | 818 ---
.../standard/StandardTokenizerImpl.jflex | 201 -
.../standard/UAX29URLEmailAnalyzer.java | 19 +-
.../standard/UAX29URLEmailTokenizer.java | 1 +
.../standard/UAX29URLEmailTokenizerImpl.jflex | 1 +
.../lucene/analysis/standard/package-info.java | 63 -
.../lucene/analysis/standard/package.html | 50 +
.../lucene/analysis/sv/SwedishAnalyzer.java | 19 +-
.../analysis/synonym/SynonymFilterFactory.java | 2 +-
.../apache/lucene/analysis/th/ThaiAnalyzer.java | 15 +-
.../lucene/analysis/tr/TurkishAnalyzer.java | 15 +-
.../analysis/util/AbstractAnalysisFactory.java | 4 +-
.../lucene/analysis/util/CharArrayMap.java | 669 ---
.../lucene/analysis/util/CharArraySet.java | 193 -
.../lucene/analysis/util/CharTokenizer.java | 10 +-
.../lucene/analysis/util/CharacterUtils.java | 251 -
.../lucene/analysis/util/ElisionFilter.java | 2 +-
.../analysis/util/ElisionFilterFactory.java | 1 +
.../analysis/util/FilteringTokenFilter.java | 76 -
.../analysis/util/StopwordAnalyzerBase.java | 138 -
.../lucene/analysis/util/UnicodeProps.java | 4 +-
.../lucene/analysis/util/WordlistLoader.java | 244 -
.../wikipedia/WikipediaTokenizerImpl.java | 1 +
.../wikipedia/WikipediaTokenizerImpl.jflex | 1 +
.../lucene/collation/CollationKeyAnalyzer.java | 7 +
.../apache/lucene/collation/package-info.java | 2 +-
.../lucene/analysis/ar/TestArabicAnalyzer.java | 2 +-
.../analysis/ar/TestArabicStemFilter.java | 2 +-
.../analysis/bg/TestBulgarianAnalyzer.java | 2 +-
.../analysis/bg/TestBulgarianStemmer.java | 2 +-
.../analysis/br/TestBrazilianAnalyzer.java | 2 +-
.../lucene/analysis/ca/TestCatalanAnalyzer.java | 2 +-
.../lucene/analysis/cjk/TestCJKAnalyzer.java | 4 +-
.../lucene/analysis/ckb/TestSoraniAnalyzer.java | 2 +-
.../commongrams/CommonGramsFilterTest.java | 2 +-
.../TestCommonGramsFilterFactory.java | 10 +-
.../TestCommonGramsQueryFilterFactory.java | 7 +-
.../compound/TestCompoundWordTokenFilter.java | 2 +-
.../core/TestAllAnalyzersHaveFactories.java | 4 +
.../lucene/analysis/core/TestAnalyzers.java | 5 +
.../analysis/core/TestBugInSomething.java | 2 +-
.../lucene/analysis/core/TestRandomChains.java | 16 +-
.../lucene/analysis/core/TestStopAnalyzer.java | 14 +-
.../lucene/analysis/core/TestStopFilter.java | 176 -
.../analysis/core/TestStopFilterFactory.java | 2 +-
.../analysis/custom/TestCustomAnalyzer.java | 143 +
.../lucene/analysis/cz/TestCzechAnalyzer.java | 4 +-
.../lucene/analysis/cz/TestCzechStemmer.java | 2 +-
.../lucene/analysis/da/TestDanishAnalyzer.java | 2 +-
.../lucene/analysis/de/TestGermanAnalyzer.java | 2 +-
.../analysis/de/TestGermanLightStemFilter.java | 2 +-
.../de/TestGermanMinimalStemFilter.java | 2 +-
.../analysis/de/TestGermanStemFilter.java | 4 +-
.../lucene/analysis/en/TestEnglishAnalyzer.java | 2 +-
.../analysis/en/TestPorterStemFilter.java | 8 +-
.../lucene/analysis/es/TestSpanishAnalyzer.java | 2 +-
.../lucene/analysis/eu/TestBasqueAnalyzer.java | 2 +-
.../lucene/analysis/fa/TestPersianAnalyzer.java | 2 +-
.../lucene/analysis/fi/TestFinnishAnalyzer.java | 2 +-
.../analysis/fi/TestFinnishLightStemFilter.java | 2 +-
.../lucene/analysis/fr/TestFrenchAnalyzer.java | 2 +-
.../analysis/fr/TestFrenchLightStemFilter.java | 2 +-
.../fr/TestFrenchMinimalStemFilter.java | 2 +-
.../lucene/analysis/ga/TestIrishAnalyzer.java | 2 +-
.../analysis/gl/TestGalicianAnalyzer.java | 2 +-
.../gl/TestGalicianMinimalStemFilter.java | 2 +-
.../lucene/analysis/hi/TestHindiAnalyzer.java | 2 +-
.../analysis/hu/TestHungarianAnalyzer.java | 2 +-
.../hu/TestHungarianLightStemFilter.java | 2 +-
.../hunspell/TestHunspellStemFilter.java | 2 +-
.../analysis/hy/TestArmenianAnalyzer.java | 2 +-
.../analysis/id/TestIndonesianAnalyzer.java | 2 +-
.../lucene/analysis/it/TestItalianAnalyzer.java | 2 +-
.../analysis/lt/TestLithuanianAnalyzer.java | 2 +-
.../lucene/analysis/lv/TestLatvianAnalyzer.java | 2 +-
.../analysis/minhash/MinHashFilterTest.java | 4 +-
.../miscellaneous/TestCapitalizationFilter.java | 2 +-
.../miscellaneous/TestKeepFilterFactory.java | 4 +-
.../miscellaneous/TestKeepWordFilter.java | 2 +-
.../miscellaneous/TestKeywordMarkerFilter.java | 4 +-
.../TestStemmerOverrideFilter.java | 2 +-
.../miscellaneous/TestWordDelimiterFilter.java | 12 +-
.../lucene/analysis/nl/TestDutchAnalyzer.java | 6 +-
.../analysis/no/TestNorwegianAnalyzer.java | 2 +-
.../no/TestNorwegianLightStemFilter.java | 2 +-
.../no/TestNorwegianMinimalStemFilter.java | 2 +-
.../analysis/pt/TestPortugueseAnalyzer.java | 2 +-
.../pt/TestPortugueseLightStemFilter.java | 2 +-
.../pt/TestPortugueseMinimalStemFilter.java | 2 +-
.../analysis/pt/TestPortugueseStemFilter.java | 6 +-
.../analysis/ro/TestRomanianAnalyzer.java | 2 +-
.../lucene/analysis/ru/TestRussianAnalyzer.java | 4 +-
.../analysis/ru/TestRussianLightStemFilter.java | 2 +-
.../shingle/ShingleAnalyzerWrapperTest.java | 4 +-
.../analysis/sinks/TestTeeSinkTokenFilter.java | 4 +-
.../analysis/standard/TestStandardAnalyzer.java | 390 --
.../standard/WordBreakTestUnicode_6_3_0.java | 5537 ------------------
.../generateJavaUnicodeWordBreakTest.pl | 232 -
.../lucene/analysis/sv/TestSwedishAnalyzer.java | 2 +-
.../analysis/sv/TestSwedishLightStemFilter.java | 2 +-
.../lucene/analysis/th/TestThaiAnalyzer.java | 2 +-
.../lucene/analysis/tr/TestTurkishAnalyzer.java | 2 +-
.../lucene/analysis/util/TestCharArrayMap.java | 244 -
.../lucene/analysis/util/TestCharArraySet.java | 429 --
.../analysis/util/TestCharacterUtils.java | 107 -
.../lucene/analysis/util/TestElision.java | 2 +-
.../util/TestFilesystemResourceLoader.java | 2 +
.../analysis/util/TestWordlistLoader.java | 79 -
.../tools/groovy/generate-unicode-data.groovy | 4 +-
.../icu/src/data/uax29/MyanmarSyllable.rbbi | 50 +
.../segmentation/DefaultICUTokenizerConfig.java | 14 +-
.../analysis/icu/segmentation/ICUTokenizer.java | 2 +-
.../icu/segmentation/ICUTokenizerFactory.java | 6 +-
lucene/analysis/icu/src/java/overview.html | 2 +-
.../icu/segmentation/MyanmarSyllable.brk | Bin 0 -> 19776 bytes
.../icu/segmentation/TestICUTokenizer.java | 6 +-
.../icu/segmentation/TestICUTokenizerCJK.java | 2 +-
.../icu/segmentation/TestMyanmarSyllable.java | 156 +
.../segmentation/TestWithCJKBigramFilter.java | 8 +-
.../lucene/analysis/ja/JapaneseAnalyzer.java | 15 +-
.../analysis/ja/JapaneseNumberFilter.java | 4 +-
.../ja/JapanesePartOfSpeechStopFilter.java | 4 +-
.../JapanesePartOfSpeechStopFilterFactory.java | 2 +-
.../analysis/ja/TestJapaneseBaseFormFilter.java | 2 +-
.../ja/TestJapaneseKatakanaStemFilter.java | 6 +-
.../analysis/ja/TestJapaneseNumberFilter.java | 2 +-
.../analysis/morfologik/MorfologikAnalyzer.java | 6 +
.../analysis/morfologik/MorfologikFilter.java | 12 +-
.../uk/UkrainianMorfologikAnalyzer.java | 153 +
.../apache/lucene/analysis/uk/package-info.java | 21 +
.../apache/lucene/analysis/uk/mapping_uk.txt | 19 +
.../org/apache/lucene/analysis/uk/stopwords.txt | 1269 ++++
.../apache/lucene/analysis/uk/ukrainian.dict | Bin 0 -> 1989243 bytes
.../apache/lucene/analysis/uk/ukrainian.info | 10 +
.../morfologik/TestMorfologikAnalyzer.java | 2 +-
.../analysis/uk/TestUkrainianAnalyzer.java | 72 +
.../analysis/cn/smart/SmartChineseAnalyzer.java | 12 +-
.../lucene/analysis/pl/PolishAnalyzer.java | 21 +-
.../lucene/analysis/pl/TestPolishAnalyzer.java | 2 +-
.../index/TestBackwardsCompatibility.java | 42 +-
.../org/apache/lucene/index/index.6.0.0-cfs.zip | Bin 13744 -> 15807 bytes
.../apache/lucene/index/index.6.0.0-nocfs.zip | Bin 13749 -> 15806 bytes
.../org/apache/lucene/index/index.6.0.1-cfs.zip | Bin 13734 -> 15820 bytes
.../apache/lucene/index/index.6.0.1-nocfs.zip | Bin 13735 -> 15823 bytes
.../org/apache/lucene/index/index.6.1.0-cfs.zip | Bin 0 -> 15803 bytes
.../apache/lucene/index/index.6.1.0-nocfs.zip | Bin 0 -> 15829 bytes
.../lucene/index/unsupported.5.5.2-cfs.zip | Bin 0 -> 13712 bytes
.../lucene/index/unsupported.5.5.2-nocfs.zip | Bin 0 -> 13720 bytes
.../benchmark/byTask/tasks/CommitIndexTask.java | 2 +-
.../benchmark/quality/TestQualityRun.java | 3 -
.../lucene/benchmark/quality/trecQRels.txt | 428 +-
lucene/build.xml | 15 +-
.../BooleanPerceptronClassifier.java | 20 +-
.../CachingNaiveBayesClassifier.java | 18 +-
.../KNearestNeighborClassifier.java | 9 +-
.../SimpleNaiveBayesClassifier.java | 24 +-
.../KNearestNeighborDocumentClassifier.java | 10 +-
.../SimpleNaiveBayesDocumentClassifier.java | 16 +-
.../utils/ConfusionMatrixGenerator.java | 8 +-
.../classification/utils/DatasetSplitter.java | 30 +-
.../DocumentClassificationTestBase.java | 11 +-
.../KNearestNeighborDocumentClassifierTest.java | 40 +-
.../SimpleNaiveBayesDocumentClassifierTest.java | 32 +-
.../autoprefix/AutoPrefixPostingsFormat.java | 125 -
.../lucene/codecs/autoprefix/package-info.java | 22 -
.../simpletext/SimpleTextCompoundFormat.java | 5 +-
.../simpletext/SimpleTextPointsWriter.java | 16 +-
.../org.apache.lucene.codecs.PostingsFormat | 1 -
.../TestAutoPrefixPostingsFormat.java | 38 -
.../codecs/autoprefix/TestAutoPrefixTerms.java | 941 ---
lucene/common-build.xml | 48 +-
lucene/core/build.xml | 18 +-
.../org/apache/lucene/analysis/Analyzer.java | 135 +-
.../apache/lucene/analysis/CharArrayMap.java | 669 +++
.../apache/lucene/analysis/CharArraySet.java | 196 +
.../apache/lucene/analysis/CharacterUtils.java | 251 +
.../lucene/analysis/FilteringTokenFilter.java | 76 +
.../apache/lucene/analysis/LowerCaseFilter.java | 50 +
.../org/apache/lucene/analysis/StopFilter.java | 111 +
.../lucene/analysis/StopwordAnalyzerBase.java | 138 +
.../apache/lucene/analysis/WordlistLoader.java | 244 +
.../apache/lucene/analysis/package-info.java | 2 +-
.../analysis/standard/StandardAnalyzer.java | 122 +
.../analysis/standard/StandardFilter.java | 39 +
.../analysis/standard/StandardTokenizer.java | 214 +
.../standard/StandardTokenizerImpl.java | 823 +++
.../standard/StandardTokenizerImpl.jflex | 207 +
.../lucene/analysis/standard/package-info.java | 33 +
.../apache/lucene/codecs/BlockTermState.java | 14 +-
.../lucene/codecs/MutablePointsReader.java | 39 +
.../codecs/blocktree/AutoPrefixTermsWriter.java | 438 --
.../codecs/blocktree/BlockTreeTermsReader.java | 11 +-
.../codecs/blocktree/BlockTreeTermsWriter.java | 222 +-
.../codecs/blocktree/IntersectTermsEnum.java | 2 -
.../codecs/lucene50/Lucene50CompoundReader.java | 7 +-
.../codecs/lucene60/Lucene60PointsWriter.java | 9 +
.../org/apache/lucene/document/BinaryPoint.java | 2 +-
.../lucene/document/CompressionTools.java | 150 -
.../org/apache/lucene/document/FieldType.java | 2 +-
.../lucene/document/SortedDocValuesField.java | 4 +-
.../document/SortedSetDocValuesField.java | 2 +
.../java/org/apache/lucene/geo/GeoUtils.java | 43 +-
.../src/java/org/apache/lucene/geo/Polygon.java | 13 +-
.../java/org/apache/lucene/geo/Rectangle.java | 4 +-
.../lucene/geo/SimpleGeoJSONPolygonParser.java | 440 ++
.../apache/lucene/index/DocumentsWriter.java | 15 +-
.../index/DocumentsWriterFlushControl.java | 27 +-
.../index/DocumentsWriterStallControl.java | 26 +-
.../org/apache/lucene/index/IndexCommit.java | 2 +-
.../org/apache/lucene/index/IndexUpgrader.java | 2 +-
.../org/apache/lucene/index/IndexWriter.java | 74 +-
.../apache/lucene/index/IndexWriterConfig.java | 17 +-
.../apache/lucene/index/MergeReaderWrapper.java | 4 +-
.../apache/lucene/index/PointValuesWriter.java | 160 +-
.../org/apache/lucene/index/SegmentInfos.java | 35 +-
.../apache/lucene/index/SortingLeafReader.java | 4 +-
.../org/apache/lucene/index/TermContext.java | 12 -
.../java/org/apache/lucene/index/TermState.java | 6 -
.../apache/lucene/search/BlendedTermQuery.java | 6 +-
.../org/apache/lucene/search/BooleanQuery.java | 44 +-
.../org/apache/lucene/search/BooleanScorer.java | 36 +-
.../lucene/search/BooleanTopLevelScorers.java | 182 -
.../org/apache/lucene/search/BooleanWeight.java | 180 +-
.../org/apache/lucene/search/BoostQuery.java | 44 +-
.../apache/lucene/search/ConjunctionDISI.java | 124 +-
.../apache/lucene/search/ConjunctionScorer.java | 10 +-
.../lucene/search/ConstantScoreQuery.java | 6 +-
.../lucene/search/ConstantScoreWeight.java | 35 +-
.../lucene/search/DisjunctionMaxQuery.java | 29 +-
.../lucene/search/DisjunctionSumScorer.java | 11 +-
.../lucene/search/DocValuesRewriteMethod.java | 4 +-
.../org/apache/lucene/search/Explanation.java | 33 +-
.../apache/lucene/search/FieldValueQuery.java | 4 +-
.../org/apache/lucene/search/FilterWeight.java | 73 +
.../org/apache/lucene/search/IndexSearcher.java | 27 +-
.../org/apache/lucene/search/LRUQueryCache.java | 36 +-
.../lucene/search/LeafFieldComparator.java | 7 +-
.../apache/lucene/search/MatchAllDocsQuery.java | 4 +-
.../apache/lucene/search/MatchNoDocsQuery.java | 42 +-
.../lucene/search/MinShouldMatchSumScorer.java | 6 +-
.../apache/lucene/search/MultiPhraseQuery.java | 20 +-
.../apache/lucene/search/MultiTermQuery.java | 8 +-
.../MultiTermQueryConstantScoreWrapper.java | 11 +-
.../org/apache/lucene/search/PhraseQuery.java | 20 +-
.../apache/lucene/search/PointInSetQuery.java | 4 +-
.../apache/lucene/search/PointRangeQuery.java | 4 +-
.../java/org/apache/lucene/search/Query.java | 3 +-
.../lucene/search/RandomAccessWeight.java | 4 +-
.../apache/lucene/search/ScoringRewrite.java | 6 +-
.../org/apache/lucene/search/SynonymQuery.java | 20 +-
.../org/apache/lucene/search/TermQuery.java | 86 +-
.../java/org/apache/lucene/search/Weight.java | 15 +-
.../org/apache/lucene/search/package-info.java | 29 +-
.../search/similarities/BM25Similarity.java | 25 +-
.../lucene/search/similarities/BasicStats.java | 35 +-
.../search/similarities/ClassicSimilarity.java | 12 -
.../search/similarities/LMSimilarity.java | 8 +-
.../search/similarities/MultiSimilarity.java | 20 +-
.../similarities/PerFieldSimilarityWrapper.java | 14 +-
.../lucene/search/similarities/Similarity.java | 64 +-
.../search/similarities/SimilarityBase.java | 8 +-
.../search/similarities/TFIDFSimilarity.java | 168 +-
.../search/spans/FieldMaskingSpanQuery.java | 4 +-
.../search/spans/ScoringWrapperSpans.java | 95 -
.../lucene/search/spans/SpanBoostQuery.java | 54 +-
.../lucene/search/spans/SpanContainQuery.java | 4 +-
.../search/spans/SpanContainingQuery.java | 12 +-
.../search/spans/SpanMultiTermQueryWrapper.java | 2 +-
.../lucene/search/spans/SpanNearQuery.java | 18 +-
.../lucene/search/spans/SpanNotQuery.java | 14 +-
.../apache/lucene/search/spans/SpanOrQuery.java | 12 +-
.../search/spans/SpanPositionCheckQuery.java | 10 +-
.../apache/lucene/search/spans/SpanQuery.java | 2 +-
.../apache/lucene/search/spans/SpanScorer.java | 10 +-
.../lucene/search/spans/SpanTermQuery.java | 8 +-
.../apache/lucene/search/spans/SpanWeight.java | 20 +-
.../lucene/search/spans/SpanWithinQuery.java | 12 +-
.../lucene/store/ByteArrayIndexInput.java | 4 +-
.../java/org/apache/lucene/store/Directory.java | 8 +-
.../org/apache/lucene/store/FSDirectory.java | 15 +-
.../lucene/store/FileSwitchDirectory.java | 10 +-
.../apache/lucene/store/FilterDirectory.java | 9 +-
.../store/LockValidatingDirectoryWrapper.java | 10 +-
.../lucene/store/NRTCachingDirectory.java | 4 +-
.../org/apache/lucene/store/RAMDirectory.java | 22 +-
.../lucene/store/TrackingDirectoryWrapper.java | 4 +-
.../java/org/apache/lucene/util/ArrayUtil.java | 71 +-
.../org/apache/lucene/util/BitSetIterator.java | 10 +
.../org/apache/lucene/util/ByteBlockPool.java | 8 +
.../org/apache/lucene/util/IntroSelector.java | 126 +
.../org/apache/lucene/util/IntroSorter.java | 7 +-
.../org/apache/lucene/util/QueryBuilder.java | 1 -
.../org/apache/lucene/util/RadixSelector.java | 202 +
.../java/org/apache/lucene/util/Selector.java | 41 +
.../java/org/apache/lucene/util/SloppyMath.java | 20 +-
.../org/apache/lucene/util/bkd/BKDReader.java | 83 +-
.../org/apache/lucene/util/bkd/BKDWriter.java | 638 +-
.../apache/lucene/util/bkd/DocIdsWriter.java | 170 +
.../util/bkd/MutablePointsReaderUtils.java | 185 +
.../org/apache/lucene/util/packed/Direct16.java | 2 +-
.../org/apache/lucene/util/packed/Direct32.java | 2 +-
.../org/apache/lucene/util/packed/Direct64.java | 2 +-
.../org/apache/lucene/util/packed/Direct8.java | 2 +-
.../lucene/util/packed/Packed16ThreeBlocks.java | 2 +-
.../lucene/util/packed/Packed64SingleBlock.java | 2 +-
.../lucene/util/packed/Packed8ThreeBlocks.java | 2 +-
lucene/core/src/java/overview.html | 2 +-
.../lucene/analysis/TestCharArrayMap.java | 244 +
.../lucene/analysis/TestCharArraySet.java | 430 ++
.../lucene/analysis/TestCharacterUtils.java | 107 +
.../apache/lucene/analysis/TestStopFilter.java | 139 +
.../lucene/analysis/TestWordlistLoader.java | 79 +
.../analysis/standard/TestStandardAnalyzer.java | 396 ++
.../lucene62/TestLucene62SegmentInfoFormat.java | 4 +-
.../lucene/document/TestBinaryDocument.java | 29 -
.../test/org/apache/lucene/geo/TestPolygon.java | 241 +
.../index/TestAllFilesCheckIndexHeader.java | 6 -
.../index/TestConcurrentMergeScheduler.java | 3 -
.../test/org/apache/lucene/index/TestCrash.java | 1 -
.../apache/lucene/index/TestCustomNorms.java | 12 +-
.../apache/lucene/index/TestDeletionPolicy.java | 4 +-
.../lucene/index/TestDirectoryReaderReopen.java | 4 +-
.../index/TestDocumentsWriterStallControl.java | 6 +-
.../lucene/index/TestIndexFileDeleter.java | 3 -
.../apache/lucene/index/TestIndexSorting.java | 8 +-
.../apache/lucene/index/TestIndexWriter.java | 43 +-
.../lucene/index/TestIndexWriterCommit.java | 57 +-
.../lucene/index/TestIndexWriterDelete.java | 1 -
.../index/TestIndexWriterExceptions2.java | 1 -
.../lucene/index/TestIndexWriterFromReader.java | 9 -
.../lucene/index/TestIndexWriterMerging.java | 5 -
.../lucene/index/TestIndexWriterOnDiskFull.java | 1 -
.../TestIndexWriterOutOfFileDescriptors.java | 1 -
.../index/TestIndexWriterWithThreads.java | 3 -
.../lucene/index/TestMaxTermFrequency.java | 2 -
.../lucene/index/TestNRTReaderCleanup.java | 3 -
.../test/org/apache/lucene/index/TestNorms.java | 15 +-
.../org/apache/lucene/index/TestOmitTf.java | 4 -
.../apache/lucene/index/TestPointValues.java | 3 +-
.../lucene/index/TestTransactionRollback.java | 4 +-
.../apache/lucene/index/TestTransactions.java | 2 -
.../lucene/index/TestUniqueTermCount.java | 2 +-
.../apache/lucene/search/JustCompileSearch.java | 12 +-
.../org/apache/lucene/search/TestBoolean2.java | 65 +-
.../apache/lucene/search/TestBooleanCoord.java | 860 ---
.../search/TestBooleanMinShouldMatch.java | 58 +-
.../org/apache/lucene/search/TestBooleanOr.java | 2 +-
.../apache/lucene/search/TestBooleanQuery.java | 37 +-
.../search/TestBooleanQueryVisitSubscorers.java | 5 +-
.../lucene/search/TestBooleanRewrites.java | 14 -
.../apache/lucene/search/TestBooleanScorer.java | 26 +-
.../apache/lucene/search/TestBoostQuery.java | 4 +-
.../lucene/search/TestComplexExplanations.java | 17 +-
.../lucene/search/TestConjunctionDISI.java | 98 +-
.../apache/lucene/search/TestConjunctions.java | 13 +-
.../lucene/search/TestConstantScoreQuery.java | 13 +-
.../TestControlledRealTimeReopenThread.java | 15 +
.../lucene/search/TestDocValuesScoring.java | 14 +-
.../apache/lucene/search/TestFilterWeight.java | 67 +
.../apache/lucene/search/TestLRUQueryCache.java | 35 +-
.../lucene/search/TestMatchNoDocsQuery.java | 50 +-
.../lucene/search/TestMinShouldMatch2.java | 13 +-
.../lucene/search/TestMultiPhraseQuery.java | 27 -
.../search/TestMultiTermConstantScore.java | 74 -
.../search/TestMultiTermQueryRewrites.java | 12 +-
.../apache/lucene/search/TestNeedsScores.java | 14 +-
.../lucene/search/TestPositionIncrement.java | 4 +-
.../search/TestPositiveScoresOnlyCollector.java | 2 +-
.../apache/lucene/search/TestQueryRescorer.java | 11 +-
.../search/TestScoreCachingWrappingScorer.java | 2 +-
.../apache/lucene/search/TestScorerPerf.java | 5 +-
.../apache/lucene/search/TestSimilarity.java | 4 -
.../lucene/search/TestSimilarityProvider.java | 20 -
.../lucene/search/TestSimpleExplanations.java | 43 +-
.../apache/lucene/search/TestSortRandom.java | 4 +-
.../org/apache/lucene/search/TestTermQuery.java | 154 +
.../org/apache/lucene/search/TestWildcard.java | 3 +-
.../search/similarities/TestSimilarity2.java | 5 -
.../search/similarities/TestSimilarityBase.java | 8 +-
.../search/spans/JustCompileSearchSpans.java | 2 +-
.../search/spans/TestFieldMaskingSpanQuery.java | 14 +-
.../search/spans/TestNearSpansOrdered.java | 26 +-
.../lucene/search/spans/TestSpanCollection.java | 6 +-
.../search/spans/TestSpanContainQuery.java | 2 +-
.../apache/lucene/search/spans/TestSpans.java | 10 +-
.../store/TestTrackingDirectoryWrapper.java | 2 +-
.../apache/lucene/util/TestByteBlockPool.java | 8 +-
.../apache/lucene/util/TestIntroSelector.java | 86 +
.../apache/lucene/util/TestOfflineSorter.java | 13 -
.../apache/lucene/util/TestQueryBuilder.java | 43 +-
.../apache/lucene/util/TestRadixSelector.java | 77 +
.../org/apache/lucene/util/bkd/TestBKD.java | 35 +-
.../lucene/util/bkd/TestDocIdsWriter.java | 101 +
.../util/bkd/TestMutablePointsReaderUtils.java | 251 +
.../org/apache/lucene/util/fst/TestFSTs.java | 1 -
.../demo/facet/DistanceFacetsExample.java | 27 +-
.../org/apache/lucene/facet/DrillDownQuery.java | 1 -
.../apache/lucene/facet/DrillSidewaysQuery.java | 14 +-
.../apache/lucene/facet/range/DoubleRange.java | 6 +-
.../apache/lucene/facet/range/LongRange.java | 6 +-
.../lucene/facet/taxonomy/TaxonomyReader.java | 2 +-
.../lucene/facet/taxonomy/TaxonomyWriter.java | 16 +-
.../directory/DirectoryTaxonomyWriter.java | 40 +-
.../apache/lucene/facet/TestDrillSideways.java | 5 +-
.../facet/range/TestRangeFacetCounts.java | 14 +-
.../taxonomy/directory/TestAddTaxonomy.java | 4 +-
.../directory/TestDirectoryTaxonomyWriter.java | 20 +-
.../lucene/search/grouping/SearchGroup.java | 8 +-
.../highlight/WeightedSpanTermExtractor.java | 4 +-
.../search/vectorhighlight/FieldQuery.java | 6 +
.../search/vectorhighlight/FieldQueryTest.java | 14 +
lucene/ivy-versions.properties | 38 +-
.../lucene/search/join/GlobalOrdinalsQuery.java | 8 +-
.../join/GlobalOrdinalsWithScoreQuery.java | 25 +-
.../org/apache/lucene/search/join/JoinUtil.java | 4 +-
.../join/PointInSetIncludingScoreQuery.java | 47 +-
.../search/join/TermsIncludingScoreQuery.java | 13 +-
.../search/join/ToChildBlockJoinQuery.java | 33 +-
.../search/join/ToParentBlockJoinQuery.java | 33 +-
.../lucene/search/join/TestBlockJoin.java | 4 +-
.../apache/lucene/search/join/TestJoinUtil.java | 13 +-
lucene/licenses/commons-compress-1.11.jar.sha1 | 1 +
lucene/licenses/commons-compress-1.8.1.jar.sha1 | 1 -
.../apache/lucene/index/memory/MemoryIndex.java | 51 +-
.../lucene/index/memory/TestMemoryIndex.java | 36 +
.../store/HardlinkCopyDirectoryWrapper.java | 4 +-
.../search/TestDiversifiedTopDocsCollector.java | 4 +-
.../store/TestHardLinkCopyDirectoryWrapper.java | 4 +-
.../apache/lucene/util/fst/TestFSTsMisc.java | 1 -
.../apache/lucene/queries/BoostingQuery.java | 18 +-
.../apache/lucene/queries/CommonTermsQuery.java | 49 +-
.../apache/lucene/queries/CustomScoreQuery.java | 82 +-
.../org/apache/lucene/queries/TermsQuery.java | 7 +-
.../lucene/queries/function/BoostedQuery.java | 18 +-
.../lucene/queries/function/FunctionQuery.java | 37 +-
.../queries/function/FunctionRangeQuery.java | 13 +-
.../valuesource/ComparisonBoolFunction.java | 105 +
.../lucene/queries/mlt/MoreLikeThisQuery.java | 1 -
.../queries/payloads/PayloadScoreQuery.java | 20 +-
.../queries/payloads/SpanPayloadCheckQuery.java | 10 +-
.../lucene/queries/BoostingQueryTest.java | 4 +-
.../lucene/queries/CommonTermsQueryTest.java | 10 +-
.../queries/TestCustomScoreExplanations.java | 12 +-
.../lucene/queries/TestCustomScoreQuery.java | 4 -
.../function/TestLongNormValueSource.java | 12 -
.../queries/payloads/TestPayloadScoreQuery.java | 10 -
.../queries/payloads/TestPayloadSpans.java | 30 +-
.../queries/payloads/TestPayloadTermQuery.java | 14 +-
.../analyzing/AnalyzingQueryParser.java | 202 -
.../queryparser/analyzing/package-info.java | 22 -
.../lucene/queryparser/classic/CharStream.java | 2 +-
.../classic/MultiFieldQueryParser.java | 52 +-
.../queryparser/classic/ParseException.java | 2 +-
.../lucene/queryparser/classic/QueryParser.java | 399 +-
.../lucene/queryparser/classic/QueryParser.jj | 265 +-
.../queryparser/classic/QueryParserBase.java | 179 +-
.../classic/QueryParserTokenManager.java | 27 +-
.../lucene/queryparser/classic/Token.java | 2 +-
.../queryparser/classic/TokenMgrError.java | 2 +-
.../complexPhrase/ComplexPhraseQueryParser.java | 24 +-
.../CommonQueryParserConfiguration.java | 12 -
.../flexible/standard/StandardQueryParser.java | 30 -
.../StandardBooleanQueryNodeBuilder.java | 109 -
.../builders/StandardQueryTreeBuilder.java | 6 +-
.../builders/SynonymQueryNodeBuilder.java | 48 +
.../config/StandardQueryConfigHandler.java | 9 -
.../nodes/StandardBooleanQueryNode.java | 49 -
.../standard/nodes/SynonymQueryNode.java | 30 +
.../processors/AnalyzerQueryNodeProcessor.java | 8 +-
.../processors/FuzzyQueryNodeProcessor.java | 11 +-
...owercaseExpandedTermsQueryNodeProcessor.java | 100 -
.../processors/RegexpQueryNodeProcessor.java | 56 +
.../StandardQueryNodeProcessorPipeline.java | 4 +-
.../processors/TermRangeQueryNodeProcessor.java | 11 +-
.../processors/WildcardQueryNodeProcessor.java | 58 +-
.../queryparser/simple/SimpleQueryParser.java | 16 +-
.../lucene/queryparser/xml/CoreParser.java | 2 +
.../xml/builders/BooleanQueryBuilder.java | 1 -
.../xml/builders/TermsQueryBuilder.java | 1 -
.../analyzing/TestAnalyzingQueryParser.java | 268 -
.../classic/TestMultiFieldQueryParser.java | 1 -
.../queryparser/classic/TestQueryParser.java | 485 +-
.../ext/TestExtendableQueryParser.java | 1 +
.../precedence/TestPrecedenceQueryParser.java | 61 +-
.../standard/TestMultiFieldQPHelper.java | 24 +-
.../flexible/standard/TestQPHelper.java | 93 +-
.../flexible/standard/TestStandardQP.java | 27 +-
.../simple/TestSimpleQueryParser.java | 3 -
.../queryparser/util/QueryParserTestBase.java | 149 +-
.../IndexAndTaxonomyReplicationHandler.java | 6 +-
.../replicator/IndexReplicationHandler.java | 3 +-
.../apache/lucene/replicator/nrt/CopyJob.java | 4 +-
.../lucene/replicator/nrt/CopyOneFile.java | 4 +-
.../apache/lucene/replicator/nrt/CopyState.java | 4 +-
.../lucene/replicator/nrt/FileMetaData.java | 4 +-
.../org/apache/lucene/replicator/nrt/Node.java | 23 +-
.../nrt/NodeCommunicationException.java | 4 +-
.../nrt/PreCopyMergedSegmentWarmer.java | 4 +-
.../lucene/replicator/nrt/PrimaryNode.java | 35 +-
.../replicator/nrt/ReplicaFileDeleter.java | 4 +-
.../lucene/replicator/nrt/ReplicaNode.java | 8 +-
.../nrt/SegmentInfosSearcherManager.java | 4 +-
.../IndexAndTaxonomyReplicationClientTest.java | 16 +-
.../replicator/IndexReplicationClientTest.java | 15 +-
.../lucene/replicator/LocalReplicatorTest.java | 4 +-
.../replicator/http/HttpReplicatorTest.java | 2 +-
.../lucene/replicator/nrt/Connection.java | 4 +-
.../org/apache/lucene/replicator/nrt/Jobs.java | 4 +-
.../lucene/replicator/nrt/NodeProcess.java | 4 +-
.../lucene/replicator/nrt/SimpleCopyJob.java | 6 +-
.../replicator/nrt/SimplePrimaryNode.java | 4 +-
.../replicator/nrt/SimpleReplicaNode.java | 4 +-
.../lucene/replicator/nrt/SimpleServer.java | 4 +-
.../lucene/replicator/nrt/SimpleTransLog.java | 4 +-
.../replicator/nrt/TestNRTReplication.java | 15 +-
.../nrt/TestStressNRTReplication.java | 4 +-
.../lucene/replicator/nrt/ThreadPumper.java | 4 +-
.../lucene/document/DoubleRangeField.java | 262 +
.../org/apache/lucene/document/LatLonPoint.java | 5 +-
.../document/LatLonPointDistanceQuery.java | 39 +-
.../document/LatLonPointInPolygonQuery.java | 4 +-
.../apache/lucene/document/RangeFieldQuery.java | 315 +
.../sandbox/queries/FuzzyLikeThisQuery.java | 1 -
.../lucene/search/DocValuesNumbersQuery.java | 4 +-
.../lucene/search/DocValuesRangeQuery.java | 4 +-
.../lucene/search/DocValuesTermsQuery.java | 4 +-
.../lucene/search/TermAutomatonQuery.java | 18 +-
.../lucene/document/TestDoubleRangeField.java | 67 +
.../sandbox/queries/FuzzyLikeThisQueryTest.java | 8 +-
.../sandbox/queries/TestSlowFuzzyQuery2.java | 184 -
.../lucene/sandbox/queries/fuzzyTestData.txt | 3721 ------------
.../search/BaseRangeFieldQueryTestCase.java | 427 ++
.../search/TestDoubleRangeFieldQueries.java | 106 +
.../lucene/search/TestTermAutomatonQuery.java | 4 +-
.../spatial/composite/CompositeVerifyQuery.java | 6 +-
.../composite/IntersectsRPTVerifyQuery.java | 4 +-
.../spatial/prefix/AbstractPrefixTreeQuery.java | 4 +-
.../serialized/SerializedDVStrategy.java | 4 +-
.../geopoint/document/GeoPointTokenStream.java | 14 +-
.../geopoint/search/GeoPointDistanceQuery.java | 15 +-
.../search/GeoPointDistanceQueryImpl.java | 63 +-
.../search/GeoPointInBBoxQueryImpl.java | 32 +-
.../search/GeoPointInPolygonQueryImpl.java | 14 +-
.../geopoint/search/GeoPointMultiTermQuery.java | 49 +-
.../GeoPointTermQueryConstantScoreWrapper.java | 4 +-
.../geopoint/search/GeoPointTermsEnum.java | 212 +-
.../lucene/spatial/util/TestGeoPointField.java | 4 +-
.../spatial3d/PointInGeo3DShapeQuery.java | 4 +-
.../lucene/spatial3d/geom/GeoStandardPath.java | 35 +-
.../apache/lucene/spatial3d/geom/XYZBounds.java | 2 +-
.../lucene/spatial3d/geom/GeoPathTest.java | 37 +-
.../suggest/analyzing/SuggestStopFilter.java | 4 +-
.../analyzing/SuggestStopFilterFactory.java | 10 +-
.../suggest/document/CompletionWeight.java | 8 -
.../search/suggest/document/ContextQuery.java | 4 +-
.../suggest/document/FuzzyCompletionQuery.java | 2 +-
.../suggest/document/PrefixCompletionQuery.java | 2 +-
.../suggest/document/RegexCompletionQuery.java | 2 +-
.../suggest/document/SuggestIndexSearcher.java | 2 +-
.../analyzing/AnalyzingInfixSuggesterTest.java | 4 +-
.../analyzing/BlendedInfixSuggesterTest.java | 2 +-
.../analyzing/TestFreeTextSuggester.java | 6 +-
.../analyzing/TestSuggestStopFilter.java | 4 +-
.../analyzing/TestSuggestStopFilterFactory.java | 2 +-
.../analysis/BaseTokenStreamTestCase.java | 5 +-
.../apache/lucene/analysis/MockAnalyzer.java | 11 +-
.../lucene/analysis/MockBytesAnalyzer.java | 7 +
.../lucene/analysis/MockLowerCaseFilter.java | 40 +
.../lucene/analysis/MockSynonymAnalyzer.java | 28 +
.../lucene/analysis/MockSynonymFilter.java | 97 +
.../standard/WordBreakTestUnicode_6_3_0.java | 5537 ++++++++++++++++++
.../generateJavaUnicodeWordBreakTest.pl | 232 +
.../lucene/analysis/standard/package.html | 26 +
.../codecs/asserting/AssertingPointsFormat.java | 1 +
.../org/apache/lucene/geo/EarthDebugger.java | 8 +-
.../java/org/apache/lucene/geo/GeoTestUtil.java | 8 +-
.../index/BaseCompoundFormatTestCase.java | 2 +-
.../index/BaseIndexFileFormatTestCase.java | 1 -
.../lucene/index/BaseNormsFormatTestCase.java | 2 +-
.../lucene/index/BasePointsFormatTestCase.java | 29 +
.../apache/lucene/mockfile/VirusCheckingFS.java | 4 +-
.../lucene/search/AssertingIndexSearcher.java | 23 +-
.../apache/lucene/search/AssertingQuery.java | 4 +-
.../apache/lucene/search/AssertingWeight.java | 29 +-
.../lucene/search/BaseExplanationTestCase.java | 6 +-
.../org/apache/lucene/search/CheckHits.java | 6 +-
.../lucene/search/RandomApproximationQuery.java | 35 +-
.../search/similarities/RandomSimilarity.java | 32 +-
.../lucene/search/spans/AssertingSpanQuery.java | 4 +-
.../search/spans/AssertingSpanWeight.java | 12 +-
.../lucene/store/BaseDirectoryTestCase.java | 56 +-
.../lucene/store/MockDirectoryWrapper.java | 136 +-
.../lucene/analysis/TestMockSynonymFilter.java | 151 +
.../lucene/mockfile/TestVirusCheckingFS.java | 4 +-
.../search/TestBaseExplanationTestCase.java | 24 +-
.../lucene/store/TestMockDirectoryWrapper.java | 82 +-
lucene/tools/forbiddenApis/lucene.txt | 3 +
.../dependencies/GetMavenDependenciesTask.java | 2 +-
solr/CHANGES.txt | 376 +-
solr/NOTICE.txt | 3 +
solr/bin/solr | 254 +-
solr/bin/solr.cmd | 280 +-
solr/build.xml | 8 +-
solr/common-build.xml | 9 +-
solr/contrib/analysis-extras/build.xml | 10 +
.../apache/solr/schema/ICUCollationField.java | 2 +-
.../solr/schema/TestICUCollationField.java | 15 +-
.../SolrStopwordsCarrot2LexicalDataFactory.java | 4 +-
.../dataimport/TestTikaEntityProcessor.java | 2 -
.../solr/handler/dataimport/DataImporter.java | 7 +-
solr/contrib/extraction/ivy.xml | 3 +
.../extraction/ExtractingDocumentLoader.java | 4 +-
.../ExtractingRequestHandlerTest.java | 2 -
solr/contrib/map-reduce/ivy.xml | 4 +-
.../apache/solr/hadoop/SolrRecordWriter.java | 7 +-
.../solr/hadoop/TreeMergeOutputFormat.java | 5 +-
.../apache/solr/hadoop/ZooKeeperInspector.java | 21 +-
.../solr/hadoop/MorphlineBasicMiniMRTest.java | 2 +
.../solr/hadoop/MorphlineGoLiveMiniMRTest.java | 2 +
.../apache/solr/hadoop/MorphlineMapperTest.java | 1 +
.../morphlines/cell/SolrCellMorphlineTest.java | 3 +-
solr/contrib/morphlines-core/ivy.xml | 5 +-
.../solr/collection1/conf/elevate.xml | 24 +-
.../src/test-files/solr/minimr/conf/elevate.xml | 24 +-
.../src/test-files/solr/mrunit/conf/elevate.xml | 24 +-
.../solrcelltest/collection1/conf/elevate.xml | 24 +-
solr/core/ivy.xml | 12 +-
.../apache/solr/analysis/TokenizerChain.java | 28 +-
solr/core/src/java/org/apache/solr/api/Api.java | 3 +-
.../src/java/org/apache/solr/api/ApiBag.java | 4 +-
.../java/org/apache/solr/api/ApiSupport.java | 4 +-
.../java/org/apache/solr/api/V2HttpCall.java | 4 +-
.../org/apache/solr/cloud/ElectionContext.java | 51 +-
.../java/org/apache/solr/cloud/LockTree.java | 30 +-
.../java/org/apache/solr/cloud/Overseer.java | 9 +-
.../OverseerAutoReplicaFailoverThread.java | 2 +-
.../cloud/OverseerCollectionMessageHandler.java | 168 +-
.../org/apache/solr/cloud/ZkController.java | 170 +-
.../apache/solr/cloud/ZkSolrResourceLoader.java | 16 +-
.../solr/cloud/overseer/CollectionMutator.java | 11 +-
.../apache/solr/cloud/rule/ImplicitSnitch.java | 25 +-
.../apache/solr/cloud/rule/ReplicaAssigner.java | 10 +-
.../java/org/apache/solr/cloud/rule/Rule.java | 10 +-
.../apache/solr/cloud/rule/SnitchContext.java | 33 +-
.../org/apache/solr/core/CoreContainer.java | 100 +-
.../java/org/apache/solr/core/CoreSorter.java | 185 +
.../apache/solr/core/HdfsDirectoryFactory.java | 13 +-
.../solr/core/IndexDeletionPolicyWrapper.java | 27 +-
.../java/org/apache/solr/core/NodeConfig.java | 38 +-
.../apache/solr/core/QuerySenderListener.java | 10 +-
.../java/org/apache/solr/core/SolrConfig.java | 10 +-
.../src/java/org/apache/solr/core/SolrCore.java | 111 +-
.../apache/solr/core/SolrResourceLoader.java | 10 +-
.../org/apache/solr/core/SolrXmlConfig.java | 12 +
.../java/org/apache/solr/core/ZkContainer.java | 44 +-
.../apache/solr/core/backup/BackupManager.java | 249 +
.../apache/solr/core/backup/package-info.java | 22 +
.../backup/repository/BackupRepository.java | 174 +
.../repository/BackupRepositoryFactory.java | 89 +
.../backup/repository/HdfsBackupRepository.java | 159 +
.../repository/LocalFileSystemRepository.java | 136 +
.../core/backup/repository/package-info.java | 23 +
.../core/snapshots/SolrSnapshotManager.java | 134 +
.../snapshots/SolrSnapshotMetaDataManager.java | 416 ++
.../solr/core/snapshots/package-info.java | 22 +
.../org/apache/solr/handler/GraphHandler.java | 8 +-
.../org/apache/solr/handler/IndexFetcher.java | 35 +-
.../solr/handler/MoreLikeThisHandler.java | 1 -
.../apache/solr/handler/OldBackupDirectory.java | 55 +-
.../apache/solr/handler/PingRequestHandler.java | 1 -
.../apache/solr/handler/ReplicationHandler.java | 88 +-
.../apache/solr/handler/RequestHandlerBase.java | 24 +-
.../org/apache/solr/handler/RestoreCore.java | 40 +-
.../org/apache/solr/handler/SQLHandler.java | 5 +-
.../org/apache/solr/handler/SnapShooter.java | 215 +-
.../apache/solr/handler/SolrConfigHandler.java | 29 +-
.../org/apache/solr/handler/StreamHandler.java | 1 +
.../solr/handler/UpdateRequestHandlerApi.java | 3 +-
.../apache/solr/handler/admin/ApiCommand.java | 5 +-
.../handler/admin/BaseHandlerApiSupport.java | 3 +-
.../handler/admin/CollectionHandlerApi.java | 4 +-
.../solr/handler/admin/CollectionsHandler.java | 849 ++-
.../handler/admin/ConfigSetsHandlerApi.java | 5 +-
.../solr/handler/admin/CoreAdminHandler.java | 10 +-
.../solr/handler/admin/CoreAdminHandlerApi.java | 7 +-
.../solr/handler/admin/CoreAdminOperation.java | 1463 ++---
.../apache/solr/handler/admin/InfoHandler.java | 3 -
.../apache/solr/handler/admin/V2EndPoint.java | 3 +-
.../component/QueryElevationComponent.java | 1 -
.../handler/component/RealTimeGetComponent.java | 286 +-
.../solr/handler/component/SearchComponent.java | 2 +
.../solr/handler/component/SearchHandler.java | 2 +
.../solr/handler/component/TermsComponent.java | 122 +-
.../solr/highlight/DefaultSolrHighlighter.java | 17 +-
.../java/org/apache/solr/query/FilterQuery.java | 6 +-
.../org/apache/solr/query/SolrRangeQuery.java | 20 +-
.../apache/solr/request/SolrRequestInfo.java | 6 +-
.../solr/response/GraphMLResponseWriter.java | 6 +-
.../org/apache/solr/response/ResultContext.java | 2 +-
.../transform/DocIdAugmenterFactory.java | 10 +-
.../solr/response/transform/DocTransformer.java | 26 +-
.../response/transform/DocTransformers.java | 12 +
.../transform/ExplainAugmenterFactory.java | 22 +-
.../transform/ValueSourceAugmenter.java | 13 +-
.../analysis/ManagedStopFilterFactory.java | 4 +-
.../solr/schema/AbstractSpatialFieldType.java | 18 +-
.../java/org/apache/solr/schema/LatLonType.java | 12 +-
.../java/org/apache/solr/schema/PointType.java | 2 -
.../org/apache/solr/schema/SchemaManager.java | 56 +-
.../org/apache/solr/search/DisMaxQParser.java | 1 -
.../apache/solr/search/ExportQParserPlugin.java | 4 +-
.../solr/search/ExtendedDismaxQParser.java | 16 +-
.../src/java/org/apache/solr/search/Filter.java | 10 +-
.../solr/search/GraphTermsQParserPlugin.java | 9 +-
.../apache/solr/search/HashQParserPlugin.java | 4 +-
.../apache/solr/search/JoinQParserPlugin.java | 8 +-
.../java/org/apache/solr/search/LRUCache.java | 34 +-
.../org/apache/solr/search/QueryParsing.java | 5 +-
.../java/org/apache/solr/search/QueryUtils.java | 2 -
.../apache/solr/search/ReRankQParserPlugin.java | 37 +-
.../apache/solr/search/SimpleQParserPlugin.java | 2 -
.../solr/search/SolrConstantScoreQuery.java | 8 +-
.../org/apache/solr/search/SolrCoreParser.java | 40 +-
.../apache/solr/search/SolrIndexSearcher.java | 20 +-
.../apache/solr/search/SolrQueryBuilder.java | 34 +
.../apache/solr/search/TermsQParserPlugin.java | 1 -
.../apache/solr/search/ValueSourceParser.java | 52 +
.../org/apache/solr/search/WrappedQuery.java | 4 +-
.../apache/solr/search/XmlQParserPlugin.java | 11 +
.../function/SolrComparisonBoolFunction.java | 58 +
.../org/apache/solr/search/join/GraphQuery.java | 22 +-
.../apache/solr/search/mlt/CloudMLTQParser.java | 2 -
.../solr/search/mlt/SimpleMLTQParser.java | 2 -
.../similarities/SchemaSimilarityFactory.java | 4 +-
.../solr/security/AuthenticationPlugin.java | 29 +-
.../security/AutorizationEditOperation.java | 29 +-
.../apache/solr/security/BasicAuthPlugin.java | 5 +-
.../security/DelegationTokenKerberosFilter.java | 171 +
.../apache/solr/security/KerberosFilter.java | 14 +
.../apache/solr/security/KerberosPlugin.java | 195 +-
.../solr/security/PKIAuthenticationPlugin.java | 13 +-
.../org/apache/solr/security/Permission.java | 35 +-
.../solr/security/PermissionNameProvider.java | 4 +-
.../solr/security/PrintWriterWrapper.java | 215 +
.../security/RuleBasedAuthorizationPlugin.java | 5 +
.../security/Sha256AuthenticationProvider.java | 2 +
.../apache/solr/servlet/SolrDispatchFilter.java | 12 +-
.../apache/solr/servlet/SolrRequestParsers.java | 2 -
.../solr/store/blockcache/BlockDirectory.java | 5 +-
.../store/blockcache/BlockDirectoryCache.java | 5 +-
.../solr/store/blockcache/BufferStore.java | 2 +-
.../blockcache/CustomBufferedIndexInput.java | 2 +-
.../apache/solr/store/hdfs/HdfsDirectory.java | 33 +-
.../apache/solr/store/hdfs/HdfsFileReader.java | 105 -
.../solr/update/DeleteByQueryWrapper.java | 10 +-
.../solr/update/DirectUpdateHandler2.java | 117 +-
.../org/apache/solr/update/HdfsUpdateLog.java | 6 -
.../apache/solr/update/IndexFingerprint.java | 6 +-
.../java/org/apache/solr/update/PeerSync.java | 124 +-
.../apache/solr/update/UpdateShardHandler.java | 13 +-
.../ClassificationUpdateProcessor.java | 38 +-
.../ClassificationUpdateProcessorFactory.java | 24 +-
.../processor/UpdateRequestProcessorChain.java | 19 +-
.../apache/solr/util/ConcurrentLFUCache.java | 15 +-
.../apache/solr/util/ConcurrentLRUCache.java | 40 +-
.../apache/solr/util/JsonSchemaValidator.java | 129 +-
.../src/java/org/apache/solr/util/PathTrie.java | 3 +-
.../apache/solr/util/RecordingJSONParser.java | 80 +-
.../src/java/org/apache/solr/util/SolrCLI.java | 414 +-
.../org/apache/solr/util/SolrPluginUtils.java | 1 -
.../resources/EditableSolrConfigAttributes.json | 5 +-
solr/core/src/resources/ImplicitPlugins.json | 6 +
.../apispec/cluster.config.Commands.json | 30 +
.../apispec/cluster.config.commands.json | 33 -
.../cluster.security.BasicAuth.Commands.json | 1 -
...cluster.security.RuleBasedAuthorization.json | 12 +-
.../resources/apispec/collections.Commands.json | 4 +-
.../apispec/core.SchemaEdit.addCopyField.json | 2 +-
.../core/src/resources/apispec/core.Update.json | 1 -
.../core.config.Commands.addRuntimeLib.json | 2 +-
.../core.config.Commands.updateRuntimeLib.json | 2 +-
.../src/resources/apispec/cores.Commands.json | 1 -
.../src/resources/apispec/cores.Status.json | 1 -
.../resources/apispec/cores.core.Commands.json | 1 -
.../cores.core.Commands.requestRecovery.json | 4 -
solr/core/src/resources/apispec/cores.json | 19 -
.../collection1/conf/schema-psuedo-fields.xml | 71 +
.../conf/solrconfig-testxmlparser.xml | 33 +
.../solr/collection1/conf/solrconfig-tlog.xml | 8 +-
.../solr/collection1/conf/solrconfig.xml | 5 +-
.../configsets/cloud-subdirs/conf/schema.xml | 28 +
.../cloud-subdirs/conf/solrconfig.xml | 48 +
.../conf/stopwords/stopwords-en.txt | 62 +
solr/core/src/test-files/solr/solr-50-all.xml | 4 +
solr/core/src/test-files/solr/solr-no-core.xml | 45 -
solr/core/src/test-files/solr/solr.xml | 3 +
.../apache/solr/DisMaxRequestHandlerTest.java | 4 +-
.../test/org/apache/solr/MinimalSchemaTest.java | 4 +-
.../test/org/apache/solr/api/TestPathTrie.java | 3 +-
.../AbstractCloudBackupRestoreTestCase.java | 272 +
.../solr/cloud/BasicDistributedZk2Test.java | 27 +-
.../solr/cloud/ChaosMonkeyShardSplitTest.java | 13 +-
.../solr/cloud/CollectionStateFormat2Test.java | 2 +-
.../cloud/CollectionsAPIDistributedZkTest.java | 2 +-
.../solr/cloud/CreateCollectionCleanupTest.java | 4 +-
.../apache/solr/cloud/CustomCollectionTest.java | 2 +-
.../DeleteLastCustomShardedReplicaTest.java | 2 +-
.../apache/solr/cloud/DeleteReplicaTest.java | 2 +-
.../cloud/DistribJoinFromCollectionTest.java | 2 +-
.../apache/solr/cloud/KerberosTestServices.java | 228 +
.../org/apache/solr/cloud/KerberosTestUtil.java | 147 -
.../apache/solr/cloud/LeaderElectionTest.java | 1 +
...utOfBoxZkACLAndCredentialsProvidersTest.java | 7 +-
...rriddenZkACLAndCredentialsProvidersTest.java | 71 +-
.../cloud/OverseerModifyCollectionTest.java | 96 +
.../apache/solr/cloud/OverseerRolesTest.java | 2 +-
.../org/apache/solr/cloud/OverseerTest.java | 1 +
.../solr/cloud/SaslZkACLProviderTest.java | 39 +-
.../cloud/SharedFSAutoReplicaFailoverTest.java | 150 +-
.../apache/solr/cloud/SolrCLIZkUtilsTest.java | 632 ++
.../solr/cloud/TestAuthenticationFramework.java | 169 +-
.../solr/cloud/TestCloudBackupRestore.java | 219 -
.../solr/cloud/TestCloudPseudoReturnFields.java | 839 +++
.../apache/solr/cloud/TestConfigSetsAPI.java | 4 +-
.../solr/cloud/TestConfigSetsAPIZkFailure.java | 2 +-
.../solr/cloud/TestHdfsCloudBackupRestore.java | 147 +
.../cloud/TestLocalFSCloudBackupRestore.java | 51 +
.../org/apache/solr/cloud/TestLockTree.java | 34 +-
.../solr/cloud/TestMiniSolrCloudCluster.java | 2 +-
.../cloud/TestMiniSolrCloudClusterKerberos.java | 32 +-
.../cloud/TestOnReconnectListenerSupport.java | 4 +-
.../apache/solr/cloud/TestRandomFlRTGCloud.java | 675 +++
.../cloud/TestSizeLimitedDistributedMap.java | 4 +-
.../TestSolrCloudWithDelegationTokens.java | 405 ++
.../cloud/TestSolrCloudWithKerberosAlt.java | 40 +-
.../solr/cloud/UnloadDistributedZkTest.java | 2 +-
...MParamsZkACLAndCredentialsProvidersTest.java | 25 +-
.../org/apache/solr/cloud/ZkControllerTest.java | 1 +
.../solr/cloud/hdfs/HdfsNNFailoverTest.java | 2 +-
.../HdfsWriteToMultipleCollectionsTest.java | 2 +-
.../apache/solr/cloud/hdfs/StressHdfsTest.java | 2 +-
.../solr/cloud/overseer/ZkStateReaderTest.java | 36 +-
.../solr/cloud/overseer/ZkStateWriterTest.java | 403 +-
.../solr/cloud/rule/ImplicitSnitchTest.java | 49 +-
.../apache/solr/cloud/rule/RuleEngineTest.java | 51 +-
.../org/apache/solr/cloud/rule/RulesTest.java | 2 -
.../solr/core/BlobRepositoryCloudTest.java | 35 +-
.../solr/core/BlobRepositoryMockingTest.java | 35 +-
.../org/apache/solr/core/CoreSorterTest.java | 240 +
.../solr/core/OpenCloseCoreStressTest.java | 16 +-
.../test/org/apache/solr/core/SolrCoreTest.java | 1 +
.../solr/core/TestBackupRepositoryFactory.java | 149 +
.../solr/core/TestConfigSetImmutable.java | 3 +-
.../org/apache/solr/core/TestLazyCores.java | 4 +-
.../solr/core/TestQuerySenderListener.java | 18 +-
.../apache/solr/core/TestSolrConfigHandler.java | 2 +-
.../test/org/apache/solr/core/TestSolrXml.java | 15 +-
.../core/snapshots/TestSolrCoreSnapshots.java | 419 ++
.../apache/solr/handler/BackupRestoreUtils.java | 104 +
.../apache/solr/handler/CheckBackupStatus.java | 10 +-
.../DocumentAnalysisRequestHandlerTest.java | 8 +-
.../FieldAnalysisRequestHandlerTest.java | 10 +-
.../solr/handler/TestHdfsBackupRestoreCore.java | 239 +
.../solr/handler/TestReplicationHandler.java | 20 +-
.../handler/TestReplicationHandlerBackup.java | 39 +-
.../apache/solr/handler/TestRestoreCore.java | 52 +-
.../handler/TestSolrConfigHandlerCloud.java | 2 +-
.../handler/admin/CoreAdminHandlerTest.java | 2 +-
.../solr/handler/admin/TestApiFramework.java | 4 +-
.../solr/handler/admin/TestCollectionAPIs.java | 6 +-
.../solr/handler/admin/TestCoreAdminApis.java | 7 +-
.../DistributedTermsComponentTest.java | 13 +-
.../component/ResourceSharingTestComponent.java | 34 +-
.../handler/component/TermsComponentTest.java | 58 +-
.../solr/index/hdfs/CheckHdfsIndexTest.java | 3 +-
.../apache/solr/request/TestFacetMethods.java | 4 +-
.../response/TestGraphMLResponseWriter.java | 4 +-
.../transform/TestSubQueryTransformer.java | 17 +-
.../apache/solr/schema/BooleanFieldTest.java | 4 +-
.../solr/schema/TestManagedSchemaAPI.java | 34 +-
.../apache/solr/search/GoodbyeQueryBuilder.java | 39 +
.../apache/solr/search/HandyQueryBuilder.java | 53 +
.../apache/solr/search/HelloQueryBuilder.java | 39 +
.../apache/solr/search/QueryEqualityTest.java | 27 +-
.../search/TestGraphTermsQParserPlugin.java | 4 +-
.../solr/search/TestPseudoReturnFields.java | 615 +-
.../org/apache/solr/search/TestRangeQuery.java | 146 +-
.../apache/solr/search/TestRankQueryPlugin.java | 4 +-
.../solr/search/TestXmlQParserPlugin.java | 78 +
.../solr/search/function/TestFunctionQuery.java | 69 +-
.../solr/search/mlt/CloudMLTQParserTest.java | 10 +-
.../solr/security/BasicAuthIntegrationTest.java | 227 +-
...ramDelegationTokenAuthenticationHandler.java | 109 +
.../solr/security/MockAuthenticationPlugin.java | 32 +-
.../spelling/TestSuggestSpellingConverter.java | 2 +-
.../solr/store/hdfs/HdfsDirectoryTest.java | 5 +-
.../uninverting/TestFieldCacheSortRandom.java | 4 +-
.../solr/update/DirectUpdateHandlerTest.java | 48 +-
...lassificationUpdateProcessorFactoryTest.java | 4 +-
.../org/apache/solr/util/JsonValidatorTest.java | 45 +-
.../example-DIH/solr/db/conf/elevate.xml | 24 +-
.../example-DIH/solr/mail/conf/elevate.xml | 24 +-
.../example-DIH/solr/rss/conf/elevate.xml | 24 +-
.../example-DIH/solr/solr/conf/elevate.xml | 24 +-
solr/example/files/conf/elevate.xml | 24 +-
solr/licenses/bcpkix-jdk15on-1.47.jar.sha1 | 1 +
.../bcpkix-jdk15on-LICENSE-BSD_LIKE.txt | 15 +
solr/licenses/bcpkix-jdk15on-NOTICE.txt | 2 +
solr/licenses/commons-compress-1.11.jar.sha1 | 1 +
solr/licenses/commons-compress-1.8.1.jar.sha1 | 1 -
solr/licenses/curator-recipes-2.8.0.jar.sha1 | 1 +
solr/licenses/curator-recipes-LICENSE-ASL.txt | 202 +
solr/licenses/curator-recipes-NOTICE.txt | 5 +
solr/licenses/fontbox-1.8.8.jar.sha1 | 1 -
solr/licenses/fontbox-2.0.1.jar.sha1 | 1 +
solr/licenses/hadoop-annotations-2.6.0.jar.sha1 | 1 -
solr/licenses/hadoop-annotations-2.7.2.jar.sha1 | 1 +
solr/licenses/hadoop-auth-2.6.0.jar.sha1 | 1 -
solr/licenses/hadoop-auth-2.7.2.jar.sha1 | 1 +
.../licenses/hadoop-common-2.6.0-tests.jar.sha1 | 1 -
solr/licenses/hadoop-common-2.6.0.jar.sha1 | 1 -
.../licenses/hadoop-common-2.7.2-tests.jar.sha1 | 1 +
solr/licenses/hadoop-common-2.7.2.jar.sha1 | 1 +
solr/licenses/hadoop-hdfs-2.6.0-tests.jar.sha1 | 1 -
solr/licenses/hadoop-hdfs-2.6.0.jar.sha1 | 1 -
solr/licenses/hadoop-hdfs-2.7.2-tests.jar.sha1 | 1 +
solr/licenses/hadoop-hdfs-2.7.2.jar.sha1 | 1 +
.../hadoop-mapreduce-client-app-2.6.0.jar.sha1 | 1 -
.../hadoop-mapreduce-client-app-2.7.2.jar.sha1 | 1 +
...adoop-mapreduce-client-common-2.6.0.jar.sha1 | 1 -
...adoop-mapreduce-client-common-2.7.2.jar.sha1 | 1 +
.../hadoop-mapreduce-client-core-2.6.0.jar.sha1 | 1 -
.../hadoop-mapreduce-client-core-2.7.2.jar.sha1 | 1 +
.../hadoop-mapreduce-client-hs-2.6.0.jar.sha1 | 1 -
.../hadoop-mapreduce-client-hs-2.7.2.jar.sha1 | 1 +
...reduce-client-jobclient-2.6.0-tests.jar.sha1 | 1 -
...op-mapreduce-client-jobclient-2.6.0.jar.sha1 | 1 -
...reduce-client-jobclient-2.7.2-tests.jar.sha1 | 1 +
...op-mapreduce-client-jobclient-2.7.2.jar.sha1 | 1 +
...doop-mapreduce-client-shuffle-2.6.0.jar.sha1 | 1 -
...doop-mapreduce-client-shuffle-2.7.2.jar.sha1 | 1 +
solr/licenses/hadoop-minikdc-2.6.0.jar.sha1 | 1 -
solr/licenses/hadoop-minikdc-2.7.2.jar.sha1 | 1 +
solr/licenses/hadoop-yarn-api-2.6.0.jar.sha1 | 1 -
solr/licenses/hadoop-yarn-api-2.7.2.jar.sha1 | 1 +
solr/licenses/hadoop-yarn-client-2.6.0.jar.sha1 | 1 -
solr/licenses/hadoop-yarn-client-2.7.2.jar.sha1 | 1 +
solr/licenses/hadoop-yarn-common-2.6.0.jar.sha1 | 1 -
solr/licenses/hadoop-yarn-common-2.7.2.jar.sha1 | 1 +
...ver-applicationhistoryservice-2.6.0.jar.sha1 | 1 -
...ver-applicationhistoryservice-2.7.2.jar.sha1 | 1 +
.../hadoop-yarn-server-common-2.6.0.jar.sha1 | 1 -
.../hadoop-yarn-server-common-2.7.2.jar.sha1 | 1 +
...adoop-yarn-server-nodemanager-2.6.0.jar.sha1 | 1 -
...adoop-yarn-server-nodemanager-2.7.2.jar.sha1 | 1 +
...p-yarn-server-resourcemanager-2.6.0.jar.sha1 | 1 -
...p-yarn-server-resourcemanager-2.7.2.jar.sha1 | 1 +
...adoop-yarn-server-tests-2.6.0-tests.jar.sha1 | 1 -
...adoop-yarn-server-tests-2.7.2-tests.jar.sha1 | 1 +
.../hadoop-yarn-server-web-proxy-2.6.0.jar.sha1 | 1 -
.../hadoop-yarn-server-web-proxy-2.7.2.jar.sha1 | 1 +
solr/licenses/htrace-core-3.0.4.jar.sha1 | 1 -
.../htrace-core-3.2.0-incubating.jar.sha1 | 1 +
solr/licenses/isoparser-1.0.2.jar.sha1 | 1 -
solr/licenses/isoparser-1.1.18.jar.sha1 | 1 +
solr/licenses/jackcess-2.1.3.jar.sha1 | 1 +
solr/licenses/jackcess-LICENSE-ASL.txt | 507 ++
solr/licenses/jackcess-NOTICE.txt | 2 +
solr/licenses/jempbox-1.8.12.jar.sha1 | 1 +
solr/licenses/jempbox-1.8.8.jar.sha1 | 1 -
solr/licenses/metadata-extractor-2.6.2.jar.sha1 | 1 -
solr/licenses/metadata-extractor-2.8.1.jar.sha1 | 1 +
solr/licenses/netty-3.2.4.Final.jar.sha1 | 1 +
solr/licenses/netty-3.7.0.Final.jar.sha1 | 1 -
solr/licenses/netty-NOTICE.txt | 85 +-
solr/licenses/netty-all-4.0.36.Final.jar.sha1 | 1 +
solr/licenses/netty-all-LICENSE-ASL.txt | 202 +
solr/licenses/netty-all-NOTICE.txt | 121 +
solr/licenses/pdfbox-1.8.8.jar.sha1 | 1 -
solr/licenses/pdfbox-2.0.1.jar.sha1 | 1 +
solr/licenses/pdfbox-tools-2.0.1.jar.sha1 | 1 +
solr/licenses/pdfbox-tools-LICENSE-ASL.txt | 314 +
solr/licenses/pdfbox-tools-NOTICE.txt | 14 +
solr/licenses/poi-3.11.jar.sha1 | 1 -
solr/licenses/poi-3.15-beta1.jar.sha1 | 1 +
solr/licenses/poi-ooxml-3.11.jar.sha1 | 1 -
solr/licenses/poi-ooxml-3.15-beta1.jar.sha1 | 1 +
solr/licenses/poi-ooxml-schemas-3.11.jar.sha1 | 1 -
.../poi-ooxml-schemas-3.15-beta1.jar.sha1 | 1 +
solr/licenses/poi-scratchpad-3.11.jar.sha1 | 1 -
.../licenses/poi-scratchpad-3.15-beta1.jar.sha1 | 1 +
solr/licenses/rome-1.6.1.jar.sha1 | 1 +
solr/licenses/tika-core-1.13.jar.sha1 | 1 +
solr/licenses/tika-core-1.7.jar.sha1 | 1 -
solr/licenses/tika-java7-1.13.jar.sha1 | 1 +
solr/licenses/tika-java7-1.7.jar.sha1 | 1 -
solr/licenses/tika-parsers-1.13.jar.sha1 | 1 +
solr/licenses/tika-parsers-1.7.jar.sha1 | 1 -
solr/licenses/tika-xmp-1.13.jar.sha1 | 1 +
solr/licenses/tika-xmp-1.7.jar.sha1 | 1 -
solr/licenses/vorbis-java-core-0.6.jar.sha1 | 1 -
solr/licenses/vorbis-java-core-0.8.jar.sha1 | 1 +
solr/licenses/vorbis-java-tika-0.6.jar.sha1 | 1 -
solr/licenses/vorbis-java-tika-0.8.jar.sha1 | 1 +
.../basic_configs/conf/_rest_managed.json | 1 -
.../configsets/basic_configs/conf/elevate.xml | 42 +
.../basic_configs/conf/lang/contractions_ca.txt | 8 +
.../basic_configs/conf/lang/contractions_fr.txt | 15 +
.../basic_configs/conf/lang/contractions_ga.txt | 5 +
.../basic_configs/conf/lang/contractions_it.txt | 23 +
.../basic_configs/conf/lang/hyphenations_ga.txt | 5 +
.../basic_configs/conf/lang/stemdict_nl.txt | 6 +
.../basic_configs/conf/lang/stoptags_ja.txt | 420 ++
.../basic_configs/conf/lang/stopwords_ar.txt | 125 +
.../basic_configs/conf/lang/stopwords_bg.txt | 193 +
.../basic_configs/conf/lang/stopwords_ca.txt | 220 +
.../basic_configs/conf/lang/stopwords_cz.txt | 172 +
.../basic_configs/conf/lang/stopwords_da.txt | 110 +
.../basic_configs/conf/lang/stopwords_de.txt | 294 +
.../basic_configs/conf/lang/stopwords_el.txt | 78 +
.../basic_configs/conf/lang/stopwords_es.txt | 356 ++
.../basic_configs/conf/lang/stopwords_eu.txt | 99 +
.../basic_configs/conf/lang/stopwords_fa.txt | 313 +
.../basic_configs/conf/lang/stopwords_fi.txt | 97 +
.../basic_configs/conf/lang/stopwords_fr.txt | 186 +
.../basic_configs/conf/lang/stopwords_ga.txt | 110 +
.../basic_configs/conf/lang/stopwords_gl.txt | 161 +
.../basic_configs/conf/lang/stopwords_hi.txt | 235 +
.../basic_configs/conf/lang/stopwords_hu.txt | 211 +
.../basic_configs/conf/lang/stopwords_hy.txt | 46 +
.../basic_configs/conf/lang/stopwords_id.txt | 359 ++
.../basic_configs/conf/lang/stopwords_it.txt | 303 +
.../basic_configs/conf/lang/stopwords_ja.txt | 127 +
.../basic_configs/conf/lang/stopwords_lv.txt | 172 +
.../basic_configs/conf/lang/stopwords_nl.txt | 119 +
.../basic_configs/conf/lang/stopwords_no.txt | 194 +
.../basic_configs/conf/lang/stopwords_pt.txt | 253 +
.../basic_configs/conf/lang/stopwords_ro.txt | 233 +
.../basic_configs/conf/lang/stopwords_ru.txt | 243 +
.../basic_configs/conf/lang/stopwords_sv.txt | 133 +
.../basic_configs/conf/lang/stopwords_th.txt | 119 +
.../basic_configs/conf/lang/stopwords_tr.txt | 212 +
.../basic_configs/conf/lang/userdict_ja.txt | 29 +
.../basic_configs/conf/managed-schema | 764 ++-
.../configsets/basic_configs/conf/params.json | 20 +
.../basic_configs/conf/solrconfig.xml | 1072 +++-
.../data_driven_schema_configs/conf/elevate.xml | 24 +-
.../conf/managed-schema | 4 +-
.../conf/elevate.xml | 24 +-
solr/solrj/ivy.xml | 5 +
.../apache/solr/client/solrj/SolrRequest.java | 1 -
.../solr/client/solrj/impl/CloudSolrClient.java | 158 +-
.../solr/client/solrj/impl/HttpClientUtil.java | 8 +-
.../solr/client/solrj/impl/HttpSolrClient.java | 57 +-
.../solrj/impl/Krb5HttpClientBuilder.java | 18 +-
.../solrj/io/graph/ShortestPathStream.java | 6 +-
.../client/solrj/io/stream/CloudSolrStream.java | 25 +-
.../solr/client/solrj/io/stream/JDBCStream.java | 4 +
.../client/solrj/io/stream/ParallelStream.java | 2 +-
.../solrj/io/stream/ScoreNodesStream.java | 256 +
.../client/solrj/io/stream/TopicStream.java | 61 +-
.../solrj/request/CollectionAdminRequest.java | 32 +-
.../client/solrj/request/CoreAdminRequest.java | 57 +
.../solrj/request/DelegationTokenRequest.java | 152 +
.../client/solrj/request/UpdateRequest.java | 6 +
.../solrj/response/DelegationTokenResponse.java | 108 +
.../solr/common/ToleratedUpdateError.java | 2 +-
.../solr/common/cloud/ClusterProperties.java | 4 +-
.../apache/solr/common/cloud/ClusterState.java | 13 +-
.../common/cloud/CollectionStatePredicate.java | 4 +-
.../common/cloud/CollectionStateWatcher.java | 6 +-
.../solr/common/cloud/ConnectionManager.java | 15 +-
.../common/cloud/DefaultConnectionStrategy.java | 4 +-
.../apache/solr/common/cloud/DocCollection.java | 26 +-
.../solr/common/cloud/SaslZkACLProvider.java | 21 +-
.../cloud/SecurityAwareZkACLProvider.java | 79 +
.../apache/solr/common/cloud/SolrZkClient.java | 121 +-
...ParamsAllAndReadonlyDigestZkACLProvider.java | 52 +-
.../cloud/ZkClientConnectionStrategy.java | 4 +-
.../solr/common/cloud/ZkConfigManager.java | 117 +-
.../solr/common/cloud/ZkMaintenanceUtils.java | 368 ++
.../apache/solr/common/cloud/ZkStateReader.java | 167 +-
.../solr/common/params/CollectionParams.java | 29 +-
.../solr/common/params/CoreAdminParams.java | 20 +-
.../apache/solr/common/params/SolrParams.java | 24 +-
.../apache/solr/common/params/TermsParams.java | 12 +
.../org/apache/solr/common/util/Lookup.java | 22 -
.../org/apache/solr/common/util/RetryUtil.java | 8 +-
.../solr/common/util/ValidatingJsonMap.java | 4 +-
.../solr/configsets/streaming/conf/schema.xml | 2 +-
.../solrj/impl/CloudSolrClientBuilderTest.java | 28 +-
.../client/solrj/impl/CloudSolrClientTest.java | 24 +-
.../ConcurrentUpdateSolrClientBuilderTest.java | 12 +-
.../solrj/impl/HttpSolrClientBuilderTest.java | 22 +-
.../solrj/impl/LBHttpSolrClientBuilderTest.java | 18 +-
.../solrj/io/graph/GraphExpressionTest.java | 137 +-
.../solr/client/solrj/io/graph/GraphTest.java | 4 +-
.../solr/client/solrj/io/sql/JdbcTest.java | 4 +-
.../client/solrj/io/stream/JDBCStreamTest.java | 16 +
.../solrj/io/stream/StreamExpressionTest.java | 244 +-
.../client/solrj/io/stream/StreamingTest.java | 19 +-
.../request/TestDelegationTokenRequest.java | 70 +
.../response/TestDelegationTokenResponse.java | 138 +
.../cloud/TestCollectionStateWatchers.java | 4 +-
.../solr/common/util/TestJsonRecordReader.java | 52 +
.../apache/solr/common/util/TestRetryUtil.java | 37 +-
.../java/org/apache/solr/SolrTestCaseJ4.java | 71 +-
.../apache/solr/core/MockDirectoryFactory.java | 5 -
.../solr/core/MockFSDirectoryFactory.java | 1 -
solr/webapp/web/css/angular/cloud.css | 14 +
solr/webapp/web/js/angular/app.js | 2 +-
solr/webapp/web/js/angular/controllers/cloud.js | 53 +-
solr/webapp/web/js/angular/controllers/query.js | 10 +-
solr/webapp/web/js/lib/jquery.blockUI.js | 2 +-
solr/webapp/web/partials/cloud.html | 3 +-
1211 files changed, 47788 insertions(+), 28323 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/92411981/solr/core/src/java/org/apache/solr/api/Api.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/92411981/solr/core/src/java/org/apache/solr/api/ApiBag.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/92411981/solr/core/src/java/org/apache/solr/api/V2HttpCall.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/92411981/solr/core/src/java/org/apache/solr/handler/admin/ApiCommand.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/92411981/solr/core/src/java/org/apache/solr/handler/admin/BaseHandlerApiSupport.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/92411981/solr/core/src/java/org/apache/solr/handler/admin/CollectionHandlerApi.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/92411981/solr/core/src/java/org/apache/solr/security/BasicAuthPlugin.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/92411981/solr/core/src/java/org/apache/solr/security/RuleBasedAuthorizationPlugin.java
----------------------------------------------------------------------
diff --cc solr/core/src/java/org/apache/solr/security/RuleBasedAuthorizationPlugin.java
index 3388147,c674ff3..e798670
--- a/solr/core/src/java/org/apache/solr/security/RuleBasedAuthorizationPlugin.java
+++ b/solr/core/src/java/org/apache/solr/security/RuleBasedAuthorizationPlugin.java
@@@ -27,7 -27,7 +27,12 @@@ import java.util.Map
import java.util.Set;
import java.util.function.Function;
-import org.apache.solr.common.util.Map2;
++import com.google.common.collect.ImmutableSet;
++import org.apache.solr.common.SolrException;
++import org.apache.solr.common.params.CollectionParams;
++import org.apache.solr.common.util.Utils;
+import org.apache.solr.common.util.ValidatingJsonMap;
++
import org.apache.solr.util.CommandOperation;
import org.apache.solr.api.ApiBag;
import org.apache.solr.api.SpecProvider;
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/92411981/solr/core/src/java/org/apache/solr/security/Sha256AuthenticationProvider.java
----------------------------------------------------------------------
diff --cc solr/core/src/java/org/apache/solr/security/Sha256AuthenticationProvider.java
index f270524,7410335..f18838d
--- a/solr/core/src/java/org/apache/solr/security/Sha256AuthenticationProvider.java
+++ b/solr/core/src/java/org/apache/solr/security/Sha256AuthenticationProvider.java
@@@ -30,7 -30,7 +30,9 @@@ import java.util.Set
import com.google.common.collect.ImmutableSet;
import org.apache.commons.codec.binary.Base64;
-import org.apache.solr.common.util.Map2;
++import org.apache.solr.api.SpecProvider;
+import org.apache.solr.common.util.ValidatingJsonMap;
++
import org.apache.solr.util.CommandOperation;
import org.apache.solr.api.ApiBag;
import org.slf4j.Logger;
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/92411981/solr/core/src/java/org/apache/solr/servlet/SolrRequestParsers.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/92411981/solr/core/src/java/org/apache/solr/util/PathTrie.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/92411981/solr/core/src/test/org/apache/solr/api/TestPathTrie.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/92411981/solr/core/src/test/org/apache/solr/core/TestSolrConfigHandler.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/92411981/solr/core/src/test/org/apache/solr/handler/admin/TestApiFramework.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/92411981/solr/core/src/test/org/apache/solr/handler/admin/TestCollectionAPIs.java
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/92411981/solr/core/src/test/org/apache/solr/util/JsonValidatorTest.java
----------------------------------------------------------------------
diff --cc solr/core/src/test/org/apache/solr/util/JsonValidatorTest.java
index 0bfdc12,3bae53f..1730353
--- a/solr/core/src/test/org/apache/solr/util/JsonValidatorTest.java
+++ b/solr/core/src/test/org/apache/solr/util/JsonValidatorTest.java
@@@ -31,9 -31,10 +31,9 @@@ import static org.apache.solr.common.ut
public class JsonValidatorTest extends SolrTestCaseJ4 {
-
public void testSchema() {
checkSchema("collections.Commands");
- checkSchema("collections.collection.commands");
+ checkSchema("collections.collection.Commands");
checkSchema("collections.collection.shards.Commands");
checkSchema("collections.collection.shards.shard.Commands");
checkSchema("collections.collection.shards.shard.replica.Commands");
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/92411981/solr/solrj/src/java/org/apache/solr/common/util/ValidatingJsonMap.java
----------------------------------------------------------------------
diff --cc solr/solrj/src/java/org/apache/solr/common/util/ValidatingJsonMap.java
index 553d134,0000000..d19d56a
mode 100644,000000..100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/ValidatingJsonMap.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/ValidatingJsonMap.java
@@@ -1,291 -1,0 +1,291 @@@
- package org.apache.solr.common.util;
-
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
++package org.apache.solr.common.util;
++
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.noggit.JSONParser;
+import org.noggit.ObjectBuilder;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.Collections.unmodifiableList;
+import static java.util.Collections.unmodifiableSet;
+
+public class ValidatingJsonMap implements Map<String, Object> {
+
+ public static final PredicateWithErrMsg<Object> NOT_NULL = o -> {
+ if (o == null) return " Must not be NULL";
+ return null;
+ };
+ public static final PredicateWithErrMsg<Pair> ENUM_OF = pair -> {
+ if (pair.second() instanceof Set) {
+ Set set = (Set) pair.second();
+ if (pair.first() instanceof Collection) {
+ for (Object o : (Collection) pair.first()) {
+ if (!set.contains(o)) {
+ return " Must be one of " + pair.second();
+ }
+ }
+ } else {
+ if (!set.contains(pair.first())) return " Must be one of " + pair.second() + ", got " + pair.first();
+ }
+ return null;
+ } else {
+ return " Unknown type";
+ }
+
+ };
+ private final Map<String, Object> delegate;
+
+ public ValidatingJsonMap(Map<String, Object> delegate) {
+ this.delegate = delegate;
+ }
+
+ public ValidatingJsonMap(int i) {
+ delegate = new LinkedHashMap<>(i);
+ }
+
+ public ValidatingJsonMap() {
+ delegate = new LinkedHashMap<>();
+ }
+
+ @Override
+ public int size() {
+ return delegate.size();
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return delegate.isEmpty();
+ }
+
+ @Override
+ public boolean containsKey(Object key) {
+ return delegate.containsKey(key);
+ }
+
+ @Override
+ public boolean containsValue(Object value) {
+ return delegate.containsValue(value);
+ }
+
+ @Override
+ public Object get(Object key) {
+ return delegate.get(key);
+ }
+
+ @Override
+ public Object put(String key, Object value) {
+ return delegate.put(key, value);
+ }
+
+ @Override
+ public Object remove(Object key) {
+ return null;
+ }
+
+ @Override
+ public void putAll(Map<? extends String, ?> m) {
+ delegate.putAll(m);
+ }
+
+ @Override
+ public void clear() {
+ delegate.clear();
+
+ }
+
+ @Override
+ public Set<String> keySet() {
+ return delegate.keySet();
+ }
+
+ @Override
+ public Collection<Object> values() {
+ return delegate.values();
+ }
+
+ @Override
+ public Set<Entry<String, Object>> entrySet() {
+ return delegate.entrySet();
+ }
+
+ public Object get(String key, PredicateWithErrMsg predicate) {
+ Object v = get(key);
+ if (predicate != null) {
+ String msg = predicate.test(v);
+ if (msg != null) {
+ throw new RuntimeException("" + key + msg);
+ }
+ }
+ return v;
+ }
+
+ public Boolean getBool(String key, Boolean def) {
+ Object v = get(key);
+ if (v == null) return def;
+ if (v instanceof Boolean) return (Boolean) v;
+ try {
+ return Boolean.parseBoolean(v.toString());
+ } catch (NumberFormatException e) {
+ throw new RuntimeException("value of " + key + "must be an boolean");
+ }
+ }
+
+ public Integer getInt(String key, Integer def) {
+ Object v = get(key);
+ if (v == null) return def;
+ if (v instanceof Integer) return (Integer) v;
+ try {
+ return Integer.parseInt(v.toString());
+ } catch (NumberFormatException e) {
+ throw new RuntimeException("value of " + key + "must be an integer");
+ }
+ }
+ public ValidatingJsonMap getMap(String key, PredicateWithErrMsg predicate) {
+ return getMap(key, predicate, null);
+
+ }
+
+ public ValidatingJsonMap getMap(String key, PredicateWithErrMsg predicate, String message) {
+ Object v = get(key);
+ if (v != null && !(v instanceof Map)) {
+ throw new RuntimeException("" + key + " should be of type map");
+ }
+
+ if (predicate != null) {
+ String msg = predicate.test(v);
+ if (msg != null) {
+ msg = message != null ? message : key + msg;
+ throw new RuntimeException(msg);
+ }
+ }
+ return wrap((Map) v);
+ }
+
+ public List getList(String key, PredicateWithErrMsg predicate) {
+ return getList(key, predicate, null);
+ }
+
+ public List getList(String key, PredicateWithErrMsg predicate, Object test) {
+ Object v = get(key);
+ if (v != null && !(v instanceof List)) {
+ throw new RuntimeException("" + key + " should be of type List");
+ }
+
+ if (predicate != null) {
+ String msg = predicate.test(test == null ? v : new Pair(v, test));
+ if (msg != null) {
+ throw new RuntimeException("" + key + msg);
+ }
+ }
+
+ return (List) v;
+ }
+
+ public Object get(String key, PredicateWithErrMsg<Pair> predicate, Object arg) {
+ Object v = get(key);
+ String test = predicate.test(new Pair(v, arg));
+ if (test != null) {
+ throw new RuntimeException("" + key + test);
+ }
+ return v;
+ }
+
+ public Object get(String k, Object def) {
+ Object v = get(k);
+ if (v == null) return def;
+ return v;
+ }
+
+ static ValidatingJsonMap wrap(Map<String, Object> map) {
+ if (map == null) return null;
+ if (map instanceof ValidatingJsonMap) {
+ return (ValidatingJsonMap) map;
+ } else {
+ return new ValidatingJsonMap(map);
+ }
+
+ }
+
+ public static ValidatingJsonMap fromJSON(InputStream is) {
+ return fromJSON(new InputStreamReader(is, UTF_8));
+ }
+
+ public static ValidatingJsonMap fromJSON(Reader s) {
+ try {
+ return (ValidatingJsonMap) (getObjectBuilder(new JSONParser(s)).getObject());
+ } catch (IOException e) {
+ throw new RuntimeException();
+ }
+ }
+
+ public static ValidatingJsonMap getDeepCopy(Map map, int maxDepth, boolean mutable) {
+ if (map == null) return null;
+ if (maxDepth < 1) return ValidatingJsonMap.wrap(map);
+ ValidatingJsonMap copy = mutable ? new ValidatingJsonMap(map.size()) : new ValidatingJsonMap();
+ for (Object o : map.entrySet()) {
+ Map.Entry<String,Object> e = (Entry<String, Object>) o;
+ Object v = e.getValue();
+ if (v instanceof Map) v = getDeepCopy((Map) v, maxDepth - 1, mutable);
+ else if (v instanceof Collection) v = getDeepCopy((Collection) v, maxDepth - 1, mutable);
+ copy.put(e.getKey(), v);
+ }
+ return mutable ? copy : new ValidatingJsonMap(Collections.unmodifiableMap(copy));
+ }
+
+ public static Collection getDeepCopy(Collection c, int maxDepth, boolean mutable) {
+ if (c == null || maxDepth < 1) return c;
+ Collection result = c instanceof Set ? new HashSet() : new ArrayList();
+ for (Object o : c) {
+ if (o instanceof Map) {
+ o = getDeepCopy((Map) o, maxDepth - 1, mutable);
+ }
+ result.add(o);
+ }
+ return mutable ? result : result instanceof Set ? unmodifiableSet((Set) result) : unmodifiableList((List) result);
+ }
+
+ private static ObjectBuilder getObjectBuilder(final JSONParser jp) throws IOException {
+ return new ObjectBuilder(jp) {
+ @Override
+ public Object newObject() throws IOException {
+ return new ValidatingJsonMap();
+ }
+ };
+ }
+
+
+ @Override
+ public boolean equals(Object that) {
+ return that instanceof Map && this.delegate.equals(that);
+ }
+
+ public static final ValidatingJsonMap EMPTY = new ValidatingJsonMap(Collections.EMPTY_MAP);
+}