Ver Fonte

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 há 10 anos atrás
pai
commit
5221dcbe47
100 ficheiros alterados com 460 adições e 150 exclusões
  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


Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff