diff --git a/dev-tools/maven/pom.xml.template b/dev-tools/maven/pom.xml.template
index bce51c7c299..7b4f01bfb18 100644
--- a/dev-tools/maven/pom.xml.template
+++ b/dev-tools/maven/pom.xml.template
@@ -197,6 +197,11 @@
+
+ org.noggit
+ noggit
+ 0.5
+
commons-lang
commons-lang
diff --git a/dev-tools/maven/solr/solrj/src/java/pom.xml.template b/dev-tools/maven/solr/solrj/src/java/pom.xml.template
index 21594003c11..6e22e0bd83f 100644
--- a/dev-tools/maven/solr/solrj/src/java/pom.xml.template
+++ b/dev-tools/maven/solr/solrj/src/java/pom.xml.template
@@ -85,6 +85,10 @@
commons-io
commons-io
+
+ org.noggit
+ noggit
+
org.apache.httpcomponents
httpclient
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index c0a7b65a200..c28de06327b 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -183,6 +183,8 @@ Other Changes
* SOLR-4544: Refactor HttpShardHandlerFactory so load-balancing logic can be customized.
(Ryan Ernst via Robert Muir)
+* SOLR-4607: Use noggit 0.5 release jar rather than a forked copy. (Yonik Seeley, Robert Muir)
+
================== 4.2.1 ==================
Versions of Major Components
diff --git a/solr/core/src/java/org/apache/solr/handler/loader/JsonLoader.java b/solr/core/src/java/org/apache/solr/handler/loader/JsonLoader.java
index 7ab5c1a4cb8..e40fb5e2b75 100644
--- a/solr/core/src/java/org/apache/solr/handler/loader/JsonLoader.java
+++ b/solr/core/src/java/org/apache/solr/handler/loader/JsonLoader.java
@@ -22,8 +22,8 @@ import java.io.StringReader;
import java.util.*;
import org.apache.commons.io.IOUtils;
-import org.apache.noggit.JSONParser;
-import org.apache.noggit.ObjectBuilder;
+import org.noggit.JSONParser;
+import org.noggit.ObjectBuilder;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.common.SolrInputField;
diff --git a/solr/core/src/java/org/apache/solr/schema/JsonPreAnalyzedParser.java b/solr/core/src/java/org/apache/solr/schema/JsonPreAnalyzedParser.java
index e3cb5f680a0..77b6c04d607 100644
--- a/solr/core/src/java/org/apache/solr/schema/JsonPreAnalyzedParser.java
+++ b/solr/core/src/java/org/apache/solr/schema/JsonPreAnalyzedParser.java
@@ -23,9 +23,9 @@ import org.apache.lucene.util.Attribute;
import org.apache.lucene.util.AttributeSource;
import org.apache.lucene.util.AttributeSource.State;
import org.apache.lucene.util.BytesRef;
-import org.apache.noggit.JSONUtil;
-import org.apache.noggit.JSONWriter;
-import org.apache.noggit.ObjectBuilder;
+import org.noggit.JSONUtil;
+import org.noggit.JSONWriter;
+import org.noggit.ObjectBuilder;
import org.apache.solr.common.util.Base64;
import org.apache.solr.schema.PreAnalyzedField.ParseResult;
import org.apache.solr.schema.PreAnalyzedField.PreAnalyzedParser;
diff --git a/solr/core/src/java/org/apache/solr/schema/OpenExchangeRatesOrgProvider.java b/solr/core/src/java/org/apache/solr/schema/OpenExchangeRatesOrgProvider.java
index 177f8442bf9..b8cc31ebc66 100644
--- a/solr/core/src/java/org/apache/solr/schema/OpenExchangeRatesOrgProvider.java
+++ b/solr/core/src/java/org/apache/solr/schema/OpenExchangeRatesOrgProvider.java
@@ -24,7 +24,7 @@ import java.util.HashMap;
import java.util.Map;
import java.util.Set;
-import org.apache.noggit.JSONParser;
+import org.noggit.JSONParser;
import org.apache.lucene.analysis.util.ResourceLoader;
import org.apache.lucene.util.IOUtils;
import org.apache.solr.common.SolrException;
diff --git a/solr/core/src/java/org/apache/solr/servlet/ZookeeperInfoServlet.java b/solr/core/src/java/org/apache/solr/servlet/ZookeeperInfoServlet.java
index ced91bc40ad..03d593f1c9c 100644
--- a/solr/core/src/java/org/apache/solr/servlet/ZookeeperInfoServlet.java
+++ b/solr/core/src/java/org/apache/solr/servlet/ZookeeperInfoServlet.java
@@ -32,8 +32,8 @@ import javax.servlet.http.HttpServletResponse;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.IOUtils;
-import org.apache.noggit.CharArr;
-import org.apache.noggit.JSONWriter;
+import org.noggit.CharArr;
+import org.noggit.JSONWriter;
import org.apache.solr.cloud.ZkController;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.cloud.SolrZkClient;
diff --git a/solr/core/src/test/org/apache/solr/TestGroupingSearch.java b/solr/core/src/test/org/apache/solr/TestGroupingSearch.java
index 61ca2b9340d..6a3d47bbeda 100644
--- a/solr/core/src/test/org/apache/solr/TestGroupingSearch.java
+++ b/solr/core/src/test/org/apache/solr/TestGroupingSearch.java
@@ -18,8 +18,8 @@
package org.apache.solr;
import org.apache.lucene.search.FieldCache;
-import org.apache.noggit.JSONUtil;
-import org.apache.noggit.ObjectBuilder;
+import org.noggit.JSONUtil;
+import org.noggit.ObjectBuilder;
import org.apache.solr.client.solrj.impl.BinaryResponseParser;
import org.apache.solr.common.params.CommonParams;
import org.apache.solr.common.params.GroupParams;
diff --git a/solr/core/src/test/org/apache/solr/TestJoin.java b/solr/core/src/test/org/apache/solr/TestJoin.java
index 1eb94dcbb00..152536456cf 100644
--- a/solr/core/src/test/org/apache/solr/TestJoin.java
+++ b/solr/core/src/test/org/apache/solr/TestJoin.java
@@ -21,8 +21,8 @@ import org.apache.lucene.search.FieldCache;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.BooleanQuery;
-import org.apache.noggit.JSONUtil;
-import org.apache.noggit.ObjectBuilder;
+import org.noggit.JSONUtil;
+import org.noggit.ObjectBuilder;
import org.apache.solr.common.params.ModifiableSolrParams;
import org.apache.solr.core.SolrCore;
import org.apache.solr.handler.JsonUpdateRequestHandler;
diff --git a/solr/core/src/test/org/apache/solr/request/SimpleFacetsTest.java b/solr/core/src/test/org/apache/solr/request/SimpleFacetsTest.java
index 232348fbf1b..3d2dc22763f 100644
--- a/solr/core/src/test/org/apache/solr/request/SimpleFacetsTest.java
+++ b/solr/core/src/test/org/apache/solr/request/SimpleFacetsTest.java
@@ -17,7 +17,7 @@
package org.apache.solr.request;
-import org.apache.noggit.ObjectBuilder;
+import org.noggit.ObjectBuilder;
import org.apache.solr.SolrTestCaseJ4;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.params.ModifiableSolrParams;
diff --git a/solr/core/src/test/org/apache/solr/search/TestRealTimeGet.java b/solr/core/src/test/org/apache/solr/search/TestRealTimeGet.java
index 653340b3be9..43942b03096 100644
--- a/solr/core/src/test/org/apache/solr/search/TestRealTimeGet.java
+++ b/solr/core/src/test/org/apache/solr/search/TestRealTimeGet.java
@@ -18,7 +18,7 @@ package org.apache.solr.search;
import org.apache.lucene.util.LuceneTestCase.Slow;
-import org.apache.noggit.ObjectBuilder;
+import org.noggit.ObjectBuilder;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.request.SolrQueryRequest;
diff --git a/solr/core/src/test/org/apache/solr/search/TestRecovery.java b/solr/core/src/test/org/apache/solr/search/TestRecovery.java
index 551769ef11a..5a8e8c0d748 100644
--- a/solr/core/src/test/org/apache/solr/search/TestRecovery.java
+++ b/solr/core/src/test/org/apache/solr/search/TestRecovery.java
@@ -17,7 +17,7 @@
package org.apache.solr.search;
-import org.apache.noggit.ObjectBuilder;
+import org.noggit.ObjectBuilder;
import org.apache.solr.SolrTestCaseJ4;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.update.DirectUpdateHandler2;
diff --git a/solr/core/src/test/org/apache/solr/search/TestStressRecovery.java b/solr/core/src/test/org/apache/solr/search/TestStressRecovery.java
index e99223f5375..b403c8d16c6 100644
--- a/solr/core/src/test/org/apache/solr/search/TestStressRecovery.java
+++ b/solr/core/src/test/org/apache/solr/search/TestStressRecovery.java
@@ -18,7 +18,7 @@ package org.apache.solr.search;
import org.apache.lucene.util.Constants;
-import org.apache.noggit.ObjectBuilder;
+import org.noggit.ObjectBuilder;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.update.UpdateHandler;
import org.apache.solr.update.UpdateLog;
diff --git a/solr/core/src/test/org/apache/solr/search/TestStressReorder.java b/solr/core/src/test/org/apache/solr/search/TestStressReorder.java
index 775fcf0bfff..f4e62f08fee 100644
--- a/solr/core/src/test/org/apache/solr/search/TestStressReorder.java
+++ b/solr/core/src/test/org/apache/solr/search/TestStressReorder.java
@@ -17,7 +17,7 @@
package org.apache.solr.search;
-import org.apache.noggit.ObjectBuilder;
+import org.noggit.ObjectBuilder;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.util.TestHarness;
import org.junit.BeforeClass;
diff --git a/solr/core/src/test/org/apache/solr/search/TestStressVersions.java b/solr/core/src/test/org/apache/solr/search/TestStressVersions.java
index cce28a24bd2..5d3f6f6f0e0 100644
--- a/solr/core/src/test/org/apache/solr/search/TestStressVersions.java
+++ b/solr/core/src/test/org/apache/solr/search/TestStressVersions.java
@@ -17,7 +17,7 @@
package org.apache.solr.search;
-import org.apache.noggit.ObjectBuilder;
+import org.noggit.ObjectBuilder;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.util.TestHarness;
import org.junit.BeforeClass;
diff --git a/solr/core/src/test/org/apache/solr/update/processor/TestPartialUpdateDeduplication.java b/solr/core/src/test/org/apache/solr/update/processor/TestPartialUpdateDeduplication.java
index c4cf5115c18..72898694acb 100644
--- a/solr/core/src/test/org/apache/solr/update/processor/TestPartialUpdateDeduplication.java
+++ b/solr/core/src/test/org/apache/solr/update/processor/TestPartialUpdateDeduplication.java
@@ -18,7 +18,7 @@ package org.apache.solr.update.processor;
*/
import com.google.common.collect.Maps;
-import org.apache.noggit.ObjectBuilder;
+import org.noggit.ObjectBuilder;
import org.apache.solr.SolrTestCaseJ4;
import org.apache.solr.client.solrj.request.UpdateRequest;
import org.apache.solr.common.SolrInputDocument;
diff --git a/solr/licenses/noggit-0.5.jar.sha1 b/solr/licenses/noggit-0.5.jar.sha1
new file mode 100644
index 00000000000..e4b0a71999c
--- /dev/null
+++ b/solr/licenses/noggit-0.5.jar.sha1
@@ -0,0 +1 @@
+8e6e65624d2e09a30190c6434abe23b7d4e5413c
diff --git a/solr/licenses/noggit-LICENSE-ASL.txt b/solr/licenses/noggit-LICENSE-ASL.txt
new file mode 100644
index 00000000000..261eeb9e9f8
--- /dev/null
+++ b/solr/licenses/noggit-LICENSE-ASL.txt
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed 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.
diff --git a/solr/licenses/noggit-NOTICE.txt b/solr/licenses/noggit-NOTICE.txt
new file mode 100644
index 00000000000..3bf8aefcdd6
--- /dev/null
+++ b/solr/licenses/noggit-NOTICE.txt
@@ -0,0 +1,3 @@
+noggit
+
+https://github.com/yonik/noggit
diff --git a/solr/solrj/ivy.xml b/solr/solrj/ivy.xml
index 3ef4064eed9..8b00ff5e78c 100644
--- a/solr/solrj/ivy.xml
+++ b/solr/solrj/ivy.xml
@@ -44,6 +44,7 @@
+
diff --git a/solr/solrj/src/java/org/apache/noggit/CharArr.java b/solr/solrj/src/java/org/apache/noggit/CharArr.java
deleted file mode 100755
index c1daa52ca66..00000000000
--- a/solr/solrj/src/java/org/apache/noggit/CharArr.java
+++ /dev/null
@@ -1,372 +0,0 @@
-/*
- * 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.noggit;
-
-
-import java.io.IOException;
-import java.io.Reader;
-import java.io.Writer;
-import java.nio.CharBuffer;
-
-// CharArr origins
-// V1.0 7/06/97
-// V1.1 9/21/99
-// V1.2 2/02/04 // Java5 features
-// V1.3 11/26/06 // Make safe for Java 1.4, work into Noggit
-
-
-// Java5 version could look like the following:
-// public class CharArr implements CharSequence, Appendable, Readable, Closeable {
-
-
-/**
- */
-public class CharArr implements CharSequence, Appendable {
- protected char[] buf;
- protected int start;
- protected int end;
-
- public CharArr() {
- this(32);
- }
-
- public CharArr(int size) {
- buf = new char[size];
- }
-
- public CharArr(char[] arr, int start, int end) {
- set(arr,start,end);
- }
-
- public void setStart(int start) { this.start = start; }
- public void setEnd(int end) { this.end = end; }
- public void set(char[] arr, int start, int end) {
- this.buf = arr;
- this.start = start;
- this.end = end;
- }
-
- public char[] getArray() { return buf; }
- public int getStart() { return start; }
- public int getEnd() { return end; }
- public int size() { return end-start; }
- @Override
- public int length() { return size(); }
- public int capacity() { return buf.length; }
-
-
- @Override
- public char charAt(int index) {
- return buf[start+index];
- }
-
- @Override
- public CharArr subSequence(int start, int end) {
- return new CharArr(buf, this.start+start, this.start+end);
- }
-
- public int read() throws IOException {
- if (start>=end) return -1;
- return buf[start++];
- }
-
- public int read(char cbuf[], int off, int len) {
- //TODO
- return 0;
- }
-
- public void unsafeWrite(char b) {
- buf[end++] = b;
- }
-
- public void unsafeWrite(int b) { unsafeWrite((char)b); }
-
- public void unsafeWrite(char b[], int off, int len) {
- System.arraycopy(b, off, buf, end, len);
- end += len;
- }
-
- protected void resize(int len) {
- char newbuf[] = new char[Math.max(buf.length << 1, len)];
- System.arraycopy(buf, start, newbuf, 0, size());
- buf = newbuf;
- }
-
- public void reserve(int num) {
- if (end + num > buf.length) resize(end + num);
- }
-
- public void write(char b) {
- if (end >= buf.length) {
- resize(end+1);
- }
- unsafeWrite(b);
- }
-
- public final void write(int b) { write((char)b); }
-
- public final void write(char[] b) {
- write(b,0,b.length);
- }
-
- public void write(char b[], int off, int len) {
- reserve(len);
- unsafeWrite(b, off, len);
- }
-
- public final void write(CharArr arr) {
- write(arr.buf, start, end-start);
- }
-
- public final void write(String s) {
- write(s, 0, s.length());
- }
-
- public void write(String s, int stringOffset, int len) {
- reserve(len);
- s.getChars(stringOffset, len, buf, end);
- end += len;
- }
-
- public void flush() {
- }
-
- public final void reset() {
- start = end = 0;
- }
-
- public void close() {
- }
-
- public char[] toCharArray() {
- char newbuf[] = new char[size()];
- System.arraycopy(buf, start, newbuf, 0, size());
- return newbuf;
- }
-
-
- @Override
- public String toString() {
- return new String(buf, start, size());
- }
-
-
- public int read(CharBuffer cb) throws IOException {
-
- /***
- int sz = size();
- if (sz<=0) return -1;
- if (sz>0) cb.put(buf, start, sz);
- return -1;
- ***/
-
- int sz = size();
- if (sz>0) cb.put(buf, start, sz);
- start=end;
- while (true) {
- fill();
- int s = size();
- if (s==0) return sz==0 ? -1 : sz;
- sz += s;
- cb.put(buf, start, s);
- }
- }
-
-
- public int fill() throws IOException {
- return 0; // or -1?
- }
-
- //////////////// Appendable methods /////////////
- @Override
- public final Appendable append(CharSequence csq) throws IOException {
- return append(csq, 0, csq.length());
- }
-
- @Override
- public Appendable append(CharSequence csq, int start, int end) throws IOException {
- write(csq.subSequence(start, end).toString());
- return null;
- }
-
- @Override
- public final Appendable append(char c) {
- write(c);
- return this;
- }
-}
-
-
-class NullCharArr extends CharArr {
- public NullCharArr() {
- super(new char[1],0,0);
- }
- @Override
- public void unsafeWrite(char b) {}
-
- @Override
- public void unsafeWrite(char b[], int off, int len) {}
-
- @Override
- public void unsafeWrite(int b) {}
-
- @Override
- public void write(char b) {}
-
- @Override
- public void write(char b[], int off, int len) {}
-
- @Override
- public void reserve(int num) {}
-
- @Override
- protected void resize(int len) {}
-
- @Override
- public Appendable append(CharSequence csq, int start, int end) throws IOException {
- return this;
- }
-
- @Override
- public char charAt(int index) {
- return 0;
- }
-
- @Override
- public void write(String s, int stringOffset, int len) {
- }
-}
-
-
-
-// IDEA: a subclass that refills the array from a reader?
-class CharArrReader extends CharArr {
- protected final Reader in;
-
- public CharArrReader(Reader in, int size) {
- super(size);
- this.in = in;
- }
-
- @Override
- public int read() throws IOException {
- if (start>=end) fill();
- return start>=end ? -1 : buf[start++];
- }
-
- @Override
- public int read(CharBuffer cb) throws IOException {
- // empty the buffer and then read direct
- int sz = size();
- if (sz>0) cb.put(buf,start,end);
- int sz2 = in.read(cb);
- if (sz2>=0) return sz+sz2;
- return sz>0 ? sz : -1;
- }
-
- @Override
- public int fill() throws IOException {
- if (start>=end) {
- reset();
- } else if (start>0) {
- System.arraycopy(buf, start, buf, 0, size());
- end=size(); start=0;
- }
- /***
- // fill fully or not???
- do {
- int sz = in.read(buf,end,buf.length-end);
- if (sz==-1) return;
- end+=sz;
- } while (end < buf.length);
- ***/
-
- int sz = in.read(buf,end,buf.length-end);
- if (sz>0) end+=sz;
- return sz;
- }
-
-}
-
-
-
-class CharArrWriter extends CharArr {
- protected Writer sink;
-
- @Override
- public void flush() {
- try {
- sink.write(buf, start, end-start);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- start = end = 0;
- }
-
- @Override
- public void write(char b) {
- if (end >= buf.length) {
- flush();
- }
- unsafeWrite(b);
- }
-
- @Override
- public void write(char b[], int off, int len) {
- int space = buf.length - end;
- if (len < space) {
- unsafeWrite(b, off, len);
- } else if (len < buf.length) {
- unsafeWrite(b, off, space);
- flush();
- unsafeWrite(b, off+space, len-space);
- } else {
- flush();
- try {
- sink.write(b, off, len);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
- }
-
- @Override
- public void write(String s, int stringOffset, int len) {
- int space = buf.length - end;
- if (len < space) {
- s.getChars(stringOffset, stringOffset+len, buf, end);
- end += len;
- } else if (len < buf.length) {
- // if the data to write is small enough, buffer it.
- s.getChars(stringOffset, stringOffset+space, buf, end);
- flush();
- s.getChars(stringOffset+space, stringOffset+len, buf, 0);
- end = len-space;
- } else {
- flush();
- // don't buffer, just write to sink
- try {
- sink.write(s, stringOffset, len);
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
-
- }
- }
-}
-
diff --git a/solr/solrj/src/java/org/apache/noggit/CharUtil.java b/solr/solrj/src/java/org/apache/noggit/CharUtil.java
deleted file mode 100755
index f04ef242440..00000000000
--- a/solr/solrj/src/java/org/apache/noggit/CharUtil.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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.noggit;
-
-
-/**
- */
-public class CharUtil {
-
- // belongs in number utils or charutil?
- public long parseLong(char[] arr, int start, int end) {
- long x = 0;
- boolean negative = arr[start] == '-';
- for (int i=negative ? start+1 : start; i=0) {
- int c = a[a_start] - b[b_start];
- if (c!=0) return c;
- a_start++; b_start++;
- }
- return a_len-b_len;
- }
-
-}
diff --git a/solr/solrj/src/java/org/apache/noggit/JSONParser.java b/solr/solrj/src/java/org/apache/noggit/JSONParser.java
deleted file mode 100755
index 373da672206..00000000000
--- a/solr/solrj/src/java/org/apache/noggit/JSONParser.java
+++ /dev/null
@@ -1,837 +0,0 @@
-/*
- * 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.noggit;
-
-import java.io.IOException;
-import java.io.Reader;
-
-/**
- */
-
-public class JSONParser {
-
- /** Event indicating a JSON string value, including member names of objects */
- public static final int STRING=1;
- /** Event indicating a JSON number value which fits into a signed 64 bit integer */
- public static final int LONG=2;
- /** Event indicating a JSON number value which has a fractional part or an exponent
- * and with string length <= 23 chars not including sign. This covers
- * all representations of normal values for Double.toString().
- */
- public static final int NUMBER=3;
- /** Event indicating a JSON number value that was not produced by toString of any
- * Java primitive numerics such as Double or Long. It is either
- * an integer outside the range of a 64 bit signed integer, or a floating
- * point value with a string representation of more than 23 chars.
- */
- public static final int BIGNUMBER=4;
- /** Event indicating a JSON boolean */
- public static final int BOOLEAN=5;
- /** Event indicating a JSON null */
- public static final int NULL=6;
- /** Event indicating the start of a JSON object */
- public static final int OBJECT_START=7;
- /** Event indicating the end of a JSON object */
- public static final int OBJECT_END=8;
- /** Event indicating the start of a JSON array */
- public static final int ARRAY_START=9;
- /** Event indicating the end of a JSON array */
- public static final int ARRAY_END=10;
- /** Event indicating the end of input has been reached */
- public static final int EOF=11;
-
- public static class ParseException extends RuntimeException {
- public ParseException(String msg) {
- super(msg);
- }
- }
-
- public static String getEventString( int e )
- {
- switch( e )
- {
- case STRING: return "STRING";
- case LONG: return "LONG";
- case NUMBER: return "NUMBER";
- case BIGNUMBER: return "BIGNUMBER";
- case BOOLEAN: return "BOOLEAN";
- case NULL: return "NULL";
- case OBJECT_START: return "OBJECT_START";
- case OBJECT_END: return "OBJECT_END";
- case ARRAY_START: return "ARRAY_START";
- case ARRAY_END: return "ARRAY_END";
- case EOF: return "EOF";
- }
- return "Unknown: "+e;
- }
-
- private static final CharArr devNull = new NullCharArr();
-
-
- final char[] buf; // input buffer with JSON text in it
- int start; // current position in the buffer
- int end; // end position in the buffer (one past last valid index)
- final Reader in; // optional reader to obtain data from
- boolean eof=false; // true if the end of the stream was reached.
- long gpos; // global position = gpos + start
-
- int event; // last event read
-
- public JSONParser(Reader in) {
- this(in, new char[8192]);
- // 8192 matches the default buffer size of a BufferedReader so double
- // buffering of the data is avoided.
- }
-
- public JSONParser(Reader in, char[] buffer) {
- this.in = in;
- this.buf = buffer;
- }
-
- // idea - if someone passes us a CharArrayReader, we could
- // directly use that buffer as it's protected.
-
- public JSONParser(char[] data, int start, int end) {
- this.in = null;
- this.buf = data;
- this.start = start;
- this.end = end;
- }
-
- public JSONParser(String data) {
- this(data, 0, data.length());
- }
-
- public JSONParser(String data, int start, int end) {
- this.in = null;
- this.start = start;
- this.end = end;
- this.buf = new char[end-start];
- data.getChars(start,end,buf,0);
- }
-
- // temporary output buffer
- private final CharArr out = new CharArr(64);
-
- // We need to keep some state in order to (at a minimum) know if
- // we should skip ',' or ':'.
- private byte[] stack = new byte[16];
- private int ptr=0; // pointer into the stack of parser states
- private byte state=0; // current parser state
-
- // parser states stored in the stack
- private static final byte DID_OBJSTART =1; // '{' just read
- private static final byte DID_ARRSTART =2; // '[' just read
- private static final byte DID_ARRELEM =3; // array element just read
- private static final byte DID_MEMNAME =4; // object member name (map key) just read
- private static final byte DID_MEMVAL =5; // object member value (map val) just read
-
- // info about value that was just read (or is in the middle of being read)
- private int valstate;
-
- // push current parser state (use at start of new container)
- private final void push() {
- if (ptr >= stack.length) {
- // doubling here is probably overkill, but anything that needs to double more than
- // once (32 levels deep) is very atypical anyway.
- byte[] newstack = new byte[stack.length<<1];
- System.arraycopy(stack,0,newstack,0,stack.length);
- stack = newstack;
- }
- stack[ptr++] = state;
- }
-
- // pop parser state (use at end of container)
- private final void pop() {
- if (--ptr<0) {
- throw err("Unbalanced container");
- } else {
- state = stack[ptr];
- }
- }
-
- protected void fill() throws IOException {
- if (in!=null) {
- gpos += end;
- start=0;
- int num = in.read(buf,0,buf.length);
- end = num>=0 ? num : 0;
- }
- if (start>=end) eof=true;
- }
-
- private void getMore() throws IOException {
- fill();
- if (start>=end) {
- throw err(null);
- }
- }
-
- protected int getChar() throws IOException {
- if (start>=end) {
- fill();
- if (start>=end) return -1;
- }
- return buf[start++];
- }
-
- private int getCharNWS() throws IOException {
- for (;;) {
- int ch = getChar();
- if (!(ch==' ' || ch=='\t' || ch=='\n' || ch=='\r')) return ch;
- }
- }
-
- private void expect(char[] arr) throws IOException {
- for (int i=1; i0) start--; // backup one char
- String chs = "char=" + ((start>=end) ? "(EOF)" : "" + (char)buf[start]);
- String pos = "position=" + (gpos+start);
- String tot = chs + ',' + pos + getContext();
- if (msg==null) {
- if (start>=end) msg = "Unexpected EOF";
- else msg="JSON Parse Error";
- }
- return new ParseException(msg + ": " + tot);
- }
-
- private String getContext() {
- String context = "";
- if (start>=0) {
- context += " BEFORE='" + errEscape(Math.max(start-60,0), start+1) + "'";
- }
- if (start=b) return "";
- return new String(buf, a, b-a).replaceAll("\\s+"," ");
- }
-
-
- private boolean bool; // boolean value read
- private long lval; // long value read
- private int nstate; // current state while reading a number
- private static final int HAS_FRACTION = 0x01; // nstate flag, '.' already read
- private static final int HAS_EXPONENT = 0x02; // nstate flag, '[eE][+-]?[0-9]' already read
-
- /** Returns the long read... only significant if valstate==LONG after
- * this call. firstChar should be the first numeric digit read.
- */
- private long readNumber(int firstChar, boolean isNeg) throws IOException {
- out.unsafeWrite(firstChar); // unsafe OK since we know output is big enough
- // We build up the number in the negative plane since it's larger (by one) than
- // the positive plane.
- long v = '0' - firstChar;
- // can't overflow a long in 18 decimal digits (i.e. 17 additional after the first).
- // we also need 22 additional to handle double so we'll handle in 2 separate loops.
- int i;
- for (i=0; i<17; i++) {
- int ch = getChar();
- // TODO: is this switch faster as an if-then-else?
- switch(ch) {
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- v = v*10 - (ch-'0');
- out.unsafeWrite(ch);
- continue;
- case '.':
- out.unsafeWrite('.');
- valstate = readFrac(out,22-i);
- return 0;
- case 'e':
- case 'E':
- out.unsafeWrite(ch);
- nstate=0;
- valstate = readExp(out,22-i);
- return 0;
- default:
- // return the number, relying on nextEvent() to return an error
- // for invalid chars following the number.
- if (ch!=-1) --start; // push back last char if not EOF
-
- valstate = LONG;
- return isNeg ? v : -v;
- }
- }
-
- // after this, we could overflow a long and need to do extra checking
- boolean overflow = false;
- long maxval = isNeg ? Long.MIN_VALUE : -Long.MAX_VALUE;
-
- for (; i<22; i++) {
- int ch = getChar();
- switch(ch) {
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- if (v < (0x8000000000000000L/10)) overflow=true; // can't multiply by 10 w/o overflowing
- v *= 10;
- int digit = ch - '0';
- if (v < maxval + digit) overflow=true; // can't add digit w/o overflowing
- v -= digit;
- out.unsafeWrite(ch);
- continue;
- case '.':
- out.unsafeWrite('.');
- valstate = readFrac(out,22-i);
- return 0;
- case 'e':
- case 'E':
- out.unsafeWrite(ch);
- nstate=0;
- valstate = readExp(out,22-i);
- return 0;
- default:
- // return the number, relying on nextEvent() to return an error
- // for invalid chars following the number.
- if (ch!=-1) --start; // push back last char if not EOF
-
- valstate = overflow ? BIGNUMBER : LONG;
- return isNeg ? v : -v;
- }
- }
-
-
- nstate=0;
- valstate = BIGNUMBER;
- return 0;
- }
-
-
- // read digits right of decimal point
- private int readFrac(CharArr arr, int lim) throws IOException {
- nstate = HAS_FRACTION; // deliberate set instead of '|'
- while(--lim>=0) {
- int ch = getChar();
- if (ch>='0' && ch<='9') {
- arr.write(ch);
- } else if (ch=='e' || ch=='E') {
- arr.write(ch);
- return readExp(arr,lim);
- } else {
- if (ch!=-1) start--; // back up
- return NUMBER;
- }
- }
- return BIGNUMBER;
- }
-
-
- // call after 'e' or 'E' has been seen to read the rest of the exponent
- private int readExp(CharArr arr, int lim) throws IOException {
- nstate |= HAS_EXPONENT;
- int ch = getChar(); lim--;
-
- if (ch=='+' || ch=='-') {
- arr.write(ch);
- ch = getChar(); lim--;
- }
-
- // make sure at least one digit is read.
- if (ch<'0' || ch>'9') {
- throw err("missing exponent number");
- }
- arr.write(ch);
-
- return readExpDigits(arr,lim);
- }
-
- // continuation of readExpStart
- private int readExpDigits(CharArr arr, int lim) throws IOException {
- while (--lim>=0) {
- int ch = getChar();
- if (ch>='0' && ch<='9') {
- arr.write(ch);
- } else {
- if (ch!=-1) start--; // back up
- return NUMBER;
- }
- }
- return BIGNUMBER;
- }
-
- private void continueNumber(CharArr arr) throws IOException {
- if (arr != out) arr.write(out);
-
- if ((nstate & HAS_EXPONENT)!=0){
- readExpDigits(arr, Integer.MAX_VALUE);
- return;
- }
- if (nstate != 0) {
- readFrac(arr, Integer.MAX_VALUE);
- return;
- }
-
- for(;;) {
- int ch = getChar();
- if (ch>='0' && ch <='9') {
- arr.write(ch);
- } else if (ch=='.') {
- arr.write(ch);
- readFrac(arr,Integer.MAX_VALUE);
- return;
- } else if (ch=='e' || ch=='E') {
- arr.write(ch);
- readExp(arr,Integer.MAX_VALUE);
- return;
- } else {
- if (ch!=-1) start--;
- return;
- }
- }
- }
-
-
- private int hexval(int hexdig) {
- if (hexdig>='0' && hexdig <='9') {
- return hexdig-'0';
- } else if (hexdig>='A' && hexdig <='F') {
- return hexdig+(10-'A');
- } else if (hexdig>='a' && hexdig <='f') {
- return hexdig+(10-'a');
- }
- throw err("invalid hex digit");
- }
-
- // backslash has already been read when this is called
- private char readEscapedChar() throws IOException {
- switch (getChar()) {
- case '"' : return '"';
- case '\\' : return '\\';
- case '/' : return '/';
- case 'n' : return '\n';
- case 'r' : return '\r';
- case 't' : return '\t';
- case 'f' : return '\f';
- case 'b' : return '\b';
- case 'u' :
- return (char)(
- (hexval(getChar()) << 12)
- | (hexval(getChar()) << 8)
- | (hexval(getChar()) << 4)
- | (hexval(getChar())));
- }
- throw err("Invalid character escape in string");
- }
-
- // a dummy buffer we can use to point at other buffers
- private final CharArr tmp = new CharArr(null,0,0);
-
- private CharArr readStringChars() throws IOException {
- char c=0;
- int i;
- for (i=start; i=end) {
- arr.write(buf,start,middle-start);
- start=middle;
- getMore();
- middle=start;
- }
- int ch = buf[middle++];
- if (ch=='"') {
- int len = middle-start-1;
- if (len>0) arr.write(buf,start,len);
- start=middle;
- return;
- } else if (ch=='\\') {
- int len = middle-start-1;
- if (len>0) arr.write(buf,start,len);
- start=middle;
- arr.write(readEscapedChar());
- middle=start;
- }
- }
- }
-
-
- /*** alternate implelentation
- // middle is the pointer to the middle of a buffer to start scanning for a non-string
- // character ('"' or "/"). start<=middle=end) {
- getMore();
- middle=start;
- } else {
- start = middle+1; // set buffer pointer to correct spot
- if (ch=='"') {
- valstate=0;
- return;
- } else if (ch=='\\') {
- arr.write(readEscapedChar());
- if (start>=end) getMore();
- middle=start;
- }
- }
- }
- }
- ***/
-
-
- // return the next event when parser is in a neutral state (no
- // map separators or array element separators to read
- private int next(int ch) throws IOException {
- for(;;) {
- switch (ch) {
- case ' ':
- case '\t': break;
- case '\r':
- case '\n': break; // try and keep track of linecounts?
- case '"' :
- valstate = STRING;
- return STRING;
- case '{' :
- push();
- state= DID_OBJSTART;
- return OBJECT_START;
- case '[':
- push();
- state=DID_ARRSTART;
- return ARRAY_START;
- case '0' :
- out.reset();
- //special case '0'? If next char isn't '.' val=0
- ch=getChar();
- if (ch=='.') {
- start--; ch='0';
- readNumber('0',false);
- return valstate;
- } else if (ch>'9' || ch<'0') {
- out.unsafeWrite('0');
- if (ch!=-1) start--;
- lval = 0;
- valstate=LONG;
- return LONG;
- } else {
- throw err("Leading zeros not allowed");
- }
- case '1' :
- case '2' :
- case '3' :
- case '4' :
- case '5' :
- case '6' :
- case '7' :
- case '8' :
- case '9' :
- out.reset();
- lval = readNumber(ch,false);
- return valstate;
- case '-' :
- out.reset();
- out.unsafeWrite('-');
- ch = getChar();
- if (ch<'0' || ch>'9') throw err("expected digit after '-'");
- lval = readNumber(ch,true);
- return valstate;
- case 't':
- valstate=BOOLEAN;
- // TODO: test performance of this non-branching inline version.
- // if ((('r'-getChar())|('u'-getChar())|('e'-getChar())) != 0) err("");
- expect(JSONUtil.TRUE_CHARS);
- bool=true;
- return BOOLEAN;
- case 'f':
- valstate=BOOLEAN;
- expect(JSONUtil.FALSE_CHARS);
- bool=false;
- return BOOLEAN;
- case 'n':
- valstate=NULL;
- expect(JSONUtil.NULL_CHARS);
- return NULL;
- case -1:
- if (getLevel()>0) throw err("Premature EOF");
- return EOF;
- default: throw err(null);
- }
-
- ch = getChar();
- }
- }
-
- @Override
- public String toString() {
- return "start="+start+",end="+end+",state="+state+"valstate="+valstate;
- }
-
-
- /** Returns the next event encountered in the JSON stream, one of
- *
- * - {@link #STRING}
- * - {@link #LONG}
- * - {@link #NUMBER}
- * - {@link #BIGNUMBER}
- * - {@link #BOOLEAN}
- * - {@link #NULL}
- * - {@link #OBJECT_START}
- * - {@link #OBJECT_END}
- * - {@link #OBJECT_END}
- * - {@link #ARRAY_START}
- * - {@link #ARRAY_END}
- * - {@link #EOF}
- *
- */
- public int nextEvent() throws IOException {
- if (valstate==STRING) {
- readStringChars2(devNull,start);
- }
- else if (valstate==BIGNUMBER) {
- continueNumber(devNull);
- }
-
- valstate=0;
-
- int ch; // TODO: factor out getCharNWS() to here and check speed
- switch (state) {
- case 0:
- return event = next(getCharNWS());
- case DID_OBJSTART:
- ch = getCharNWS();
- if (ch=='}') {
- pop();
- return event = OBJECT_END;
- }
- if (ch != '"') {
- throw err("Expected string");
- }
- state = DID_MEMNAME;
- valstate = STRING;
- return event = STRING;
- case DID_MEMNAME:
- ch = getCharNWS();
- if (ch!=':') {
- throw err("Expected key,value separator ':'");
- }
- state = DID_MEMVAL; // set state first because it might be pushed...
- return event = next(getChar());
- case DID_MEMVAL:
- ch = getCharNWS();
- if (ch=='}') {
- pop();
- return event = OBJECT_END;
- } else if (ch!=',') {
- throw err("Expected ',' or '}'");
- }
- ch = getCharNWS();
- if (ch != '"') {
- throw err("Expected string");
- }
- state = DID_MEMNAME;
- valstate = STRING;
- return event = STRING;
- case DID_ARRSTART:
- ch = getCharNWS();
- if (ch==']') {
- pop();
- return event = ARRAY_END;
- }
- state = DID_ARRELEM; // set state first, might be pushed...
- return event = next(ch);
- case DID_ARRELEM:
- ch = getCharNWS();
- if (ch==']') {
- pop();
- return event = ARRAY_END;
- } else if (ch!=',') {
- throw err("Expected ',' or ']'");
- }
- // state = DID_ARRELEM;
- return event = next(getChar());
- }
- return 0;
- }
-
- public int lastEvent() {
- return event;
- }
-
- public boolean wasKey()
- {
- return state == DID_MEMNAME;
- }
-
-
- private void goTo(int what) throws IOException {
- if (valstate==what) { valstate=0; return; }
- if (valstate==0) {
- int ev = nextEvent(); // TODO
- if (valstate!=what) {
- throw err("type mismatch");
- }
- valstate=0;
- }
- else {
- throw err("type mismatch");
- }
- }
-
- /** Returns the JSON string value, decoding any escaped characters. */
- public String getString() throws IOException {
- return getStringChars().toString();
- }
-
- /** Returns the characters of a JSON string value, decoding any escaped characters.
- * The underlying buffer of the returned CharArr
should *not* be
- * modified as it may be shared with the input buffer.
- * The returned CharArr
will only be valid up until
- * the next JSONParser method is called. Any required data should be
- * read before that point.
- */
- public CharArr getStringChars() throws IOException {
- goTo(STRING);
- return readStringChars();
- }
-
- /** Reads a JSON string into the output, decoding any escaped characters. */
- public void getString(CharArr output) throws IOException {
- goTo(STRING);
- readStringChars2(output,start);
- }
-
- /** Reads a number from the input stream and parses it as a long, only if
- * the value will in fact fit into a signed 64 bit integer. */
- public long getLong() throws IOException {
- goTo(LONG);
- return lval;
- }
-
- /** Reads a number from the input stream and parses it as a double */
- public double getDouble() throws IOException {
- return Double.parseDouble(getNumberChars().toString());
- }
-
- /** Returns the characters of a JSON numeric value.
- * The underlying buffer of the returned CharArr
should *not* be
- * modified as it may be shared with the input buffer.
- * The returned CharArr
will only be valid up until
- * the next JSONParser method is called. Any required data should be
- * read before that point.
- */
- public CharArr getNumberChars() throws IOException {
- int ev=0;
- if (valstate==0) ev = nextEvent();
-
- if (valstate == LONG || valstate == NUMBER) {
- valstate=0;
- return out;
- }
- else if (valstate==BIGNUMBER) {
- continueNumber(out);
- valstate=0;
- return out;
- } else {
- throw err("Unexpected " + ev);
- }
- }
-
- /** Reads a JSON numeric value into the output. */
- public void getNumberChars(CharArr output) throws IOException {
- int ev=0;
- if (valstate==0) ev=nextEvent();
- if (valstate == LONG || valstate == NUMBER) output.write(this.out);
- else if (valstate==BIGNUMBER) {
- continueNumber(output);
- } else {
- throw err("Unexpected " + ev);
- }
- valstate=0;
- }
-
- /** Reads a boolean value */
- public boolean getBoolean() throws IOException {
- goTo(BOOLEAN);
- return bool;
- }
-
- /** Reads a null value */
- public void getNull() throws IOException {
- goTo(NULL);
- }
-
- /**
- * @return the current nesting level, the number of parent objects or arrays.
- */
- public int getLevel() {
- return ptr;
- }
-
- public long getPosition()
- {
- return gpos+start;
- }
-}
diff --git a/solr/solrj/src/java/org/apache/noggit/JSONUtil.java b/solr/solrj/src/java/org/apache/noggit/JSONUtil.java
deleted file mode 100755
index a5d20c3a7ef..00000000000
--- a/solr/solrj/src/java/org/apache/noggit/JSONUtil.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * 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.noggit;
-
-/**
- */
-
-public class JSONUtil {
- public static final char[] TRUE_CHARS = new char[] {'t','r','u','e'};
- public static final char[] FALSE_CHARS = new char[] {'f','a','l','s','e'};
- public static final char[] NULL_CHARS = new char[] {'n','u','l','l'};
- public static final char[] HEX_CHARS = new char[] {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
- public static final char VALUE_SEPARATOR = ',';
- public static final char NAME_SEPARATOR = ':';
- public static final char OBJECT_START = '{';
- public static final char OBJECT_END = '}';
- public static final char ARRAY_START = '[';
- public static final char ARRAY_END = ']';
-
- public static String toJSON(Object o) {
- CharArr out = new CharArr();
- new JSONWriter(out).write(o);
- return out.toString();
- }
-
- /**
- * @param o The object to convert to JSON
- * @param indentSize The number of space characters to use as an indent (default 2). 0=newlines but no spaces, -1=no indent at all.
- * @return Given Object converted to its JSON representation using the given indentSize
- */
- public static String toJSON(Object o, int indentSize) {
- CharArr out = new CharArr();
- new JSONWriter(out,indentSize).write(o);
- return out.toString();
- }
-
- public static void writeNumber(int number, CharArr out) {
- out.write(Integer.toString(number));
- }
-
- public static void writeNumber(long number, CharArr out) {
- out.write(Long.toString(number));
- }
-
- public static void writeNumber(float number, CharArr out) {
- out.write(Float.toString(number));
- }
-
- public static void writeNumber(double number, CharArr out) {
- out.write(Double.toString(number));
- }
-
- public static void writeString(CharArr val, CharArr out) {
- writeString(val.getArray(), val.getStart(), val.getEnd(), out);
- }
-
- public static void writeString(char[] val, int start, int end, CharArr out) {
- out.write('"');
- writeStringPart(val,start,end,out);
- out.write('"');
- }
-
- public static void writeString(CharSequence val, int start, int end, CharArr out) {
- out.write('"');
- writeStringPart(val,start,end,out);
- out.write('"');
- }
-
- public static void writeStringPart(char[] val, int start, int end, CharArr out) {
- for (int i=start; i>>12]);
- out.write(HEX_CHARS[(ch>>>8)&0xf]);
- out.write(HEX_CHARS[(ch>>>4)&0xf]);
- out.write(HEX_CHARS[ch&0xf]);
- }
-
- public static void writeNull(CharArr out) {
- out.write(NULL_CHARS);
- }
-
- public static void writeBoolean(boolean val, CharArr out) {
- out.write(val ? TRUE_CHARS : FALSE_CHARS);
- }
-
-}
diff --git a/solr/solrj/src/java/org/apache/noggit/JSONWriter.java b/solr/solrj/src/java/org/apache/noggit/JSONWriter.java
deleted file mode 100755
index 76bc70cf0c5..00000000000
--- a/solr/solrj/src/java/org/apache/noggit/JSONWriter.java
+++ /dev/null
@@ -1,342 +0,0 @@
-/*
- * 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.noggit;
-
-import java.util.*;
-
-/**
- */
-public class JSONWriter {
-
- /** Implement this interface on your class to support serialization */
- public static interface Writable {
- public void write(JSONWriter writer);
- }
-
- protected int level;
- protected int indent;
- protected final CharArr out;
-
- /**
- * @param out the CharArr to write the output to.
- * @param indentSize The number of space characters to use as an indent (default 2). 0=newlines but no spaces, -1=no indent at all.
- */
- public JSONWriter(CharArr out, int indentSize) {
- this.out = out;
- this.indent = indentSize;
- }
-
- public JSONWriter(CharArr out) {
- this(out, 2);
- }
-
- public void setIndentSize(int indentSize) {
- this.indent = indentSize;
- }
-
- public void indent() {
- if (indent >= 0) {
- out.write('\n');
- if (indent > 0) {
- int spaces = level*indent;
- out.reserve(spaces);
- for (int i=0; i)val.entrySet()) {
- if (first) {
- first = false;
- } else {
- writeValueSeparator();
- }
- if (sz>1) indent();
- writeString(entry.getKey().toString());
- writeNameSeparator();
- write(entry.getValue());
- }
- endObject();
- }
-
- public void write(Collection val) {
- startArray();
- int sz = val.size();
- boolean first = true;
- for (Object o : val) {
- if (first) {
- first = false;
- } else {
- writeValueSeparator();
- }
- if (sz>1) indent();
- write(o);
- }
- endArray();
- }
-
- /** A byte[] may be either a single logical value, or a list of small integers.
- * It's up to the implementation to decide.
- */
- public void write(byte[] val) {
- startArray();
- boolean first = true;
- for (short v : val) {
- if (first) {
- first = false;
- } else {
- writeValueSeparator();
- }
- write(v);
- }
- endArray();
- }
-
- public void write(short[] val) {
- startArray();
- boolean first = true;
- for (short v : val) {
- if (first) {
- first = false;
- } else {
- writeValueSeparator();
- }
- write(v);
- }
- endArray();
- }
-
- public void write(int[] val) {
- startArray();
- boolean first = true;
- for (int v : val) {
- if (first) {
- first = false;
- } else {
- writeValueSeparator();
- }
- write(v);
- }
- endArray();
- }
-
- public void write(long[] val) {
- startArray();
- boolean first = true;
- for (long v : val) {
- if (first) {
- first = false;
- } else {
- writeValueSeparator();
- }
- write(v);
- }
- endArray();
- }
-
- public void write(float[] val) {
- startArray();
- boolean first = true;
- for (float v : val) {
- if (first) {
- first = false;
- } else {
- writeValueSeparator();
- }
- write(v);
- }
- endArray();
- }
-
- public void write(double[] val) {
- startArray();
- boolean first = true;
- for (double v : val) {
- if (first) {
- first = false;
- } else {
- writeValueSeparator();
- }
- write(v);
- }
- endArray();
- }
-
- public void write(boolean[] val) {
- startArray();
- boolean first = true;
- for (boolean v : val) {
- if (first) {
- first = false;
- } else {
- writeValueSeparator();
- }
- write(v);
- }
- endArray();
- }
-
-
- public void write(short number) { write ((int)number); }
- public void write(byte number) { write((int)number); }
-
-
- public void writeNull() {
- JSONUtil.writeNull(out);
- }
-
- public void writeString(CharSequence str) {
- JSONUtil.writeString(str,0,str.length(),out);
- }
-
- public void writeString(CharArr str) {
- JSONUtil.writeString(str,out);
- }
-
- public void writeStringStart() {
- out.write('"');
- }
-
- public void writeStringChars(CharArr partialStr) {
- JSONUtil.writeStringPart(partialStr.getArray(), partialStr.getStart(), partialStr.getEnd(), out);
- }
-
- public void writeStringEnd() {
- out.write('"');
- }
-
- public void write(long number) {
- JSONUtil.writeNumber(number,out);
- }
-
- public void write(int number) {
- JSONUtil.writeNumber(number,out);
- }
-
- public void write(double number) {
- JSONUtil.writeNumber(number,out);
- }
-
- public void write(float number) {
- JSONUtil.writeNumber(number,out);
- }
-
- public void write(boolean bool) {
- JSONUtil.writeBoolean(bool,out);
- }
-
- public void write(char[] val) {
- JSONUtil.writeString(val, 0, val.length, out);
- }
-
- public void writeNumber(CharArr digits) {
- out.write(digits);
- }
-
- public void writePartialNumber(CharArr digits) {
- out.write(digits);
- }
-
- public void startObject() {
- out.write('{');
- level++;
- }
-
- public void endObject() {
- out.write('}');
- level--;
- }
-
- public void startArray() {
- out.write('[');
- level++;
- }
-
- public void endArray() {
- out.write(']');
- level--;
- }
-
- public void writeValueSeparator() {
- out.write(',');
- }
-
- public void writeNameSeparator() {
- out.write(':');
- }
-
-}
-
diff --git a/solr/solrj/src/java/org/apache/noggit/ObjectBuilder.java b/solr/solrj/src/java/org/apache/noggit/ObjectBuilder.java
deleted file mode 100644
index 1909cd6d386..00000000000
--- a/solr/solrj/src/java/org/apache/noggit/ObjectBuilder.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * 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.noggit;
-
-import java.util.*;
-import java.io.IOException;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-/**
- */
-public class ObjectBuilder {
-
- public static Object fromJSON(String json) throws IOException {
- JSONParser p = new JSONParser(json);
- return getVal(p);
- }
-
- public static Object getVal(JSONParser parser) throws IOException {
- return new ObjectBuilder(parser).getVal();
- }
-
- final JSONParser parser;
-
- public ObjectBuilder(JSONParser parser) throws IOException {
- this.parser = parser;
- if (parser.lastEvent()==0) parser.nextEvent();
- }
-
-
- public Object getVal() throws IOException {
- int ev = parser.lastEvent();
- switch(ev) {
- case JSONParser.STRING: return getString();
- case JSONParser.LONG: return getLong();
- case JSONParser.NUMBER: return getNumber();
- case JSONParser.BIGNUMBER: return getBigNumber();
- case JSONParser.BOOLEAN: return getBoolean();
- case JSONParser.NULL: return getNull();
- case JSONParser.OBJECT_START: return getObject();
- case JSONParser.OBJECT_END: return null; // OR ERROR?
- case JSONParser.ARRAY_START: return getArray();
- case JSONParser.ARRAY_END: return null; // OR ERROR?
- case JSONParser.EOF: return null; // OR ERROR?
- default: return null; // OR ERROR?
- }
- }
-
-
- public Object getString() throws IOException {
- return parser.getString();
- }
-
- public Object getLong() throws IOException {
- return Long.valueOf(parser.getLong());
- }
-
- public Object getNumber() throws IOException {
- CharArr num = parser.getNumberChars();
- String numstr = num.toString();
- double d = Double.parseDouble(numstr);
- if (!Double.isInfinite(d)) return Double.valueOf(d);
- // TODO: use more efficient constructor in Java5
- return new BigDecimal(numstr);
- }
-
- public Object getBigNumber() throws IOException {
- CharArr num = parser.getNumberChars();
- String numstr = num.toString();
- for(int ch; (ch=num.read())!=-1;) {
- if (ch=='.' || ch=='e' || ch=='E') return new BigDecimal(numstr);
- }
- return new BigInteger(numstr);
- }
-
- public Object getBoolean() throws IOException {
- return parser.getBoolean();
- }
-
- public Object getNull() throws IOException {
- parser.getNull();
- return null;
- }
-
- public Object newObject() throws IOException {
- return new LinkedHashMap();
- }
-
- public Object getKey() throws IOException {
- return parser.getString();
- }
-
- public void addKeyVal(Object map, Object key, Object val) throws IOException {
- Object prev = ((Map)map).put(key,val);
- // TODO: test for repeated value?
- }
-
- public Object objectEnd(Object obj) {
- return obj;
- }
-
-
- public Object getObject() throws IOException {
- Object m = newObject();
- for(;;) {
- int ev = parser.nextEvent();
- if (ev==JSONParser.OBJECT_END) return objectEnd(m);
- Object key = getKey();
- ev = parser.nextEvent();
- Object val = getVal();
- addKeyVal(m, key, val);
- }
- }
-
- public Object newArray() {
- return new ArrayList();
- }
-
- public void addArrayVal(Object arr, Object val) throws IOException {
- ((List)arr).add(val);
- }
-
- public Object endArray(Object arr) {
- return arr;
- }
-
- public Object getArray() throws IOException {
- Object arr = newArray();
- for(;;) {
- int ev = parser.nextEvent();
- if (ev==JSONParser.ARRAY_END) return endArray(arr);
- Object val = getVal();
- addArrayVal(arr, val);
- }
- }
-
-}
diff --git a/solr/solrj/src/java/org/apache/noggit/package.html b/solr/solrj/src/java/org/apache/noggit/package.html
deleted file mode 100644
index 1aa8fc9c644..00000000000
--- a/solr/solrj/src/java/org/apache/noggit/package.html
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-JSON streaming parser and serializer.
-
-
diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterState.java b/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterState.java
index 867bab55868..523cf1f239c 100644
--- a/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterState.java
+++ b/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterState.java
@@ -26,7 +26,7 @@ import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
-import org.apache.noggit.JSONWriter;
+import org.noggit.JSONWriter;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.SolrException.ErrorCode;
import org.apache.zookeeper.KeeperException;
diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/DocCollection.java b/solr/solrj/src/java/org/apache/solr/common/cloud/DocCollection.java
index b07b56e2370..891990bec39 100644
--- a/solr/solrj/src/java/org/apache/solr/common/cloud/DocCollection.java
+++ b/solr/solrj/src/java/org/apache/solr/common/cloud/DocCollection.java
@@ -17,8 +17,8 @@ package org.apache.solr.common.cloud;
* limitations under the License.
*/
-import org.apache.noggit.JSONUtil;
-import org.apache.noggit.JSONWriter;
+import org.noggit.JSONUtil;
+import org.noggit.JSONWriter;
import java.util.Collection;
import java.util.Collections;
diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/DocRouter.java b/solr/solrj/src/java/org/apache/solr/common/cloud/DocRouter.java
index 85f301eb80f..220a76ed4a7 100644
--- a/solr/solrj/src/java/org/apache/solr/common/cloud/DocRouter.java
+++ b/solr/solrj/src/java/org/apache/solr/common/cloud/DocRouter.java
@@ -17,7 +17,7 @@ package org.apache.solr.common.cloud;
* limitations under the License.
*/
-import org.apache.noggit.JSONWriter;
+import org.noggit.JSONWriter;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.common.params.SolrParams;
diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/Replica.java b/solr/solrj/src/java/org/apache/solr/common/cloud/Replica.java
index 45c7c634060..ecd4837d7b2 100644
--- a/solr/solrj/src/java/org/apache/solr/common/cloud/Replica.java
+++ b/solr/solrj/src/java/org/apache/solr/common/cloud/Replica.java
@@ -17,7 +17,7 @@ package org.apache.solr.common.cloud;
* limitations under the License.
*/
-import org.apache.noggit.JSONUtil;
+import org.noggit.JSONUtil;
import java.util.Map;
diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/Slice.java b/solr/solrj/src/java/org/apache/solr/common/cloud/Slice.java
index 9803f7053d8..7bd910ae2a1 100644
--- a/solr/solrj/src/java/org/apache/solr/common/cloud/Slice.java
+++ b/solr/solrj/src/java/org/apache/solr/common/cloud/Slice.java
@@ -17,8 +17,8 @@ package org.apache.solr.common.cloud;
* limitations under the License.
*/
-import org.apache.noggit.JSONUtil;
-import org.apache.noggit.JSONWriter;
+import org.noggit.JSONUtil;
+import org.noggit.JSONWriter;
import java.util.Collection;
import java.util.HashMap;
diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/ZkNodeProps.java b/solr/solrj/src/java/org/apache/solr/common/cloud/ZkNodeProps.java
index 856ed0283f1..f67fb476b1e 100644
--- a/solr/solrj/src/java/org/apache/solr/common/cloud/ZkNodeProps.java
+++ b/solr/solrj/src/java/org/apache/solr/common/cloud/ZkNodeProps.java
@@ -17,8 +17,8 @@ package org.apache.solr.common.cloud;
* limitations under the License.
*/
-import org.apache.noggit.JSONUtil;
-import org.apache.noggit.JSONWriter;
+import org.noggit.JSONUtil;
+import org.noggit.JSONWriter;
import java.util.Collections;
import java.util.HashMap;
diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java b/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java
index 371f6114ef5..b5682c5dc47 100644
--- a/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java
+++ b/solr/solrj/src/java/org/apache/solr/common/cloud/ZkStateReader.java
@@ -31,10 +31,10 @@ import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
-import org.apache.noggit.CharArr;
-import org.apache.noggit.JSONParser;
-import org.apache.noggit.JSONWriter;
-import org.apache.noggit.ObjectBuilder;
+import org.noggit.CharArr;
+import org.noggit.JSONParser;
+import org.noggit.JSONWriter;
+import org.noggit.ObjectBuilder;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.SolrException.ErrorCode;
import org.apache.solr.common.util.ByteUtils;
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/ByteUtils.java b/solr/solrj/src/java/org/apache/solr/common/util/ByteUtils.java
index 83f34431a9f..9ce607ea500 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/ByteUtils.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/ByteUtils.java
@@ -17,7 +17,7 @@
package org.apache.solr.common.util;
-import org.apache.noggit.CharArr;
+import org.noggit.CharArr;
public class ByteUtils {
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/JavaBinCodec.java b/solr/solrj/src/java/org/apache/solr/common/util/JavaBinCodec.java
index b8a8c698ac3..807523f7a20 100755
--- a/solr/solrj/src/java/org/apache/solr/common/util/JavaBinCodec.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/JavaBinCodec.java
@@ -16,7 +16,7 @@
*/
package org.apache.solr.common.util;
-import org.apache.noggit.CharArr;
+import org.noggit.CharArr;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
diff --git a/solr/test-framework/src/java/org/apache/solr/JSONTestUtil.java b/solr/test-framework/src/java/org/apache/solr/JSONTestUtil.java
index df02010c5c4..2df61b4de6c 100644
--- a/solr/test-framework/src/java/org/apache/solr/JSONTestUtil.java
+++ b/solr/test-framework/src/java/org/apache/solr/JSONTestUtil.java
@@ -17,7 +17,7 @@
package org.apache.solr;
-import org.apache.noggit.ObjectBuilder;
+import org.noggit.ObjectBuilder;
import org.apache.solr.common.util.StrUtils;
import java.util.*;
diff --git a/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java b/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
index 897396768a0..c02c2d27f11 100755
--- a/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
+++ b/solr/test-framework/src/java/org/apache/solr/SolrTestCaseJ4.java
@@ -26,7 +26,6 @@ import javax.xml.xpath.XPathExpressionException;
import org.apache.lucene.util.Constants;
import org.apache.lucene.util.LuceneTestCase;
import org.apache.lucene.util.QuickPatchThreadsFilter;
-import org.apache.noggit.*;
import org.apache.solr.client.solrj.util.ClientUtils;
import org.apache.solr.common.*;
import org.apache.solr.common.cloud.SolrZkClient;
@@ -47,6 +46,9 @@ import org.apache.solr.util.TestHarness;
import org.junit.*;
import org.junit.rules.RuleChain;
import org.junit.rules.TestRule;
+import org.noggit.CharArr;
+import org.noggit.JSONUtil;
+import org.noggit.ObjectBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.SAXException;