Browse Source

Integrate from google internal.

Java files are moved to un-do the hack in the prevous commit, which
moved the java files to the original position for integration.
Jisi Liu 9 years ago
parent
commit
5221dcbe47
100 changed files with 460 additions and 150 deletions
  1. 1 3
      Makefile.am
  2. 1 0
      cmake/libprotoc.cmake
  3. 19 20
      generate_descriptor_proto.sh
  4. 0 0
      java/core/src/main/java/com/google/protobuf/AbstractMessage.java
  5. 0 0
      java/core/src/main/java/com/google/protobuf/AbstractMessageLite.java
  6. 0 0
      java/core/src/main/java/com/google/protobuf/AbstractParser.java
  7. 0 0
      java/core/src/main/java/com/google/protobuf/AbstractProtobufList.java
  8. 0 0
      java/core/src/main/java/com/google/protobuf/BlockingRpcChannel.java
  9. 0 0
      java/core/src/main/java/com/google/protobuf/BlockingService.java
  10. 0 0
      java/core/src/main/java/com/google/protobuf/BooleanArrayList.java
  11. 334 30
      java/core/src/main/java/com/google/protobuf/ByteString.java
  12. 13 39
      java/core/src/main/java/com/google/protobuf/CodedInputStream.java
  13. 0 0
      java/core/src/main/java/com/google/protobuf/CodedOutputStream.java
  14. 0 0
      java/core/src/main/java/com/google/protobuf/Descriptors.java
  15. 0 0
      java/core/src/main/java/com/google/protobuf/DoubleArrayList.java
  16. 0 0
      java/core/src/main/java/com/google/protobuf/DynamicMessage.java
  17. 36 0
      java/core/src/main/java/com/google/protobuf/ExperimentalApi.java
  18. 0 0
      java/core/src/main/java/com/google/protobuf/Extension.java
  19. 0 0
      java/core/src/main/java/com/google/protobuf/ExtensionLite.java
  20. 0 0
      java/core/src/main/java/com/google/protobuf/ExtensionRegistry.java
  21. 0 0
      java/core/src/main/java/com/google/protobuf/ExtensionRegistryLite.java
  22. 0 0
      java/core/src/main/java/com/google/protobuf/FieldSet.java
  23. 0 0
      java/core/src/main/java/com/google/protobuf/FloatArrayList.java
  24. 0 0
      java/core/src/main/java/com/google/protobuf/GeneratedMessage.java
  25. 0 0
      java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java
  26. 0 0
      java/core/src/main/java/com/google/protobuf/IntArrayList.java
  27. 26 34
      java/core/src/main/java/com/google/protobuf/Internal.java
  28. 0 0
      java/core/src/main/java/com/google/protobuf/InvalidProtocolBufferException.java
  29. 0 0
      java/core/src/main/java/com/google/protobuf/LazyField.java
  30. 0 0
      java/core/src/main/java/com/google/protobuf/LazyFieldLite.java
  31. 0 0
      java/core/src/main/java/com/google/protobuf/LazyStringArrayList.java
  32. 0 0
      java/core/src/main/java/com/google/protobuf/LazyStringList.java
  33. 0 0
      java/core/src/main/java/com/google/protobuf/LongArrayList.java
  34. 0 0
      java/core/src/main/java/com/google/protobuf/MapEntry.java
  35. 0 0
      java/core/src/main/java/com/google/protobuf/MapEntryLite.java
  36. 0 0
      java/core/src/main/java/com/google/protobuf/MapField.java
  37. 1 1
      java/core/src/main/java/com/google/protobuf/MapFieldLite.java
  38. 0 0
      java/core/src/main/java/com/google/protobuf/Message.java
  39. 0 0
      java/core/src/main/java/com/google/protobuf/MessageLite.java
  40. 0 0
      java/core/src/main/java/com/google/protobuf/MessageLiteOrBuilder.java
  41. 0 0
      java/core/src/main/java/com/google/protobuf/MessageLiteToString.java
  42. 0 0
      java/core/src/main/java/com/google/protobuf/MessageOrBuilder.java
  43. 0 0
      java/core/src/main/java/com/google/protobuf/MessageReflection.java
  44. 0 0
      java/core/src/main/java/com/google/protobuf/MutabilityOracle.java
  45. 0 0
      java/core/src/main/java/com/google/protobuf/NioByteString.java
  46. 0 0
      java/core/src/main/java/com/google/protobuf/Parser.java
  47. 0 0
      java/core/src/main/java/com/google/protobuf/ProtobufArrayList.java
  48. 0 0
      java/core/src/main/java/com/google/protobuf/ProtocolMessageEnum.java
  49. 0 0
      java/core/src/main/java/com/google/protobuf/ProtocolStringList.java
  50. 0 0
      java/core/src/main/java/com/google/protobuf/RepeatedFieldBuilder.java
  51. 3 3
      java/core/src/main/java/com/google/protobuf/RopeByteString.java
  52. 0 0
      java/core/src/main/java/com/google/protobuf/RpcCallback.java
  53. 0 0
      java/core/src/main/java/com/google/protobuf/RpcChannel.java
  54. 0 0
      java/core/src/main/java/com/google/protobuf/RpcController.java
  55. 0 0
      java/core/src/main/java/com/google/protobuf/RpcUtil.java
  56. 0 0
      java/core/src/main/java/com/google/protobuf/Service.java
  57. 0 0
      java/core/src/main/java/com/google/protobuf/ServiceException.java
  58. 0 0
      java/core/src/main/java/com/google/protobuf/SingleFieldBuilder.java
  59. 0 0
      java/core/src/main/java/com/google/protobuf/SmallSortedMap.java
  60. 0 0
      java/core/src/main/java/com/google/protobuf/TextFormat.java
  61. 0 0
      java/core/src/main/java/com/google/protobuf/TextFormatEscaper.java
  62. 0 0
      java/core/src/main/java/com/google/protobuf/UninitializedMessageException.java
  63. 0 0
      java/core/src/main/java/com/google/protobuf/UnknownFieldSet.java
  64. 0 0
      java/core/src/main/java/com/google/protobuf/UnknownFieldSetLite.java
  65. 0 0
      java/core/src/main/java/com/google/protobuf/UnmodifiableLazyStringList.java
  66. 12 4
      java/core/src/main/java/com/google/protobuf/UnsafeByteOperations.java
  67. 0 0
      java/core/src/main/java/com/google/protobuf/Utf8.java
  68. 0 0
      java/core/src/main/java/com/google/protobuf/WireFormat.java
  69. 0 0
      java/core/src/test/java/com/google/protobuf/AbstractMessageTest.java
  70. 0 0
      java/core/src/test/java/com/google/protobuf/AnyTest.java
  71. 0 0
      java/core/src/test/java/com/google/protobuf/BooleanArrayListTest.java
  72. 2 2
      java/core/src/test/java/com/google/protobuf/BoundedByteStringTest.java
  73. 4 4
      java/core/src/test/java/com/google/protobuf/ByteStringTest.java
  74. 0 0
      java/core/src/test/java/com/google/protobuf/CheckUtf8Test.java
  75. 0 0
      java/core/src/test/java/com/google/protobuf/CodedInputStreamTest.java
  76. 0 0
      java/core/src/test/java/com/google/protobuf/CodedOutputStreamTest.java
  77. 0 0
      java/core/src/test/java/com/google/protobuf/DeprecatedFieldTest.java
  78. 0 0
      java/core/src/test/java/com/google/protobuf/DescriptorsTest.java
  79. 0 0
      java/core/src/test/java/com/google/protobuf/DoubleArrayListTest.java
  80. 0 0
      java/core/src/test/java/com/google/protobuf/DynamicMessageTest.java
  81. 0 0
      java/core/src/test/java/com/google/protobuf/FieldPresenceTest.java
  82. 0 0
      java/core/src/test/java/com/google/protobuf/FloatArrayListTest.java
  83. 0 0
      java/core/src/test/java/com/google/protobuf/ForceFieldBuildersPreRun.java
  84. 0 0
      java/core/src/test/java/com/google/protobuf/GeneratedMessageTest.java
  85. 0 0
      java/core/src/test/java/com/google/protobuf/IntArrayListTest.java
  86. 0 0
      java/core/src/test/java/com/google/protobuf/IsValidUtf8Test.java
  87. 0 0
      java/core/src/test/java/com/google/protobuf/IsValidUtf8TestUtil.java
  88. 0 0
      java/core/src/test/java/com/google/protobuf/LazyFieldLiteTest.java
  89. 0 0
      java/core/src/test/java/com/google/protobuf/LazyFieldTest.java
  90. 0 0
      java/core/src/test/java/com/google/protobuf/LazyMessageLiteTest.java
  91. 0 0
      java/core/src/test/java/com/google/protobuf/LazyStringArrayListTest.java
  92. 0 0
      java/core/src/test/java/com/google/protobuf/LazyStringEndToEndTest.java
  93. 0 0
      java/core/src/test/java/com/google/protobuf/LiteEqualsAndHashTest.java
  94. 0 0
      java/core/src/test/java/com/google/protobuf/LiteTest.java
  95. 8 10
      java/core/src/test/java/com/google/protobuf/LiteralByteStringTest.java
  96. 0 0
      java/core/src/test/java/com/google/protobuf/LongArrayListTest.java
  97. 0 0
      java/core/src/test/java/com/google/protobuf/MapForProto2LiteTest.java
  98. 0 0
      java/core/src/test/java/com/google/protobuf/MapForProto2Test.java
  99. 0 0
      java/core/src/test/java/com/google/protobuf/MapTest.java
  100. 0 0
      java/core/src/test/java/com/google/protobuf/MessageTest.java

