http://git-wip-us.apache.org/repos/asf/hbase/blob/7a6de1bd/hbase-protocol-shaded/src/main/java/org/apache/hadoop/hbase/shaded/com/google/protobuf/MessageLiteToString.java ---------------------------------------------------------------------- diff --git a/hbase-protocol-shaded/src/main/java/org/apache/hadoop/hbase/shaded/com/google/protobuf/MessageLiteToString.java b/hbase-protocol-shaded/src/main/java/org/apache/hadoop/hbase/shaded/com/google/protobuf/MessageLiteToString.java deleted file mode 100644 index eea6db5..0000000 --- a/hbase-protocol-shaded/src/main/java/org/apache/hadoop/hbase/shaded/com/google/protobuf/MessageLiteToString.java +++ /dev/null @@ -1,239 +0,0 @@ -// 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. - -package org.apache.hadoop.hbase.shaded.com.google.protobuf; - -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.TreeSet; - -/** - * Helps generate {@link String} representations of {@link MessageLite} protos. - */ -// TODO(dweis): Fix map fields. -final class MessageLiteToString { - - private static final String LIST_SUFFIX = "List"; - private static final String BUILDER_LIST_SUFFIX = "OrBuilderList"; - private static final String BYTES_SUFFIX = "Bytes"; - - /** - * Returns a {@link String} representation of the {@link MessageLite} object. The first line of - * the {@code String} representation representation includes a comment string to uniquely identify - * the objcet instance. This acts as an indicator that this should not be relied on for - * comparisons. - * - * <p>For use by generated code only. - */ - static String toString(MessageLite messageLite, String commentString) { - StringBuilder buffer = new StringBuilder(); - buffer.append("# ").append(commentString); - reflectivePrintWithIndent(messageLite, buffer, 0); - return buffer.toString(); - } - - /** - * Reflectively prints the {@link MessageLite} to the buffer at given {@code indent} level. - * - * @param buffer the buffer to write to - * @param indent the number of spaces to indent the proto by - */ - private static void reflectivePrintWithIndent( - MessageLite messageLite, StringBuilder buffer, int indent) { - // Build a map of method name to method. We're looking for methods like getFoo(), hasFoo(), and - // getFooList() which might be useful for building an object's string representation. - Map<String, Method> nameToNoArgMethod = new HashMap<String, Method>(); - Map<String, Method> nameToMethod = new HashMap<String, Method>(); - Set<String> getters = new TreeSet<String>(); - for (Method method : messageLite.getClass().getDeclaredMethods()) { - nameToMethod.put(method.getName(), method); - if (method.getParameterTypes().length == 0) { - nameToNoArgMethod.put(method.getName(), method); - - if (method.getName().startsWith("get")) { - getters.add(method.getName()); - } - } - } - - for (String getter : getters) { - String suffix = getter.replaceFirst("get", ""); - if (suffix.endsWith(LIST_SUFFIX) && !suffix.endsWith(BUILDER_LIST_SUFFIX)) { - String camelCase = suffix.substring(0, 1).toLowerCase() - + suffix.substring(1, suffix.length() - LIST_SUFFIX.length()); - // Try to reflectively get the value and toString() the field as if it were repeated. This - // only works if the method names have not be proguarded out or renamed. - Method listMethod = nameToNoArgMethod.get("get" + suffix); - if (listMethod != null && listMethod.getReturnType().equals(List.class)) { - printField( - buffer, - indent, - camelCaseToSnakeCase(camelCase), - GeneratedMessageLite.invokeOrDie(listMethod, messageLite)); - continue; - } - } - - Method setter = nameToMethod.get("set" + suffix); - if (setter == null) { - continue; - } - if (suffix.endsWith(BYTES_SUFFIX) - && nameToNoArgMethod.containsKey( - "get" + suffix.substring(0, suffix.length() - "Bytes".length()))) { - // Heuristic to skip bytes based accessors for string fields. - continue; - } - - String camelCase = suffix.substring(0, 1).toLowerCase() + suffix.substring(1); - - // Try to reflectively get the value and toString() the field as if it were optional. This - // only works if the method names have not be proguarded out or renamed. - Method getMethod = nameToNoArgMethod.get("get" + suffix); - Method hasMethod = nameToNoArgMethod.get("has" + suffix); - // TODO(dweis): Fix proto3 semantics. - if (getMethod != null) { - Object value = GeneratedMessageLite.invokeOrDie(getMethod, messageLite); - final boolean hasValue = hasMethod == null - ? !isDefaultValue(value) - : (Boolean) GeneratedMessageLite.invokeOrDie(hasMethod, messageLite); - // TODO(dweis): This doesn't stop printing oneof case twice: value and enum style. - if (hasValue) { - printField( - buffer, - indent, - camelCaseToSnakeCase(camelCase), - value); - } - continue; - } - } - - if (messageLite instanceof GeneratedMessageLite.ExtendableMessage) { - Iterator<Map.Entry<GeneratedMessageLite.ExtensionDescriptor, Object>> iter = - ((GeneratedMessageLite.ExtendableMessage<?, ?>) messageLite).extensions.iterator(); - while (iter.hasNext()) { - Map.Entry<GeneratedMessageLite.ExtensionDescriptor, Object> entry = iter.next(); - printField(buffer, indent, "[" + entry.getKey().getNumber() + "]", entry.getValue()); - } - } - - if (((GeneratedMessageLite<?, ?>) messageLite).unknownFields != null) { - ((GeneratedMessageLite<?, ?>) messageLite).unknownFields.printWithIndent(buffer, indent); - } - } - - private static boolean isDefaultValue(Object o) { - if (o instanceof Boolean) { - return !((Boolean) o); - } - if (o instanceof Integer) { - return ((Integer) o) == 0; - } - if (o instanceof Float) { - return ((Float) o) == 0f; - } - if (o instanceof Double) { - return ((Double) o) == 0d; - } - if (o instanceof String) { - return o.equals(""); - } - if (o instanceof ByteString) { - return o.equals(ByteString.EMPTY); - } - if (o instanceof MessageLite) { // Can happen in oneofs. - return o == ((MessageLite) o).getDefaultInstanceForType(); - } - if (o instanceof java.lang.Enum<?>) { // Catches oneof enums. - return ((java.lang.Enum<?>) o).ordinal() == 0; - } - - return false; - } - - /** - * Formats a text proto field. - * - * <p>For use by generated code only. - * - * @param buffer the buffer to write to - * @param indent the number of spaces the proto should be indented by - * @param name the field name (in lower underscore case) - * @param object the object value of the field - */ - static final void printField(StringBuilder buffer, int indent, String name, Object object) { - if (object instanceof List<?>) { - List<?> list = (List<?>) object; - for (Object entry : list) { - printField(buffer, indent, name, entry); - } - return; - } - - buffer.append('\n'); - for (int i = 0; i < indent; i++) { - buffer.append(' '); - } - buffer.append(name); - - if (object instanceof String) { - buffer.append(": \"").append(TextFormatEscaper.escapeText((String) object)).append('"'); - } else if (object instanceof ByteString) { - buffer.append(": \"").append(TextFormatEscaper.escapeBytes((ByteString) object)).append('"'); - } else if (object instanceof GeneratedMessageLite) { - buffer.append(" {"); - reflectivePrintWithIndent((GeneratedMessageLite<?, ?>) object, buffer, indent + 2); - buffer.append("\n"); - for (int i = 0; i < indent; i++) { - buffer.append(' '); - } - buffer.append("}"); - } else { - buffer.append(": ").append(object.toString()); - } - } - - private static final String camelCaseToSnakeCase(String camelCase) { - StringBuilder builder = new StringBuilder(); - for (int i = 0; i < camelCase.length(); i++) { - char ch = camelCase.charAt(i); - if (Character.isUpperCase(ch)) { - builder.append("_"); - } - builder.append(Character.toLowerCase(ch)); - } - return builder.toString(); - } -}
http://git-wip-us.apache.org/repos/asf/hbase/blob/7a6de1bd/hbase-protocol-shaded/src/main/java/org/apache/hadoop/hbase/shaded/com/google/protobuf/MessageOrBuilder.java ---------------------------------------------------------------------- diff --git a/hbase-protocol-shaded/src/main/java/org/apache/hadoop/hbase/shaded/com/google/protobuf/MessageOrBuilder.java b/hbase-protocol-shaded/src/main/java/org/apache/hadoop/hbase/shaded/com/google/protobuf/MessageOrBuilder.java deleted file mode 100644 index 59d5e2f..0000000 --- a/hbase-protocol-shaded/src/main/java/org/apache/hadoop/hbase/shaded/com/google/protobuf/MessageOrBuilder.java +++ /dev/null @@ -1,143 +0,0 @@ -// 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. - -package org.apache.hadoop.hbase.shaded.com.google.protobuf; - -import java.util.List; -import java.util.Map; - -/** - * Base interface for methods common to {@link Message} and - * {@link Message.Builder} to provide type equivalency. - * - * @author j...@google.com (Jon Perlow) - */ -public interface MessageOrBuilder extends MessageLiteOrBuilder { - - // (From MessageLite, re-declared here only for return type covariance.) - @Override - Message getDefaultInstanceForType(); - - /** - * Returns a list of field paths (e.g. "foo.bar.baz") of required fields - * which are not set in this message. You should call - * {@link MessageLiteOrBuilder#isInitialized()} first to check if there - * are any missing fields, as that method is likely to be much faster - * than this one even when the message is fully-initialized. - */ - List<String> findInitializationErrors(); - - /** - * Returns a comma-delimited list of required fields which are not set - * in this message object. You should call - * {@link MessageLiteOrBuilder#isInitialized()} first to check if there - * are any missing fields, as that method is likely to be much faster - * than this one even when the message is fully-initialized. - */ - String getInitializationErrorString(); - - /** - * Get the message's type's descriptor. This differs from the - * {@code getDescriptor()} method of generated message classes in that - * this method is an abstract method of the {@code Message} interface - * whereas {@code getDescriptor()} is a static method of a specific class. - * They return the same thing. - */ - Descriptors.Descriptor getDescriptorForType(); - - /** - * Returns a collection of all the fields in this message which are set - * and their corresponding values. A singular ("required" or "optional") - * field is set iff hasField() returns true for that field. A "repeated" - * field is set iff getRepeatedFieldCount() is greater than zero. The - * values are exactly what would be returned by calling - * {@link #getField(Descriptors.FieldDescriptor)} for each field. The map - * is guaranteed to be a sorted map, so iterating over it will return fields - * in order by field number. - * <br> - * If this is for a builder, the returned map may or may not reflect future - * changes to the builder. Either way, the returned map is itself - * unmodifiable. - */ - Map<Descriptors.FieldDescriptor, Object> getAllFields(); - - /** - * Returns true if the given oneof is set. - * @throws IllegalArgumentException if - * {@code oneof.getContainingType() != getDescriptorForType()}. - */ - boolean hasOneof(Descriptors.OneofDescriptor oneof); - - /** - * Obtains the FieldDescriptor if the given oneof is set. Returns null - * if no field is set. - */ - Descriptors.FieldDescriptor getOneofFieldDescriptor( - Descriptors.OneofDescriptor oneof); - - /** - * Returns true if the given field is set. This is exactly equivalent to - * calling the generated "has" accessor method corresponding to the field. - * @throws IllegalArgumentException The field is a repeated field, or - * {@code field.getContainingType() != getDescriptorForType()}. - */ - boolean hasField(Descriptors.FieldDescriptor field); - - /** - * Obtains the value of the given field, or the default value if it is - * not set. For primitive fields, the boxed primitive value is returned. - * For enum fields, the EnumValueDescriptor for the value is returned. For - * embedded message fields, the sub-message is returned. For repeated - * fields, a java.util.List is returned. - */ - Object getField(Descriptors.FieldDescriptor field); - - /** - * Gets the number of elements of a repeated field. This is exactly - * equivalent to calling the generated "Count" accessor method corresponding - * to the field. - * @throws IllegalArgumentException The field is not a repeated field, or - * {@code field.getContainingType() != getDescriptorForType()}. - */ - int getRepeatedFieldCount(Descriptors.FieldDescriptor field); - - /** - * Gets an element of a repeated field. For primitive fields, the boxed - * primitive value is returned. For enum fields, the EnumValueDescriptor - * for the value is returned. For embedded message fields, the sub-message - * is returned. - * @throws IllegalArgumentException The field is not a repeated field, or - * {@code field.getContainingType() != getDescriptorForType()}. - */ - Object getRepeatedField(Descriptors.FieldDescriptor field, int index); - - /** Get the {@link UnknownFieldSet} for this message. */ - UnknownFieldSet getUnknownFields(); -} http://git-wip-us.apache.org/repos/asf/hbase/blob/7a6de1bd/hbase-protocol-shaded/src/main/java/org/apache/hadoop/hbase/shaded/com/google/protobuf/MessageReflection.java ---------------------------------------------------------------------- diff --git a/hbase-protocol-shaded/src/main/java/org/apache/hadoop/hbase/shaded/com/google/protobuf/MessageReflection.java b/hbase-protocol-shaded/src/main/java/org/apache/hadoop/hbase/shaded/com/google/protobuf/MessageReflection.java deleted file mode 100644 index 99a3377..0000000 --- a/hbase-protocol-shaded/src/main/java/org/apache/hadoop/hbase/shaded/com/google/protobuf/MessageReflection.java +++ /dev/null @@ -1,990 +0,0 @@ -// 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. - -package org.apache.hadoop.hbase.shaded.com.google.protobuf; - -import org.apache.hadoop.hbase.shaded.com.google.protobuf.Descriptors.FieldDescriptor; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; - -/** - * Reflection utility methods shared by both mutable and immutable messages. - * - * @author liuj...@google.com (Pherl Liu) - */ -class MessageReflection { - - static void writeMessageTo( - Message message, - Map<FieldDescriptor, Object> fields, - CodedOutputStream output, - boolean alwaysWriteRequiredFields) - throws IOException { - final boolean isMessageSet = - message.getDescriptorForType().getOptions().getMessageSetWireFormat(); - if (alwaysWriteRequiredFields) { - fields = new TreeMap<FieldDescriptor, Object>(fields); - for (final FieldDescriptor field : - message.getDescriptorForType().getFields()) { - if (field.isRequired() && !fields.containsKey(field)) { - fields.put(field, message.getField(field)); - } - } - } - for (final Map.Entry<Descriptors.FieldDescriptor, Object> entry : - fields.entrySet()) { - final Descriptors.FieldDescriptor field = entry.getKey(); - final Object value = entry.getValue(); - if (isMessageSet && field.isExtension() && - field.getType() == Descriptors.FieldDescriptor.Type.MESSAGE && - !field.isRepeated()) { - output.writeMessageSetExtension(field.getNumber(), (Message) value); - } else { - FieldSet.writeField(field, value, output); - } - } - - final UnknownFieldSet unknownFields = message.getUnknownFields(); - if (isMessageSet) { - unknownFields.writeAsMessageSetTo(output); - } else { - unknownFields.writeTo(output); - } - } - - static int getSerializedSize( - Message message, - Map<FieldDescriptor, Object> fields) { - int size = 0; - final boolean isMessageSet = - message.getDescriptorForType().getOptions().getMessageSetWireFormat(); - - for (final Map.Entry<Descriptors.FieldDescriptor, Object> entry : - fields.entrySet()) { - final Descriptors.FieldDescriptor field = entry.getKey(); - final Object value = entry.getValue(); - if (isMessageSet && field.isExtension() && - field.getType() == Descriptors.FieldDescriptor.Type.MESSAGE && - !field.isRepeated()) { - size += CodedOutputStream.computeMessageSetExtensionSize( - field.getNumber(), (Message) value); - } else { - size += FieldSet.computeFieldSize(field, value); - } - } - - final UnknownFieldSet unknownFields = message.getUnknownFields(); - if (isMessageSet) { - size += unknownFields.getSerializedSizeAsMessageSet(); - } else { - size += unknownFields.getSerializedSize(); - } - return size; - } - - static String delimitWithCommas(List<String> parts) { - StringBuilder result = new StringBuilder(); - for (String part : parts) { - if (result.length() > 0) { - result.append(", "); - } - result.append(part); - } - return result.toString(); - } - - @SuppressWarnings("unchecked") - static boolean isInitialized(MessageOrBuilder message) { - // Check that all required fields are present. - for (final Descriptors.FieldDescriptor field : message - .getDescriptorForType() - .getFields()) { - if (field.isRequired()) { - if (!message.hasField(field)) { - return false; - } - } - } - - // Check that embedded messages are initialized. - for (final Map.Entry<Descriptors.FieldDescriptor, Object> entry : - message.getAllFields().entrySet()) { - final Descriptors.FieldDescriptor field = entry.getKey(); - if (field.getJavaType() == Descriptors.FieldDescriptor.JavaType.MESSAGE) { - if (field.isRepeated()) { - for (final Message element - : (List<Message>) entry.getValue()) { - if (!element.isInitialized()) { - return false; - } - } - } else { - if (!((Message) entry.getValue()).isInitialized()) { - return false; - } - } - } - } - - return true; - } - - private static String subMessagePrefix(final String prefix, - final Descriptors.FieldDescriptor field, - final int index) { - final StringBuilder result = new StringBuilder(prefix); - if (field.isExtension()) { - result.append('(') - .append(field.getFullName()) - .append(')'); - } else { - result.append(field.getName()); - } - if (index != -1) { - result.append('[') - .append(index) - .append(']'); - } - result.append('.'); - return result.toString(); - } - - private static void findMissingFields(final MessageOrBuilder message, - final String prefix, - final List<String> results) { - for (final Descriptors.FieldDescriptor field : - message.getDescriptorForType().getFields()) { - if (field.isRequired() && !message.hasField(field)) { - results.add(prefix + field.getName()); - } - } - - for (final Map.Entry<Descriptors.FieldDescriptor, Object> entry : - message.getAllFields().entrySet()) { - final Descriptors.FieldDescriptor field = entry.getKey(); - final Object value = entry.getValue(); - - if (field.getJavaType() == Descriptors.FieldDescriptor.JavaType.MESSAGE) { - if (field.isRepeated()) { - int i = 0; - for (final Object element : (List) value) { - findMissingFields((MessageOrBuilder) element, - subMessagePrefix(prefix, field, i++), - results); - } - } else { - if (message.hasField(field)) { - findMissingFields((MessageOrBuilder) value, - subMessagePrefix(prefix, field, -1), - results); - } - } - } - } - } - - /** - * Populates {@code this.missingFields} with the full "path" of each missing - * required field in the given message. - */ - static List<String> findMissingFields( - final MessageOrBuilder message) { - final List<String> results = new ArrayList<String>(); - findMissingFields(message, "", results); - return results; - } - - static interface MergeTarget { - enum ContainerType { - MESSAGE, EXTENSION_SET - } - - /** - * Returns the descriptor for the target. - */ - public Descriptors.Descriptor getDescriptorForType(); - - public ContainerType getContainerType(); - - public ExtensionRegistry.ExtensionInfo findExtensionByName( - ExtensionRegistry registry, String name); - - public ExtensionRegistry.ExtensionInfo findExtensionByNumber( - ExtensionRegistry registry, Descriptors.Descriptor containingType, - int fieldNumber); - - /** - * Obtains the value of the given field, or the default value if it is not - * set. For primitive fields, the boxed primitive value is returned. For - * enum fields, the EnumValueDescriptor for the value is returned. For - * embedded message fields, the sub-message is returned. For repeated - * fields, a java.util.List is returned. - */ - public Object getField(Descriptors.FieldDescriptor field); - - /** - * Returns true if the given field is set. This is exactly equivalent to - * calling the generated "has" accessor method corresponding to the field. - * - * @throws IllegalArgumentException The field is a repeated field, or {@code - * field.getContainingType() != getDescriptorForType()}. - */ - boolean hasField(Descriptors.FieldDescriptor field); - - /** - * Sets a field to the given value. The value must be of the correct type - * for this field, i.e. the same type that - * {@link Message#getField(Descriptors.FieldDescriptor)} - * would return. - */ - MergeTarget setField(Descriptors.FieldDescriptor field, Object value); - - /** - * Clears the field. This is exactly equivalent to calling the generated - * "clear" accessor method corresponding to the field. - */ - MergeTarget clearField(Descriptors.FieldDescriptor field); - - /** - * Sets an element of a repeated field to the given value. The value must - * be of the correct type for this field, i.e. the same type that {@link - * Message#getRepeatedField(Descriptors.FieldDescriptor, int)} would return. - * - * @throws IllegalArgumentException The field is not a repeated field, or - * {@code field.getContainingType() != - * getDescriptorForType()}. - */ - MergeTarget setRepeatedField(Descriptors.FieldDescriptor field, - int index, Object value); - - /** - * Like {@code setRepeatedField}, but appends the value as a new element. - * - * @throws IllegalArgumentException The field is not a repeated field, or - * {@code field.getContainingType() != - * getDescriptorForType()}. - */ - MergeTarget addRepeatedField(Descriptors.FieldDescriptor field, - Object value); - - /** - * Returns true if the given oneof is set. - * - * @throws IllegalArgumentException if - * {@code oneof.getContainingType() != getDescriptorForType()}. - */ - boolean hasOneof(Descriptors.OneofDescriptor oneof); - - /** - * Clears the oneof. This is exactly equivalent to calling the generated - * "clear" accessor method corresponding to the oneof. - */ - MergeTarget clearOneof(Descriptors.OneofDescriptor oneof); - - /** - * Obtains the FieldDescriptor if the given oneof is set. Returns null - * if no field is set. - */ - Descriptors.FieldDescriptor getOneofFieldDescriptor(Descriptors.OneofDescriptor oneof); - - /** - * Parse the input stream into a sub field group defined based on either - * FieldDescriptor or the default instance. - */ - Object parseGroup(CodedInputStream input, ExtensionRegistryLite registry, - Descriptors.FieldDescriptor descriptor, Message defaultInstance) - throws IOException; - - /** - * Parse the input stream into a sub field message defined based on either - * FieldDescriptor or the default instance. - */ - Object parseMessage(CodedInputStream input, ExtensionRegistryLite registry, - Descriptors.FieldDescriptor descriptor, Message defaultInstance) - throws IOException; - - /** - * Parse from a ByteString into a sub field message defined based on either - * FieldDescriptor or the default instance. There isn't a varint indicating - * the length of the message at the beginning of the input ByteString. - */ - Object parseMessageFromBytes( - ByteString bytes, ExtensionRegistryLite registry, - Descriptors.FieldDescriptor descriptor, Message defaultInstance) - throws IOException; - - /** - * Returns the UTF8 validation level for the field. - */ - WireFormat.Utf8Validation getUtf8Validation(Descriptors.FieldDescriptor - descriptor); - - /** - * Returns a new merge target for a sub-field. When defaultInstance is - * provided, it indicates the descriptor is for an extension type, and - * implementations should create a new instance from the defaultInstance - * prototype directly. - */ - MergeTarget newMergeTargetForField( - Descriptors.FieldDescriptor descriptor, - Message defaultInstance); - - /** - * Finishes the merge and returns the underlying object. - */ - Object finish(); - } - - static class BuilderAdapter implements MergeTarget { - - private final Message.Builder builder; - - @Override - public Descriptors.Descriptor getDescriptorForType() { - return builder.getDescriptorForType(); - } - - public BuilderAdapter(Message.Builder builder) { - this.builder = builder; - } - - @Override - public Object getField(Descriptors.FieldDescriptor field) { - return builder.getField(field); - } - - @Override - public boolean hasField(Descriptors.FieldDescriptor field) { - return builder.hasField(field); - } - - @Override - public MergeTarget setField(Descriptors.FieldDescriptor field, Object value) { - builder.setField(field, value); - return this; - } - - @Override - public MergeTarget clearField(Descriptors.FieldDescriptor field) { - builder.clearField(field); - return this; - } - - @Override - public MergeTarget setRepeatedField( - Descriptors.FieldDescriptor field, int index, Object value) { - builder.setRepeatedField(field, index, value); - return this; - } - - @Override - public MergeTarget addRepeatedField(Descriptors.FieldDescriptor field, Object value) { - builder.addRepeatedField(field, value); - return this; - } - - @Override - public boolean hasOneof(Descriptors.OneofDescriptor oneof) { - return builder.hasOneof(oneof); - } - - @Override - public MergeTarget clearOneof(Descriptors.OneofDescriptor oneof) { - builder.clearOneof(oneof); - return this; - } - - @Override - public Descriptors.FieldDescriptor getOneofFieldDescriptor(Descriptors.OneofDescriptor oneof) { - return builder.getOneofFieldDescriptor(oneof); - } - - @Override - public ContainerType getContainerType() { - return ContainerType.MESSAGE; - } - - @Override - public ExtensionRegistry.ExtensionInfo findExtensionByName( - ExtensionRegistry registry, String name) { - return registry.findImmutableExtensionByName(name); - } - - @Override - public ExtensionRegistry.ExtensionInfo findExtensionByNumber( - ExtensionRegistry registry, Descriptors.Descriptor containingType, int fieldNumber) { - return registry.findImmutableExtensionByNumber(containingType, - fieldNumber); - } - - @Override - public Object parseGroup( - CodedInputStream input, - ExtensionRegistryLite extensionRegistry, - Descriptors.FieldDescriptor field, - Message defaultInstance) - throws IOException { - Message.Builder subBuilder; - // When default instance is not null. The field is an extension field. - if (defaultInstance != null) { - subBuilder = defaultInstance.newBuilderForType(); - } else { - subBuilder = builder.newBuilderForField(field); - } - if (!field.isRepeated()) { - Message originalMessage = (Message) getField(field); - if (originalMessage != null) { - subBuilder.mergeFrom(originalMessage); - } - } - input.readGroup(field.getNumber(), subBuilder, extensionRegistry); - return subBuilder.buildPartial(); - } - - @Override - public Object parseMessage( - CodedInputStream input, - ExtensionRegistryLite extensionRegistry, - Descriptors.FieldDescriptor field, - Message defaultInstance) - throws IOException { - Message.Builder subBuilder; - // When default instance is not null. The field is an extension field. - if (defaultInstance != null) { - subBuilder = defaultInstance.newBuilderForType(); - } else { - subBuilder = builder.newBuilderForField(field); - } - if (!field.isRepeated()) { - Message originalMessage = (Message) getField(field); - if (originalMessage != null) { - subBuilder.mergeFrom(originalMessage); - } - } - input.readMessage(subBuilder, extensionRegistry); - return subBuilder.buildPartial(); - } - - @Override - public Object parseMessageFromBytes( - ByteString bytes, - ExtensionRegistryLite extensionRegistry, - Descriptors.FieldDescriptor field, - Message defaultInstance) - throws IOException { - Message.Builder subBuilder; - // When default instance is not null. The field is an extension field. - if (defaultInstance != null) { - subBuilder = defaultInstance.newBuilderForType(); - } else { - subBuilder = builder.newBuilderForField(field); - } - if (!field.isRepeated()) { - Message originalMessage = (Message) getField(field); - if (originalMessage != null) { - subBuilder.mergeFrom(originalMessage); - } - } - subBuilder.mergeFrom(bytes, extensionRegistry); - return subBuilder.buildPartial(); - } - - @Override - public MergeTarget newMergeTargetForField( - Descriptors.FieldDescriptor field, Message defaultInstance) { - if (defaultInstance != null) { - return new BuilderAdapter( - defaultInstance.newBuilderForType()); - } else { - return new BuilderAdapter(builder.newBuilderForField(field)); - } - } - - @Override - public WireFormat.Utf8Validation getUtf8Validation(Descriptors.FieldDescriptor descriptor) { - if (descriptor.needsUtf8Check()) { - return WireFormat.Utf8Validation.STRICT; - } - // TODO(liujisi): support lazy strings for repeated fields. - if (!descriptor.isRepeated() - && builder instanceof GeneratedMessage.Builder) { - return WireFormat.Utf8Validation.LAZY; - } - return WireFormat.Utf8Validation.LOOSE; - } - - @Override - public Object finish() { - return builder.buildPartial(); - } - } - - - static class ExtensionAdapter implements MergeTarget { - - private final FieldSet<Descriptors.FieldDescriptor> extensions; - - ExtensionAdapter(FieldSet<Descriptors.FieldDescriptor> extensions) { - this.extensions = extensions; - } - - @Override - public Descriptors.Descriptor getDescriptorForType() { - throw new UnsupportedOperationException( - "getDescriptorForType() called on FieldSet object"); - } - - @Override - public Object getField(Descriptors.FieldDescriptor field) { - return extensions.getField(field); - } - - @Override - public boolean hasField(Descriptors.FieldDescriptor field) { - return extensions.hasField(field); - } - - @Override - public MergeTarget setField(Descriptors.FieldDescriptor field, Object value) { - extensions.setField(field, value); - return this; - } - - @Override - public MergeTarget clearField(Descriptors.FieldDescriptor field) { - extensions.clearField(field); - return this; - } - - @Override - public MergeTarget setRepeatedField( - Descriptors.FieldDescriptor field, int index, Object value) { - extensions.setRepeatedField(field, index, value); - return this; - } - - @Override - public MergeTarget addRepeatedField(Descriptors.FieldDescriptor field, Object value) { - extensions.addRepeatedField(field, value); - return this; - } - - @Override - public boolean hasOneof(Descriptors.OneofDescriptor oneof) { - return false; - } - - @Override - public MergeTarget clearOneof(Descriptors.OneofDescriptor oneof) { - // Nothing to clear. - return this; - } - - @Override - public Descriptors.FieldDescriptor getOneofFieldDescriptor(Descriptors.OneofDescriptor oneof) { - return null; - } - - @Override - public ContainerType getContainerType() { - return ContainerType.EXTENSION_SET; - } - - @Override - public ExtensionRegistry.ExtensionInfo findExtensionByName( - ExtensionRegistry registry, String name) { - return registry.findImmutableExtensionByName(name); - } - - @Override - public ExtensionRegistry.ExtensionInfo findExtensionByNumber( - ExtensionRegistry registry, Descriptors.Descriptor containingType, int fieldNumber) { - return registry.findImmutableExtensionByNumber(containingType, - fieldNumber); - } - - @Override - public Object parseGroup( - CodedInputStream input, - ExtensionRegistryLite registry, - Descriptors.FieldDescriptor field, - Message defaultInstance) - throws IOException { - Message.Builder subBuilder = - defaultInstance.newBuilderForType(); - if (!field.isRepeated()) { - Message originalMessage = (Message) getField(field); - if (originalMessage != null) { - subBuilder.mergeFrom(originalMessage); - } - } - input.readGroup(field.getNumber(), subBuilder, registry); - return subBuilder.buildPartial(); - } - - @Override - public Object parseMessage( - CodedInputStream input, - ExtensionRegistryLite registry, - Descriptors.FieldDescriptor field, - Message defaultInstance) - throws IOException { - Message.Builder subBuilder = - defaultInstance.newBuilderForType(); - if (!field.isRepeated()) { - Message originalMessage = (Message) getField(field); - if (originalMessage != null) { - subBuilder.mergeFrom(originalMessage); - } - } - input.readMessage(subBuilder, registry); - return subBuilder.buildPartial(); - } - - @Override - public Object parseMessageFromBytes( - ByteString bytes, - ExtensionRegistryLite registry, - Descriptors.FieldDescriptor field, - Message defaultInstance) - throws IOException { - Message.Builder subBuilder = defaultInstance.newBuilderForType(); - if (!field.isRepeated()) { - Message originalMessage = (Message) getField(field); - if (originalMessage != null) { - subBuilder.mergeFrom(originalMessage); - } - } - subBuilder.mergeFrom(bytes, registry); - return subBuilder.buildPartial(); - } - - @Override - public MergeTarget newMergeTargetForField( - Descriptors.FieldDescriptor descriptor, Message defaultInstance) { - throw new UnsupportedOperationException( - "newMergeTargetForField() called on FieldSet object"); - } - - @Override - public WireFormat.Utf8Validation getUtf8Validation(Descriptors.FieldDescriptor descriptor) { - if (descriptor.needsUtf8Check()) { - return WireFormat.Utf8Validation.STRICT; - } - // TODO(liujisi): support lazy strings for ExtesnsionSet. - return WireFormat.Utf8Validation.LOOSE; - } - - @Override - public Object finish() { - throw new UnsupportedOperationException( - "finish() called on FieldSet object"); - } - } - - /** - * Parses a single field into MergeTarget. The target can be Message.Builder, - * FieldSet or MutableMessage. - * - * Package-private because it is used by GeneratedMessage.ExtendableMessage. - * - * @param tag The tag, which should have already been read. - * @return {@code true} unless the tag is an end-group tag. - */ - static boolean mergeFieldFrom( - CodedInputStream input, - UnknownFieldSet.Builder unknownFields, - ExtensionRegistryLite extensionRegistry, - Descriptors.Descriptor type, - MergeTarget target, - int tag) throws IOException { - if (type.getOptions().getMessageSetWireFormat() && - tag == WireFormat.MESSAGE_SET_ITEM_TAG) { - mergeMessageSetExtensionFromCodedStream( - input, unknownFields, extensionRegistry, type, target); - return true; - } - - final int wireType = WireFormat.getTagWireType(tag); - final int fieldNumber = WireFormat.getTagFieldNumber(tag); - - final Descriptors.FieldDescriptor field; - Message defaultInstance = null; - - if (type.isExtensionNumber(fieldNumber)) { - // extensionRegistry may be either ExtensionRegistry or - // ExtensionRegistryLite. Since the type we are parsing is a full - // message, only a full ExtensionRegistry could possibly contain - // extensions of it. Otherwise we will treat the registry as if it - // were empty. - if (extensionRegistry instanceof ExtensionRegistry) { - final ExtensionRegistry.ExtensionInfo extension = - target.findExtensionByNumber((ExtensionRegistry) extensionRegistry, - type, fieldNumber); - if (extension == null) { - field = null; - } else { - field = extension.descriptor; - defaultInstance = extension.defaultInstance; - if (defaultInstance == null && - field.getJavaType() - == Descriptors.FieldDescriptor.JavaType.MESSAGE) { - throw new IllegalStateException( - "Message-typed extension lacked default instance: " + - field.getFullName()); - } - } - } else { - field = null; - } - } else if (target.getContainerType() == MergeTarget.ContainerType.MESSAGE) { - field = type.findFieldByNumber(fieldNumber); - } else { - field = null; - } - - boolean unknown = false; - boolean packed = false; - if (field == null) { - unknown = true; // Unknown field. - } else if (wireType == FieldSet.getWireFormatForFieldType( - field.getLiteType(), - false /* isPacked */)) { - packed = false; - } else if (field.isPackable() && - wireType == FieldSet.getWireFormatForFieldType( - field.getLiteType(), - true /* isPacked */)) { - packed = true; - } else { - unknown = true; // Unknown wire type. - } - - if (unknown) { // Unknown field or wrong wire type. Skip. - return unknownFields.mergeFieldFrom(tag, input); - } - - if (packed) { - final int length = input.readRawVarint32(); - final int limit = input.pushLimit(length); - if (field.getLiteType() == WireFormat.FieldType.ENUM) { - while (input.getBytesUntilLimit() > 0) { - final int rawValue = input.readEnum(); - if (field.getFile().supportsUnknownEnumValue()) { - target.addRepeatedField(field, - field.getEnumType().findValueByNumberCreatingIfUnknown(rawValue)); - } else { - final Object value = field.getEnumType().findValueByNumber(rawValue); - if (value == null) { - // If the number isn't recognized as a valid value for this - // enum, drop it (don't even add it to unknownFields). - return true; - } - target.addRepeatedField(field, value); - } - } - } else { - while (input.getBytesUntilLimit() > 0) { - final Object value = WireFormat.readPrimitiveField( - input, field.getLiteType(), target.getUtf8Validation(field)); - target.addRepeatedField(field, value); - } - } - input.popLimit(limit); - } else { - final Object value; - switch (field.getType()) { - case GROUP: { - value = target - .parseGroup(input, extensionRegistry, field, defaultInstance); - break; - } - case MESSAGE: { - value = target - .parseMessage(input, extensionRegistry, field, defaultInstance); - break; - } - case ENUM: - final int rawValue = input.readEnum(); - if (field.getFile().supportsUnknownEnumValue()) { - value = field.getEnumType().findValueByNumberCreatingIfUnknown(rawValue); - } else { - value = field.getEnumType().findValueByNumber(rawValue); - // If the number isn't recognized as a valid value for this enum, - // drop it. - if (value == null) { - unknownFields.mergeVarintField(fieldNumber, rawValue); - return true; - } - } - break; - default: - value = WireFormat.readPrimitiveField( - input, field.getLiteType(), target.getUtf8Validation(field)); - break; - } - - if (field.isRepeated()) { - target.addRepeatedField(field, value); - } else { - target.setField(field, value); - } - } - - return true; - } - - /** - * Called by {@code #mergeFieldFrom()} to parse a MessageSet extension into - * MergeTarget. - */ - private static void mergeMessageSetExtensionFromCodedStream( - CodedInputStream input, - UnknownFieldSet.Builder unknownFields, - ExtensionRegistryLite extensionRegistry, - Descriptors.Descriptor type, - MergeTarget target) throws IOException { - - // The wire format for MessageSet is: - // message MessageSet { - // repeated group Item = 1 { - // required int32 typeId = 2; - // required bytes message = 3; - // } - // } - // "typeId" is the extension's field number. The extension can only be - // a message type, where "message" contains the encoded bytes of that - // message. - // - // In practice, we will probably never see a MessageSet item in which - // the message appears before the type ID, or where either field does not - // appear exactly once. However, in theory such cases are valid, so we - // should be prepared to accept them. - - int typeId = 0; - ByteString rawBytes = null; // If we encounter "message" before "typeId" - ExtensionRegistry.ExtensionInfo extension = null; - - // Read bytes from input, if we get it's type first then parse it eagerly, - // otherwise we store the raw bytes in a local variable. - while (true) { - final int tag = input.readTag(); - if (tag == 0) { - break; - } - - if (tag == WireFormat.MESSAGE_SET_TYPE_ID_TAG) { - typeId = input.readUInt32(); - if (typeId != 0) { - // extensionRegistry may be either ExtensionRegistry or - // ExtensionRegistryLite. Since the type we are parsing is a full - // message, only a full ExtensionRegistry could possibly contain - // extensions of it. Otherwise we will treat the registry as if it - // were empty. - if (extensionRegistry instanceof ExtensionRegistry) { - extension = target.findExtensionByNumber( - (ExtensionRegistry) extensionRegistry, type, typeId); - } - } - - } else if (tag == WireFormat.MESSAGE_SET_MESSAGE_TAG) { - if (typeId != 0) { - if (extension != null && - ExtensionRegistryLite.isEagerlyParseMessageSets()) { - // We already know the type, so we can parse directly from the - // input with no copying. Hooray! - eagerlyMergeMessageSetExtension( - input, extension, extensionRegistry, target); - rawBytes = null; - continue; - } - } - // We haven't seen a type ID yet or we want parse message lazily. - rawBytes = input.readBytes(); - - } else { // Unknown tag. Skip it. - if (!input.skipField(tag)) { - break; // End of group - } - } - } - input.checkLastTagWas(WireFormat.MESSAGE_SET_ITEM_END_TAG); - - // Process the raw bytes. - if (rawBytes != null && typeId != 0) { // Zero is not a valid type ID. - if (extension != null) { // We known the type - mergeMessageSetExtensionFromBytes( - rawBytes, extension, extensionRegistry, target); - } else { // We don't know how to parse this. Ignore it. - if (rawBytes != null) { - unknownFields.mergeField(typeId, UnknownFieldSet.Field.newBuilder() - .addLengthDelimited(rawBytes).build()); - } - } - } - } - - private static void mergeMessageSetExtensionFromBytes( - ByteString rawBytes, - ExtensionRegistry.ExtensionInfo extension, - ExtensionRegistryLite extensionRegistry, - MergeTarget target) throws IOException { - - Descriptors.FieldDescriptor field = extension.descriptor; - boolean hasOriginalValue = target.hasField(field); - - if (hasOriginalValue || ExtensionRegistryLite.isEagerlyParseMessageSets()) { - // If the field already exists, we just parse the field. - Object value = target.parseMessageFromBytes( - rawBytes, extensionRegistry,field, extension.defaultInstance); - target.setField(field, value); - } else { - // Use LazyField to load MessageSet lazily. - LazyField lazyField = new LazyField( - extension.defaultInstance, extensionRegistry, rawBytes); - target.setField(field, lazyField); - } - } - - private static void eagerlyMergeMessageSetExtension( - CodedInputStream input, - ExtensionRegistry.ExtensionInfo extension, - ExtensionRegistryLite extensionRegistry, - MergeTarget target) throws IOException { - Descriptors.FieldDescriptor field = extension.descriptor; - Object value = target.parseMessage(input, extensionRegistry, field, - extension.defaultInstance); - target.setField(field, value); - } -}