+ 1 - 3
Makefile.am

@@ -193,7 +193,6 @@ java_EXTRA_DIST=
   java/core/src/main/java/com/google/protobuf/BlockingRpcChannel.java              \
   java/core/src/main/java/com/google/protobuf/BlockingService.java                 \
   java/core/src/main/java/com/google/protobuf/BooleanArrayList.java                \
-  java/core/src/main/java/com/google/protobuf/BoundedByteString.java               \
   java/core/src/main/java/com/google/protobuf/ByteString.java                      \
   java/core/src/main/java/com/google/protobuf/CodedInputStream.java                \
   java/core/src/main/java/com/google/protobuf/CodedOutputStream.java               \
@@ -215,7 +214,6 @@ java_EXTRA_DIST=
   java/core/src/main/java/com/google/protobuf/LazyFieldLite.java                   \
   java/core/src/main/java/com/google/protobuf/LazyStringArrayList.java             \
   java/core/src/main/java/com/google/protobuf/LazyStringList.java                  \
-  java/core/src/main/java/com/google/protobuf/LiteralByteString.java               \
   java/core/src/main/java/com/google/protobuf/LongArrayList.java                   \
   java/core/src/main/java/com/google/protobuf/MapEntry.java                        \
   java/core/src/main/java/com/google/protobuf/MapEntryLite.java                    \
@@ -249,7 +247,7 @@ java_EXTRA_DIST=
   java/core/src/main/java/com/google/protobuf/UnknownFieldSet.java                 \
   java/core/src/main/java/com/google/protobuf/UnknownFieldSetLite.java             \
   java/core/src/main/java/com/google/protobuf/UnmodifiableLazyStringList.java      \
-  java/core/src/main/java/com/google/protobuf/UnsafeByteStrings.java               \
+  java/core/src/main/java/com/google/protobuf/UnsafeByteOperations.java            \
   java/core/src/main/java/com/google/protobuf/Utf8.java                            \
   java/core/src/main/java/com/google/protobuf/WireFormat.java                      \
   java/core/src/test/java/com/google/protobuf/AbstractMessageTest.java             \

+ 1 - 0
cmake/libprotoc.cmake

@@ -37,6 +37,7 @@ set(libprotoc_files
   ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_enum_field_lite.cc
   ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_enum_lite.cc
   ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_extension.cc
+  ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_extension_lite.cc
   ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_field.cc
   ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_file.cc
   ${protobuf_source_dir}/src/google/protobuf/compiler/java/java_generator.cc

+ 19 - 20
generate_descriptor_proto.sh

@@ -10,6 +10,8 @@
 #   to make when building protoc.  This is particularly useful for passing
 #   -j4 to run 4 jobs simultaneously.
 
+set -e
+
 if test ! -e src/google/protobuf/stubs/common.h; then
   cat >&2 << __EOF__
 Could not find source code.  Make sure you are running this script from the
@@ -43,51 +45,48 @@ declare -a RUNTIME_PROTO_FILES=(\
 
 CORE_PROTO_IS_CORRECT=0
 PROCESS_ROUND=1
+TMP=$(mktemp -d)
 echo "Updating descriptor protos..."
 while [ $CORE_PROTO_IS_CORRECT -ne 1 ]
 do
   echo "Round $PROCESS_ROUND"
   CORE_PROTO_IS_CORRECT=1
-  for PROTO_FILE in ${RUNTIME_PROTO_FILES[@]}; do
-    BASE_NAME=${PROTO_FILE%.*}
-    cp ${BASE_NAME}.pb.h ${BASE_NAME}.pb.h.tmp
-    cp ${BASE_NAME}.pb.cc ${BASE_NAME}.pb.cc.tmp
-  done
-  cp google/protobuf/compiler/plugin.pb.h google/protobuf/compiler/plugin.pb.h.tmp
-  cp google/protobuf/compiler/plugin.pb.cc google/protobuf/compiler/plugin.pb.cc.tmp
 
   make $@ protoc &&
-    ./protoc --cpp_out=dllexport_decl=LIBPROTOBUF_EXPORT:. ${RUNTIME_PROTO_FILES[@]} && \
-    ./protoc --cpp_out=dllexport_decl=LIBPROTOC_EXPORT:. google/protobuf/compiler/plugin.proto
+    ./protoc --cpp_out=dllexport_decl=LIBPROTOBUF_EXPORT:$TMP ${RUNTIME_PROTO_FILES[@]} && \
+    ./protoc --cpp_out=dllexport_decl=LIBPROTOC_EXPORT:$TMP google/protobuf/compiler/plugin.proto
 
   for PROTO_FILE in ${RUNTIME_PROTO_FILES[@]}; do
     BASE_NAME=${PROTO_FILE%.*}
-    diff ${BASE_NAME}.pb.h ${BASE_NAME}.pb.h.tmp > /dev/null
+    diff ${BASE_NAME}.pb.h $TMP/${BASE_NAME}.pb.h > /dev/null
     if test $? -ne 0; then
       CORE_PROTO_IS_CORRECT=0
     fi
-    diff ${BASE_NAME}.pb.cc ${BASE_NAME}.pb.cc.tmp > /dev/null
+    diff ${BASE_NAME}.pb.cc $TMP/${BASE_NAME}.pb.cc > /dev/null
     if test $? -ne 0; then
       CORE_PROTO_IS_CORRECT=0
     fi
   done
 
-  diff google/protobuf/compiler/plugin.pb.h google/protobuf/compiler/plugin.pb.h.tmp > /dev/null
+  diff google/protobuf/compiler/plugin.pb.h $TMP/google/protobuf/compiler/plugin.pb.h > /dev/null
   if test $? -ne 0; then
     CORE_PROTO_IS_CORRECT=0
   fi
-  diff google/protobuf/compiler/plugin.pb.cc google/protobuf/compiler/plugin.pb.cc.tmp > /dev/null
+  diff google/protobuf/compiler/plugin.pb.cc $TMP/google/protobuf/compiler/plugin.pb.cc > /dev/null
   if test $? -ne 0; then
     CORE_PROTO_IS_CORRECT=0
   fi
 
-  for PROTO_FILE in ${RUNTIME_PROTO_FILES[@]}; do
-    BASE_NAME=${PROTO_FILE%.*}
-    rm ${BASE_NAME}.pb.h.tmp
-    rm ${BASE_NAME}.pb.cc.tmp
-  done
-  rm google/protobuf/compiler/plugin.pb.h.tmp
-  rm google/protobuf/compiler/plugin.pb.cc.tmp
+  # Only override the output if the files are different to avoid re-compilation
+  # of the protoc.
+  if [ $CORE_PROTO_IS_CORRECT -ne 1 ]; then
+    for PROTO_FILE in ${RUNTIME_PROTO_FILES[@]}; do
+      BASE_NAME=${PROTO_FILE%.*}
+      mv $TMP/${BASE_NAME}.pb.h ${BASE_NAME}.pb.h
+      mv $TMP/${BASE_NAME}.pb.cc ${BASE_NAME}.pb.cc
+    done
+    mv $TMP/google/protobuf/compiler/plugin.pb.* google/protobuf/compiler/
+  fi
 
   PROCESS_ROUND=$((PROCESS_ROUND + 1))
 done

+ 0 - 0
java/src/main/java/com/google/protobuf/AbstractMessage.java → java/core/src/main/java/com/google/protobuf/AbstractMessage.java


+ 0 - 0
java/src/main/java/com/google/protobuf/AbstractMessageLite.java → java/core/src/main/java/com/google/protobuf/AbstractMessageLite.java


+ 0 - 0
java/src/main/java/com/google/protobuf/AbstractParser.java → java/core/src/main/java/com/google/protobuf/AbstractParser.java


+ 0 - 0
java/src/main/java/com/google/protobuf/AbstractProtobufList.java → java/core/src/main/java/com/google/protobuf/AbstractProtobufList.java


+ 0 - 0
java/src/main/java/com/google/protobuf/BlockingRpcChannel.java → java/core/src/main/java/com/google/protobuf/BlockingRpcChannel.java


+ 0 - 0
java/src/main/java/com/google/protobuf/BlockingService.java → java/core/src/main/java/com/google/protobuf/BlockingService.java


+ 0 - 0
java/src/main/java/com/google/protobuf/BooleanArrayList.java → java/core/src/main/java/com/google/protobuf/BooleanArrayList.java


+ 334 - 30
java/src/main/java/com/google/protobuf/ByteString.java → java/core/src/main/java/com/google/protobuf/ByteString.java

@@ -1,38 +1,13 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//     * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+// Copyright 2007 Google Inc.  All rights reserved.
 
 package com.google.protobuf;
 
+import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.InvalidObjectException;
+import java.io.ObjectInputStream;
 import java.io.OutputStream;
 import java.io.Serializable;
 import java.io.UnsupportedEncodingException;
@@ -41,6 +16,7 @@ import java.nio.charset.Charset;
 import java.nio.charset.UnsupportedCharsetException;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.NoSuchElementException;
@@ -81,7 +57,7 @@ public abstract class ByteString implements Iterable<Byte>, Serializable {
   /**
    * Empty {@code ByteString}.
    */
-  public static final ByteString EMPTY = new LiteralByteString(new byte[0]);
+  public static final ByteString EMPTY = new LiteralByteString(Internal.EMPTY_BYTE_ARRAY);
 
   /**
    * Cached hash value. Intentionally accessed via a data race, which
@@ -258,6 +234,24 @@ public abstract class ByteString implements Iterable<Byte>, Serializable {
   public static ByteString copyFrom(byte[] bytes) {
     return copyFrom(bytes, 0, bytes.length);
   }
+  
+  /**
+   * Wraps the given bytes into a {@code ByteString}. Intended for internal only
+   * usage to force a classload of ByteString before LiteralByteString.
+   */
+  static ByteString wrap(byte[] bytes) {
+    // TODO(dweis): Return EMPTY when bytes are empty to reduce allocations?
+    return new LiteralByteString(bytes);
+  }
+
+  /**
+   * Wraps the given bytes into a {@code ByteString}. Intended for internal only
+   * usage to force a classload of ByteString before BoundedByteString and
+   * LiteralByteString.
+   */
+  static ByteString wrap(byte[] bytes, int offset, int length) {
+    return new BoundedByteString(bytes, offset, length);
+  }
 
   /**
    * Copies the next {@code size} bytes from a {@code java.nio.ByteBuffer} into
@@ -1149,4 +1143,314 @@ public abstract class ByteString implements Iterable<Byte>, Serializable {
     return String.format("<ByteString@%s size=%d>",
         Integer.toHexString(System.identityHashCode(this)), size());
   }
+  
+  /**
+   * This class implements a {@link com.google.protobuf.ByteString} backed by a
+   * single array of bytes, contiguous in memory. It supports substring by
+   * pointing to only a sub-range of the underlying byte array, meaning that a
+   * substring will reference the full byte-array of the string it's made from,
+   * exactly as with {@link String}.
+   *
+   * @author carlanton@google.com (Carl Haverl)
+   */
+  // Keep this class private to avoid deadlocks in classloading across threads as ByteString's
+  // static initializer loads LiteralByteString and another thread loads LiteralByteString.
+  private static class LiteralByteString extends ByteString.LeafByteString {
+    private static final long serialVersionUID = 1L;
+
+    protected final byte[] bytes;
+
+    /**
+     * Creates a {@code LiteralByteString} backed by the given array, without
+     * copying.
+     *
+     * @param bytes array to wrap
+     */
+    LiteralByteString(byte[] bytes) {
+      this.bytes = bytes;
+    }
+
+    @Override
+    public byte byteAt(int index) {
+      // Unlike most methods in this class, this one is a direct implementation
+      // ignoring the potential offset because we need to do range-checking in the
+      // substring case anyway.
+      return bytes[index];
+    }
+
+    @Override
+    public int size() {
+      return bytes.length;
+    }
+
+    // =================================================================
+    // ByteString -> substring
+
+    @Override
+    public final ByteString substring(int beginIndex, int endIndex) {
+      final int length = checkRange(beginIndex, endIndex, size());
+
+      if (length == 0) {
+        return ByteString.EMPTY;
+      }
+
+      return new BoundedByteString(bytes, getOffsetIntoBytes() + beginIndex, length);
+    }
+
+    // =================================================================
+    // ByteString -> byte[]
+
+    @Override
+    protected void copyToInternal(
+        byte[] target, int sourceOffset, int targetOffset, int numberToCopy) {
+      // Optimized form, not for subclasses, since we don't call
+      // getOffsetIntoBytes() or check the 'numberToCopy' parameter.
+      // TODO(nathanmittler): Is not calling getOffsetIntoBytes really saving that much?
+      System.arraycopy(bytes, sourceOffset, target, targetOffset, numberToCopy);
+    }
+
+    @Override
+    public final void copyTo(ByteBuffer target) {
+      target.put(bytes, getOffsetIntoBytes(), size()); // Copies bytes
+    }
+
+    @Override
+    public final ByteBuffer asReadOnlyByteBuffer() {
+      return ByteBuffer.wrap(bytes, getOffsetIntoBytes(), size()).asReadOnlyBuffer();
+    }
+
+    @Override
+    public final List<ByteBuffer> asReadOnlyByteBufferList() {
+      return Collections.singletonList(asReadOnlyByteBuffer());
+    }
+
+    @Override
+    public final void writeTo(OutputStream outputStream) throws IOException {
+      outputStream.write(toByteArray());
+    }
+
+    @Override
+    final void writeToInternal(OutputStream outputStream, int sourceOffset, int numberToWrite)
+        throws IOException {
+      outputStream.write(bytes, getOffsetIntoBytes() + sourceOffset, numberToWrite);
+    }
+
+    @Override
+    protected final String toStringInternal(Charset charset) {
+      return new String(bytes, getOffsetIntoBytes(), size(), charset);
+    }
+
+    // =================================================================
+    // UTF-8 decoding
+
+    @Override
+    public final boolean isValidUtf8() {
+      int offset = getOffsetIntoBytes();
+      return Utf8.isValidUtf8(bytes, offset, offset + size());
+    }
+
+    @Override
+    protected final int partialIsValidUtf8(int state, int offset, int length) {
+      int index = getOffsetIntoBytes() + offset;
+      return Utf8.partialIsValidUtf8(state, bytes, index, index + length);
+    }
+
+    // =================================================================
+    // equals() and hashCode()
+
+    @Override
+    public final boolean equals(Object other) {
+      if (other == this) {
+        return true;
+      }
+      if (!(other instanceof ByteString)) {
+        return false;
+      }
+
+      if (size() != ((ByteString) other).size()) {
+        return false;
+      }
+      if (size() == 0) {
+        return true;
+      }
+
+      if (other instanceof LiteralByteString) {
+        LiteralByteString otherAsLiteral = (LiteralByteString) other;
+        // If we know the hash codes and they are not equal, we know the byte
+        // strings are not equal.
+        int thisHash = peekCachedHashCode();
+        int thatHash = otherAsLiteral.peekCachedHashCode();
+        if (thisHash != 0 && thatHash != 0 && thisHash != thatHash) {
+          return false;
+        }
+
+        return equalsRange((LiteralByteString) other, 0, size());
+      } else {
+        // RopeByteString and NioByteString.
+        return other.equals(this);
+      }
+    }
+
+    /**
+     * Check equality of the substring of given length of this object starting at
+     * zero with another {@code LiteralByteString} substring starting at offset.
+     *
+     * @param other  what to compare a substring in
+     * @param offset offset into other
+     * @param length number of bytes to compare
+     * @return true for equality of substrings, else false.
+     */
+    @Override
+    final boolean equalsRange(ByteString other, int offset, int length) {
+      if (length > other.size()) {
+        throw new IllegalArgumentException("Length too large: " + length + size());
+      }
+      if (offset + length > other.size()) {
+        throw new IllegalArgumentException(
+            "Ran off end of other: " + offset + ", " + length + ", " + other.size());
+      }
+
+      if (other instanceof LiteralByteString) {
+        LiteralByteString lbsOther = (LiteralByteString) other;
+        byte[] thisBytes = bytes;
+        byte[] otherBytes = lbsOther.bytes;
+        int thisLimit = getOffsetIntoBytes() + length;
+        for (
+            int thisIndex = getOffsetIntoBytes(),
+                otherIndex = lbsOther.getOffsetIntoBytes() + offset;
+            (thisIndex < thisLimit); ++thisIndex, ++otherIndex) {
+          if (thisBytes[thisIndex] != otherBytes[otherIndex]) {
+            return false;
+          }
+        }
+        return true;
+      }
+
+      return other.substring(offset, offset + length).equals(substring(0, length));
+    }
+
+    @Override
+    protected final int partialHash(int h, int offset, int length) {
+      return Internal.partialHash(h, bytes, getOffsetIntoBytes() + offset, length);
+    }
+
+    // =================================================================
+    // Input stream
+
+    @Override
+    public final InputStream newInput() {
+      return new ByteArrayInputStream(bytes, getOffsetIntoBytes(), size()); // No copy
+    }
+
+    @Override
+    public final CodedInputStream newCodedInput() {
+      // We trust CodedInputStream not to modify the bytes, or to give anyone
+      // else access to them.
+      return CodedInputStream.newInstance(
+          bytes, getOffsetIntoBytes(), size(), true /* bufferIsImmutable */);
+    }
+
+    // =================================================================
+    // Internal methods
+
+    /**
+     * Offset into {@code bytes[]} to use, non-zero for substrings.
+     *
+     * @return always 0 for this class
+     */
+    protected int getOffsetIntoBytes() {
+      return 0;
+    }
+  }
+  
+  /**
+   * This class is used to represent the substring of a {@link ByteString} over a
+   * single byte array. In terms of the public API of {@link ByteString}, you end
+   * up here by calling {@link ByteString#copyFrom(byte[])} followed by {@link
+   * ByteString#substring(int, int)}.
+   *
+   * <p>This class contains most of the overhead involved in creating a substring
+   * from a {@link LiteralByteString}.  The overhead involves some range-checking
+   * and two extra fields.
+   *
+   * @author carlanton@google.com (Carl Haverl)
+   */
+  // Keep this class private to avoid deadlocks in classloading across threads as ByteString's
+  // static initializer loads LiteralByteString and another thread loads BoundedByteString.
+  private static final class BoundedByteString extends LiteralByteString {
+
+    private final int bytesOffset;
+    private final int bytesLength;
+
+    /**
+     * Creates a {@code BoundedByteString} backed by the sub-range of given array,
+     * without copying.
+     *
+     * @param bytes  array to wrap
+     * @param offset index to first byte to use in bytes
+     * @param length number of bytes to use from bytes
+     * @throws IllegalArgumentException if {@code offset < 0}, {@code length < 0},
+     *                                  or if {@code offset + length >
+     *                                  bytes.length}.
+     */
+    BoundedByteString(byte[] bytes, int offset, int length) {
+      super(bytes);
+      checkRange(offset, offset + length, bytes.length);
+
+      this.bytesOffset = offset;
+      this.bytesLength = length;
+    }
+
+    /**
+     * Gets the byte at the given index.
+     * Throws {@link ArrayIndexOutOfBoundsException}
+     * for backwards-compatibility reasons although it would more properly be
+     * {@link IndexOutOfBoundsException}.
+     *
+     * @param index index of byte
+     * @return the value
+     * @throws ArrayIndexOutOfBoundsException {@code index} is < 0 or >= size
+     */
+    @Override
+    public byte byteAt(int index) {
+      // We must check the index ourselves as we cannot rely on Java array index
+      // checking for substrings.
+      checkIndex(index, size());
+      return bytes[bytesOffset + index];
+    }
+
+    @Override
+    public int size() {
+      return bytesLength;
+    }
+
+    @Override
+    protected int getOffsetIntoBytes() {
+      return bytesOffset;
+    }
+
+    // =================================================================
+    // ByteString -> byte[]
+
+    @Override
+    protected void copyToInternal(byte[] target, int sourceOffset, int targetOffset,
+        int numberToCopy) {
+      System.arraycopy(bytes, getOffsetIntoBytes() + sourceOffset, target,
+          targetOffset, numberToCopy);
+    }
+
+    // =================================================================
+    // Serializable
+
+    private static final long serialVersionUID = 1L;
+
+    Object writeReplace() {
+      return ByteString.wrap(toByteArray());
+    }
+
+    private void readObject(@SuppressWarnings("unused") ObjectInputStream in) throws IOException {
+      throw new InvalidObjectException(
+          "BoundedByteStream instances are not to be serialized directly");
+    }
+  }
 }

+ 13 - 39
java/src/main/java/com/google/protobuf/CodedInputStream.java → java/core/src/main/java/com/google/protobuf/CodedInputStream.java

@@ -70,7 +70,15 @@ public final class CodedInputStream {
    */
   public static CodedInputStream newInstance(final byte[] buf, final int off,
                                              final int len) {
-    CodedInputStream result = new CodedInputStream(buf, off, len);
+    return newInstance(buf, off, len, false);
+  }
+
+  /**
+   * Create a new CodedInputStream wrapping the given byte array slice.
+   */
+  public static CodedInputStream newInstance(final byte[] buf, final int off,
+                                             final int len, boolean bufferIsImmutable) {
+    CodedInputStream result = new CodedInputStream(buf, off, len, bufferIsImmutable);
     try {
       // Some uses of CodedInputStream can be more efficient if they know
       // exactly how many bytes are available.  By pushing the end point of the
@@ -113,31 +121,6 @@ public final class CodedInputStream {
     }
   }
 
-  /**
-   * Create a new CodedInputStream wrapping a LiteralByteString.
-   */
-  static CodedInputStream newInstance(LiteralByteString byteString) {
-    CodedInputStream result = new CodedInputStream(byteString);
-    try {
-      // Some uses of CodedInputStream can be more efficient if they know
-      // exactly how many bytes are available.  By pushing the end point of the
-      // buffer as a limit, we allow them to get this information via
-      // getBytesUntilLimit().  Pushing a limit that we know is at the end of
-      // the stream can never hurt, since we can never past that point anyway.
-      result.pushLimit(byteString.size());
-    } catch (InvalidProtocolBufferException ex) {
-      // The only reason pushLimit() might throw an exception here is if len
-      // is negative. Normally pushLimit()'s parameter comes directly off the
-      // wire, so it's important to catch exceptions in case of corrupt or
-      // malicious data. However, in this case, we expect that len is not a
-      // user-supplied value, so we can assume that it being negative indicates
-      // a programming error. Therefore, throwing an unchecked exception is
-      // appropriate.
-      throw new IllegalArgumentException(ex);
-    }
-    return result;
-  }
-
   // -----------------------------------------------------------------
 
   /**
@@ -506,7 +489,7 @@ public final class CodedInputStream {
       // Fast path:  We already have the bytes in a contiguous buffer, so
       //   just copy directly from it.
       final ByteString result = bufferIsImmutable && enableAliasing
-          ? new BoundedByteString(buffer, bufferPos, size)
+          ? ByteString.wrap(buffer, bufferPos, size)
           : ByteString.copyFrom(buffer, bufferPos, size);
       bufferPos += size;
       return result;
@@ -514,7 +497,7 @@ public final class CodedInputStream {
       return ByteString.EMPTY;
     } else {
       // Slow path:  Build a byte array first then copy it.
-      return new LiteralByteString(readRawBytesSlowPath(size));
+      return ByteString.wrap(readRawBytesSlowPath(size));
     }
   }
 
@@ -886,13 +869,13 @@ public final class CodedInputStream {
   private static final int DEFAULT_SIZE_LIMIT = 64 << 20;  // 64MB
   private static final int BUFFER_SIZE = 4096;
 
-  private CodedInputStream(final byte[] buffer, final int off, final int len) {
+  private CodedInputStream(final byte[] buffer, final int off, final int len, boolean bufferIsImmutable) {
     this.buffer = buffer;
     bufferSize = off + len;
     bufferPos = off;
     totalBytesRetired = -off;
     input = null;
-    bufferIsImmutable = false;
+    this.bufferIsImmutable = bufferIsImmutable;
   }
 
   private CodedInputStream(final InputStream input) {
@@ -904,15 +887,6 @@ public final class CodedInputStream {
     bufferIsImmutable = false;
   }
 
-  private CodedInputStream(final LiteralByteString byteString) {
-    buffer = byteString.bytes;
-    bufferPos = byteString.getOffsetIntoBytes();
-    bufferSize = bufferPos + byteString.size();
-    totalBytesRetired = -bufferPos;
-    input = null;
-    bufferIsImmutable = true;
-  }
-
   public void enableAliasing(boolean enabled) {
     this.enableAliasing = enabled;
   }

+ 0 - 0
java/src/main/java/com/google/protobuf/CodedOutputStream.java → java/core/src/main/java/com/google/protobuf/CodedOutputStream.java


+ 0 - 0
java/src/main/java/com/google/protobuf/Descriptors.java → java/core/src/main/java/com/google/protobuf/Descriptors.java


+ 0 - 0
java/src/main/java/com/google/protobuf/DoubleArrayList.java → java/core/src/main/java/com/google/protobuf/DoubleArrayList.java


+ 0 - 0
java/src/main/java/com/google/protobuf/DynamicMessage.java → java/core/src/main/java/com/google/protobuf/DynamicMessage.java


+ 36 - 0
java/core/src/main/java/com/google/protobuf/ExperimentalApi.java

@@ -0,0 +1,36 @@
+package com.google.protobuf;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Indicates a public API that can change at any time, and has no guarantee of API stability and
+ * backward-compatibility.
+ *
+ * <p>Usage guidelines:
+ * <ol>
+ * <li>This annotation is used only on public API. Internal interfaces should not use it.</li>
+ * <li>This annotation should only be added to new APIs. Adding it to an existing API is
+ * considered API-breaking.</li>
+ * <li>Removing this annotation from an API gives it stable status.</li>
+ * </ol>
+ */
+@Retention(RetentionPolicy.SOURCE)
+@Target({
+    ElementType.ANNOTATION_TYPE,
+    ElementType.CONSTRUCTOR,
+    ElementType.FIELD,
+    ElementType.METHOD,
+    ElementType.PACKAGE,
+    ElementType.TYPE})
+@Documented
+public @interface ExperimentalApi {
+  /**
+   * Context information such as links to discussion thread, tracking issue etc.
+   */
+  String value() default "";
+}
+

+ 0 - 0
java/src/main/java/com/google/protobuf/Extension.java → java/core/src/main/java/com/google/protobuf/Extension.java


+ 0 - 0
java/src/main/java/com/google/protobuf/ExtensionLite.java → java/core/src/main/java/com/google/protobuf/ExtensionLite.java


+ 0 - 0
java/src/main/java/com/google/protobuf/ExtensionRegistry.java → java/core/src/main/java/com/google/protobuf/ExtensionRegistry.java


+ 0 - 0
java/src/main/java/com/google/protobuf/ExtensionRegistryLite.java → java/core/src/main/java/com/google/protobuf/ExtensionRegistryLite.java


+ 0 - 0
java/src/main/java/com/google/protobuf/FieldSet.java → java/core/src/main/java/com/google/protobuf/FieldSet.java


+ 0 - 0
java/src/main/java/com/google/protobuf/FloatArrayList.java → java/core/src/main/java/com/google/protobuf/FloatArrayList.java


+ 0 - 0
java/src/main/java/com/google/protobuf/GeneratedMessage.java → java/core/src/main/java/com/google/protobuf/GeneratedMessage.java


+ 0 - 0
java/src/main/java/com/google/protobuf/GeneratedMessageLite.java → java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java


+ 0 - 0
java/src/main/java/com/google/protobuf/IntArrayList.java → java/core/src/main/java/com/google/protobuf/IntArrayList.java


+ 26 - 34
java/src/main/java/com/google/protobuf/Internal.java → java/core/src/main/java/com/google/protobuf/Internal.java

@@ -1,32 +1,4 @@
-// Protocol Buffers - Google's data interchange format
-// Copyright 2008 Google Inc.  All rights reserved.
-// https://developers.google.com/protocol-buffers/
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//     * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+// Copyright 2007 Google Inc. All rights reserved.
 
 package com.google.protobuf;
 
@@ -283,9 +255,31 @@ public class Internal {
     // ByteString with the same content. This is to ensure that the generated
     // hashCode() method will return the same value as the pure reflection
     // based hashCode() method.
-    return LiteralByteString.hashCode(bytes);
+    return Internal.hashCode(bytes, 0, bytes.length);
+  }
+  
+  /**
+   * Helper method for implementing {@link LiteralByteString#hashCode()}.
+   */
+  static int hashCode(byte[] bytes, int offset, int length) {
+    // The hash code for a byte array should be the same as the hash code for a
+    // ByteString with the same content. This is to ensure that the generated
+    // hashCode() method will return the same value as the pure reflection
+    // based hashCode() method.
+    int h = Internal.partialHash(length, bytes, offset, length);
+    return h == 0 ? 1 : h;
   }
 
+  /**
+   * Helper method for continuously hashing bytes.
+   */
+  static int partialHash(int h, byte[] bytes, int offset, int length) {
+    for (int i = offset; i < offset + length; i++) {
+      h = h * 31 + bytes[i];
+    }
+    return h;
+  }
+  
   /**
    * Helper method for implementing {@link Message#equals(Object)} for bytes
    * field.
@@ -337,8 +331,7 @@ public class Internal {
   public static int hashCodeByteBuffer(ByteBuffer bytes) {
     if (bytes.hasArray()) {
       // Fast path.
-      int h = LiteralByteString.hashCode(bytes.capacity(), bytes.array(),
-          bytes.arrayOffset(), bytes.capacity());
+      int h = partialHash(bytes.capacity(), bytes.array(), bytes.arrayOffset(), bytes.capacity());
       return h == 0 ? 1 : h;
     } else {
       // Read the data into a temporary byte array before calculating the
@@ -353,7 +346,7 @@ public class Internal {
         final int length = duplicated.remaining() <= bufferSize ?
             duplicated.remaining() : bufferSize;
         duplicated.get(buffer, 0, length);
-        h = LiteralByteString.hashCode(h, buffer, 0, length);
+        h = partialHash(h, buffer, 0, length);
       }
       return h == 0 ? 1 : h;
     }
@@ -385,7 +378,6 @@ public class Internal {
   public static final CodedInputStream EMPTY_CODED_INPUT_STREAM =
       CodedInputStream.newInstance(EMPTY_BYTE_ARRAY);
 
-
   /**
    * Provides an immutable view of {@code List<T>} around a {@code List<F>}.
    *

+ 0 - 0
java/src/main/java/com/google/protobuf/InvalidProtocolBufferException.java → java/core/src/main/java/com/google/protobuf/InvalidProtocolBufferException.java


+ 0 - 0
java/src/main/java/com/google/protobuf/LazyField.java → java/core/src/main/java/com/google/protobuf/LazyField.java


+ 0 - 0
java/src/main/java/com/google/protobuf/LazyFieldLite.java → java/core/src/main/java/com/google/protobuf/LazyFieldLite.java


+ 0 - 0
java/src/main/java/com/google/protobuf/LazyStringArrayList.java → java/core/src/main/java/com/google/protobuf/LazyStringArrayList.java


+ 0 - 0
java/src/main/java/com/google/protobuf/LazyStringList.java → java/core/src/main/java/com/google/protobuf/LazyStringList.java


+ 0 - 0
java/src/main/java/com/google/protobuf/LongArrayList.java → java/core/src/main/java/com/google/protobuf/LongArrayList.java


+ 0 - 0
java/src/main/java/com/google/protobuf/MapEntry.java → java/core/src/main/java/com/google/protobuf/MapEntry.java


+ 0 - 0
java/src/main/java/com/google/protobuf/MapEntryLite.java → java/core/src/main/java/com/google/protobuf/MapEntryLite.java


+ 0 - 0
java/src/main/java/com/google/protobuf/MapField.java → java/core/src/main/java/com/google/protobuf/MapField.java


+ 1 - 1
java/src/main/java/com/google/protobuf/MapFieldLite.java → java/core/src/main/java/com/google/protobuf/MapFieldLite.java

@@ -136,7 +136,7 @@ public final class MapFieldLite<K, V> implements MutabilityOracle {
   
   private static int calculateHashCodeForObject(Object a) {
     if (a instanceof byte[]) {
-      return LiteralByteString.hashCode((byte[]) a);
+      return Internal.hashCode((byte[]) a);
     }
     // Enums should be stored as integers internally.
     if (a instanceof EnumLite) {

+ 0 - 0
java/src/main/java/com/google/protobuf/Message.java → java/core/src/main/java/com/google/protobuf/Message.java


+ 0 - 0
java/src/main/java/com/google/protobuf/MessageLite.java → java/core/src/main/java/com/google/protobuf/MessageLite.java


+ 0 - 0
java/src/main/java/com/google/protobuf/MessageLiteOrBuilder.java → java/core/src/main/java/com/google/protobuf/MessageLiteOrBuilder.java


+ 0 - 0
java/src/main/java/com/google/protobuf/MessageLiteToString.java → java/core/src/main/java/com/google/protobuf/MessageLiteToString.java


+ 0 - 0
java/src/main/java/com/google/protobuf/MessageOrBuilder.java → java/core/src/main/java/com/google/protobuf/MessageOrBuilder.java


+ 0 - 0
java/src/main/java/com/google/protobuf/MessageReflection.java → java/core/src/main/java/com/google/protobuf/MessageReflection.java


+ 0 - 0
java/src/main/java/com/google/protobuf/MutabilityOracle.java → java/core/src/main/java/com/google/protobuf/MutabilityOracle.java


+ 0 - 0
java/src/main/java/com/google/protobuf/NioByteString.java → java/core/src/main/java/com/google/protobuf/NioByteString.java


+ 0 - 0
java/src/main/java/com/google/protobuf/Parser.java → java/core/src/main/java/com/google/protobuf/Parser.java


+ 0 - 0
java/src/main/java/com/google/protobuf/ProtobufArrayList.java → java/core/src/main/java/com/google/protobuf/ProtobufArrayList.java


+ 0 - 0
java/src/main/java/com/google/protobuf/ProtocolMessageEnum.java → java/core/src/main/java/com/google/protobuf/ProtocolMessageEnum.java


+ 0 - 0
java/src/main/java/com/google/protobuf/ProtocolStringList.java → java/core/src/main/java/com/google/protobuf/ProtocolStringList.java


+ 0 - 0
java/src/main/java/com/google/protobuf/RepeatedFieldBuilder.java → java/core/src/main/java/com/google/protobuf/RepeatedFieldBuilder.java


+ 3 - 3
java/src/main/java/com/google/protobuf/RopeByteString.java → java/core/src/main/java/com/google/protobuf/RopeByteString.java

@@ -213,14 +213,14 @@ final class RopeByteString extends ByteString {
    * @param right string on the right
    * @return string formed by copying data bytes
    */
-  private static LiteralByteString concatenateBytes(ByteString left,
+  private static ByteString concatenateBytes(ByteString left,
       ByteString right) {
     int leftSize = left.size();
     int rightSize = right.size();
     byte[] bytes = new byte[leftSize + rightSize];
     left.copyTo(bytes, 0, 0, leftSize);
     right.copyTo(bytes, 0, leftSize, rightSize);
-    return new LiteralByteString(bytes);  // Constructor wraps bytes
+    return ByteString.wrap(bytes);  // Constructor wraps bytes
   }
 
   /**
@@ -735,7 +735,7 @@ final class RopeByteString extends ByteString {
   private static final long serialVersionUID = 1L;
 
   Object writeReplace() {
-    return new LiteralByteString(toByteArray());
+    return ByteString.wrap(toByteArray());
   }
 
   private void readObject(@SuppressWarnings("unused") ObjectInputStream in) throws IOException {

+ 0 - 0
java/src/main/java/com/google/protobuf/RpcCallback.java → java/core/src/main/java/com/google/protobuf/RpcCallback.java


+ 0 - 0
java/src/main/java/com/google/protobuf/RpcChannel.java → java/core/src/main/java/com/google/protobuf/RpcChannel.java


+ 0 - 0
java/src/main/java/com/google/protobuf/RpcController.java → java/core/src/main/java/com/google/protobuf/RpcController.java


+ 0 - 0
java/src/main/java/com/google/protobuf/RpcUtil.java → java/core/src/main/java/com/google/protobuf/RpcUtil.java


+ 0 - 0
java/src/main/java/com/google/protobuf/Service.java → java/core/src/main/java/com/google/protobuf/Service.java


+ 0 - 0
java/src/main/java/com/google/protobuf/ServiceException.java → java/core/src/main/java/com/google/protobuf/ServiceException.java


+ 0 - 0
java/src/main/java/com/google/protobuf/SingleFieldBuilder.java → java/core/src/main/java/com/google/protobuf/SingleFieldBuilder.java


+ 0 - 0
java/src/main/java/com/google/protobuf/SmallSortedMap.java → java/core/src/main/java/com/google/protobuf/SmallSortedMap.java


+ 0 - 0
java/src/main/java/com/google/protobuf/TextFormat.java → java/core/src/main/java/com/google/protobuf/TextFormat.java


+ 0 - 0
java/src/main/java/com/google/protobuf/TextFormatEscaper.java → java/core/src/main/java/com/google/protobuf/TextFormatEscaper.java


+ 0 - 0
java/src/main/java/com/google/protobuf/UninitializedMessageException.java → java/core/src/main/java/com/google/protobuf/UninitializedMessageException.java


+ 0 - 0
java/src/main/java/com/google/protobuf/UnknownFieldSet.java → java/core/src/main/java/com/google/protobuf/UnknownFieldSet.java


+ 0 - 0
java/src/main/java/com/google/protobuf/UnknownFieldSetLite.java → java/core/src/main/java/com/google/protobuf/UnknownFieldSetLite.java


+ 0 - 0
java/src/main/java/com/google/protobuf/UnmodifiableLazyStringList.java → java/core/src/main/java/com/google/protobuf/UnmodifiableLazyStringList.java


+ 12 - 4
java/src/main/java/com/google/protobuf/UnsafeByteStrings.java → java/core/src/main/java/com/google/protobuf/UnsafeByteOperations.java

@@ -33,15 +33,18 @@ package com.google.protobuf;
 import java.nio.ByteBuffer;
 
 /**
- * Provides unsafe factory methods for {@link ByteString} instances.
+ * Provides a number of unsafe byte operations to be used by advanced applications with high
+ * performance requirements. These methods are referred to as "unsafe" due to the fact that they
+ * potentially expose the backing buffer of a {@link ByteString} to the application.
  *
  * <p><strong>DISCLAIMER:</strong> The methods in this class should only be called if it is
  * guaranteed that the the buffer backing the {@link ByteString} will never change! Mutation of a
  * {@link ByteString} can lead to unexpected and undesirable consequences in your application,
  * and will likely be difficult to debug. Proceed with caution!
  */
-public final class UnsafeByteStrings {
-  private UnsafeByteStrings() {}
+@ExperimentalApi
+public final class UnsafeByteOperations {
+  private UnsafeByteOperations() {}
 
   /**
    * An unsafe operation that returns a {@link ByteString} that is backed by the provided buffer.
@@ -50,6 +53,11 @@ public final class UnsafeByteStrings {
    * @return a {@link ByteString} backed by the provided buffer.
    */
   public static ByteString unsafeWrap(ByteBuffer buffer) {
-    return new NioByteString(buffer);
+    if (buffer.hasArray()) {
+      final int offset = buffer.arrayOffset();
+      return ByteString.wrap(buffer.array(), offset + buffer.position(), buffer.remaining());
+    } else {
+      return new NioByteString(buffer);
+    }
   }
 }

+ 0 - 0
java/src/main/java/com/google/protobuf/Utf8.java → java/core/src/main/java/com/google/protobuf/Utf8.java


+ 0 - 0
java/src/main/java/com/google/protobuf/WireFormat.java → java/core/src/main/java/com/google/protobuf/WireFormat.java


+ 0 - 0
java/src/test/java/com/google/protobuf/AbstractMessageTest.java → java/core/src/test/java/com/google/protobuf/AbstractMessageTest.java


+ 0 - 0
java/src/test/java/com/google/protobuf/AnyTest.java → java/core/src/test/java/com/google/protobuf/AnyTest.java


+ 0 - 0
java/src/test/java/com/google/protobuf/BooleanArrayListTest.java → java/core/src/test/java/com/google/protobuf/BooleanArrayListTest.java


+ 2 - 2
java/src/test/java/com/google/protobuf/BoundedByteStringTest.java → java/core/src/test/java/com/google/protobuf/BoundedByteStringTest.java

@@ -62,7 +62,7 @@ public class BoundedByteStringTest extends LiteralByteStringTest {
   @Override
   public void testToString() throws UnsupportedEncodingException {
     String testString = "I love unicode \u1234\u5678 characters";
-    LiteralByteString unicode = new LiteralByteString(testString.getBytes(Internal.UTF_8));
+    ByteString unicode = ByteString.wrap(testString.getBytes(Internal.UTF_8));
     ByteString chopped = unicode.substring(2, unicode.size() - 6);
     assertEquals(classUnderTest + ".substring() must have the expected type",
         classUnderTest, getActualClassName(chopped));
@@ -75,7 +75,7 @@ public class BoundedByteStringTest extends LiteralByteStringTest {
   @Override
   public void testCharsetToString() {
     String testString = "I love unicode \u1234\u5678 characters";
-    LiteralByteString unicode = new LiteralByteString(testString.getBytes(Internal.UTF_8));
+    ByteString unicode = ByteString.wrap(testString.getBytes(Internal.UTF_8));
     ByteString chopped = unicode.substring(2, unicode.size() - 6);
     assertEquals(classUnderTest + ".substring() must have the expected type",
         classUnderTest, getActualClassName(chopped));

+ 4 - 4
java/src/test/java/com/google/protobuf/ByteStringTest.java → java/core/src/test/java/com/google/protobuf/ByteStringTest.java

@@ -655,11 +655,11 @@ public class ByteStringTest extends TestCase {
     // trees of empty leaves, to make a string that will fail this test.
     for (int i = 1; i < duo.size(); ++i) {
       assertTrue("Substrings of size() < 2 must not be RopeByteStrings",
-          duo.substring(i - 1, i) instanceof LiteralByteString);
+          duo.substring(i - 1, i) instanceof ByteString.LeafByteString);
     }
     for (int i = 1; i < quintet.size(); ++i) {
       assertTrue("Substrings of size() < 2 must not be RopeByteStrings",
-          quintet.substring(i - 1, i) instanceof LiteralByteString);
+          quintet.substring(i - 1, i) instanceof ByteString.LeafByteString);
     }
   }
 
@@ -724,7 +724,7 @@ public class ByteStringTest extends TestCase {
     }
     data1[1] = (byte) 11;
     // Test LiteralByteString.writeTo(OutputStream,int,int)
-    LiteralByteString left = new LiteralByteString(data1);
+    ByteString left = ByteString.wrap(data1);
     byte[] result = substringUsingWriteTo(left, 1, 1);
     assertEquals(1, result.length);
     assertEquals((byte) 11, result[0]);
@@ -733,7 +733,7 @@ public class ByteStringTest extends TestCase {
     for (int i = 0; i < data1.length; i++) {
       data2[i] = (byte) 2;
     }
-    LiteralByteString right = new LiteralByteString(data2);
+    ByteString right = ByteString.wrap(data2);
     // Concatenate two ByteStrings to create a RopeByteString.
     ByteString root = left.concat(right);
     // Make sure we are actually testing a RopeByteString with a simple tree

+ 0 - 0
java/src/test/java/com/google/protobuf/CheckUtf8Test.java → java/core/src/test/java/com/google/protobuf/CheckUtf8Test.java


+ 0 - 0
java/src/test/java/com/google/protobuf/CodedInputStreamTest.java → java/core/src/test/java/com/google/protobuf/CodedInputStreamTest.java


+ 0 - 0
java/src/test/java/com/google/protobuf/CodedOutputStreamTest.java → java/core/src/test/java/com/google/protobuf/CodedOutputStreamTest.java


+ 0 - 0
java/src/test/java/com/google/protobuf/DeprecatedFieldTest.java → java/core/src/test/java/com/google/protobuf/DeprecatedFieldTest.java


+ 0 - 0
java/src/test/java/com/google/protobuf/DescriptorsTest.java → java/core/src/test/java/com/google/protobuf/DescriptorsTest.java


+ 0 - 0
java/src/test/java/com/google/protobuf/DoubleArrayListTest.java → java/core/src/test/java/com/google/protobuf/DoubleArrayListTest.java


+ 0 - 0
java/src/test/java/com/google/protobuf/DynamicMessageTest.java → java/core/src/test/java/com/google/protobuf/DynamicMessageTest.java


+ 0 - 0
java/src/test/java/com/google/protobuf/FieldPresenceTest.java → java/core/src/test/java/com/google/protobuf/FieldPresenceTest.java


+ 0 - 0
java/src/test/java/com/google/protobuf/FloatArrayListTest.java → java/core/src/test/java/com/google/protobuf/FloatArrayListTest.java


+ 0 - 0
java/src/test/java/com/google/protobuf/ForceFieldBuildersPreRun.java → java/core/src/test/java/com/google/protobuf/ForceFieldBuildersPreRun.java


+ 0 - 0
java/src/test/java/com/google/protobuf/GeneratedMessageTest.java → java/core/src/test/java/com/google/protobuf/GeneratedMessageTest.java


+ 0 - 0
java/src/test/java/com/google/protobuf/IntArrayListTest.java → java/core/src/test/java/com/google/protobuf/IntArrayListTest.java


+ 0 - 0
java/src/test/java/com/google/protobuf/IsValidUtf8Test.java → java/core/src/test/java/com/google/protobuf/IsValidUtf8Test.java


+ 0 - 0
java/src/test/java/com/google/protobuf/IsValidUtf8TestUtil.java → java/core/src/test/java/com/google/protobuf/IsValidUtf8TestUtil.java


+ 0 - 0
java/src/test/java/com/google/protobuf/LazyFieldLiteTest.java → java/core/src/test/java/com/google/protobuf/LazyFieldLiteTest.java


+ 0 - 0
java/src/test/java/com/google/protobuf/LazyFieldTest.java → java/core/src/test/java/com/google/protobuf/LazyFieldTest.java


+ 0 - 0
java/src/test/java/com/google/protobuf/LazyMessageLiteTest.java → java/core/src/test/java/com/google/protobuf/LazyMessageLiteTest.java


+ 0 - 0
java/src/test/java/com/google/protobuf/LazyStringArrayListTest.java → java/core/src/test/java/com/google/protobuf/LazyStringArrayListTest.java


+ 0 - 0
java/src/test/java/com/google/protobuf/LazyStringEndToEndTest.java → java/core/src/test/java/com/google/protobuf/LazyStringEndToEndTest.java


+ 0 - 0
java/src/test/java/com/google/protobuf/LiteEqualsAndHashTest.java → java/core/src/test/java/com/google/protobuf/LiteEqualsAndHashTest.java


+ 0 - 0
java/src/test/java/com/google/protobuf/LiteTest.java → java/core/src/test/java/com/google/protobuf/LiteTest.java


+ 8 - 10
java/src/test/java/com/google/protobuf/LiteralByteStringTest.java → java/core/src/test/java/com/google/protobuf/LiteralByteStringTest.java

@@ -75,9 +75,7 @@ public class LiteralByteStringTest extends TestCase {
   }
 
   protected String getActualClassName(Object object) {
-    String actualClassName = object.getClass().getName();
-    actualClassName = actualClassName.substring(actualClassName.lastIndexOf('.') + 1);
-    return actualClassName;
+    return object.getClass().getSimpleName();
   }
 
   public void testByteAt() {
@@ -350,14 +348,14 @@ public class LiteralByteStringTest extends TestCase {
 
   public void testToString() throws UnsupportedEncodingException {
     String testString = "I love unicode \u1234\u5678 characters";
-    LiteralByteString unicode = new LiteralByteString(testString.getBytes(Internal.UTF_8));
+    ByteString unicode = ByteString.wrap(testString.getBytes(Internal.UTF_8));
     String roundTripString = unicode.toString(UTF_8);
     assertEquals(classUnderTest + " unicode must match", testString, roundTripString);
   }
 
   public void testCharsetToString() {
     String testString = "I love unicode \u1234\u5678 characters";
-    LiteralByteString unicode = new LiteralByteString(testString.getBytes(Internal.UTF_8));
+    ByteString unicode = ByteString.wrap(testString.getBytes(Internal.UTF_8));
     String roundTripString = unicode.toString(Internal.UTF_8);
     assertEquals(classUnderTest + " unicode must match", testString, roundTripString);
   }
@@ -365,7 +363,7 @@ public class LiteralByteStringTest extends TestCase {
   public void testToString_returnsCanonicalEmptyString() {
     assertSame(classUnderTest + " must be the same string references",
         ByteString.EMPTY.toString(Internal.UTF_8),
-        new LiteralByteString(new byte[]{}).toString(Internal.UTF_8));
+        ByteString.wrap(new byte[]{}).toString(Internal.UTF_8));
   }
 
   public void testToString_raisesException() {
@@ -377,7 +375,7 @@ public class LiteralByteStringTest extends TestCase {
     }
 
     try {
-      new LiteralByteString(referenceBytes).toString("invalid");
+      ByteString.wrap(referenceBytes).toString("invalid");
       fail("Should have thrown an exception.");
     } catch (UnsupportedEncodingException expected) {
       // This is success
@@ -390,15 +388,15 @@ public class LiteralByteStringTest extends TestCase {
     assertFalse(classUnderTest + " must not equal the empty string",
         stringUnderTest.equals(ByteString.EMPTY));
     assertEquals(classUnderTest + " empty strings must be equal",
-        new LiteralByteString(new byte[]{}), stringUnderTest.substring(55, 55));
+        ByteString.wrap(new byte[]{}), stringUnderTest.substring(55, 55));
     assertEquals(classUnderTest + " must equal another string with the same value",
-        stringUnderTest, new LiteralByteString(referenceBytes));
+        stringUnderTest, ByteString.wrap(referenceBytes));
 
     byte[] mungedBytes = new byte[referenceBytes.length];
     System.arraycopy(referenceBytes, 0, mungedBytes, 0, referenceBytes.length);
     mungedBytes[mungedBytes.length - 5] = (byte) (mungedBytes[mungedBytes.length - 5] ^ 0xFF);
     assertFalse(classUnderTest + " must not equal every string with the same length",
-        stringUnderTest.equals(new LiteralByteString(mungedBytes)));
+        stringUnderTest.equals(ByteString.wrap(mungedBytes)));
   }
 
   public void testHashCode() {

+ 0 - 0
java/src/test/java/com/google/protobuf/LongArrayListTest.java → java/core/src/test/java/com/google/protobuf/LongArrayListTest.java


+ 0 - 0
java/src/test/java/com/google/protobuf/MapForProto2LiteTest.java → java/core/src/test/java/com/google/protobuf/MapForProto2LiteTest.java


+ 0 - 0
java/src/test/java/com/google/protobuf/MapForProto2Test.java → java/core/src/test/java/com/google/protobuf/MapForProto2Test.java


+ 0 - 0
java/src/test/java/com/google/protobuf/MapTest.java → java/core/src/test/java/com/google/protobuf/MapTest.java


+ 0 - 0
java/src/test/java/com/google/protobuf/MessageTest.java → java/core/src/test/java/com/google/protobuf/MessageTest.java


Some files were not shown because too many files changed in this diff