parent
6cb6bd9f21
commit
22d7248c97
9 changed files with 11 additions and 1586 deletions
@ -1,646 +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 com.google.protobuf; |
|
||||||
|
|
||||||
import com.google.protobuf.Descriptors.EnumValueDescriptor; |
|
||||||
import com.google.protobuf.Descriptors.FieldDescriptor; |
|
||||||
import com.google.protobuf.Descriptors.OneofDescriptor; |
|
||||||
import com.google.protobuf.Internal.EnumLite; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
import java.io.InputStream; |
|
||||||
import java.util.Arrays; |
|
||||||
import java.util.Collections; |
|
||||||
import java.util.HashMap; |
|
||||||
import java.util.Iterator; |
|
||||||
import java.util.List; |
|
||||||
import java.util.Map; |
|
||||||
|
|
||||||
/** |
|
||||||
* A partial implementation of the {@link Message} interface which implements |
|
||||||
* as many methods of that interface as possible in terms of other methods. |
|
||||||
* |
|
||||||
* @author kenton@google.com Kenton Varda |
|
||||||
*/ |
|
||||||
public abstract class AbstractMessage |
|
||||||
// TODO(dweis): Update GeneratedMessage to parameterize with MessageType and BuilderType.
|
|
||||||
extends AbstractMessageLite |
|
||||||
implements Message { |
|
||||||
|
|
||||||
@Override |
|
||||||
public boolean isInitialized() { |
|
||||||
return MessageReflection.isInitialized(this); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Interface for the parent of a Builder that allows the builder to |
|
||||||
* communicate invalidations back to the parent for use when using nested |
|
||||||
* builders. |
|
||||||
*/ |
|
||||||
protected interface BuilderParent { |
|
||||||
|
|
||||||
/** |
|
||||||
* A builder becomes dirty whenever a field is modified -- including fields |
|
||||||
* in nested builders -- and becomes clean when build() is called. Thus, |
|
||||||
* when a builder becomes dirty, all its parents become dirty as well, and |
|
||||||
* when it becomes clean, all its children become clean. The dirtiness |
|
||||||
* state is used to invalidate certain cached values. |
|
||||||
* <br> |
|
||||||
* To this end, a builder calls markDirty() on its parent whenever it |
|
||||||
* transitions from clean to dirty. The parent must propagate this call to |
|
||||||
* its own parent, unless it was already dirty, in which case the |
|
||||||
* grandparent must necessarily already be dirty as well. The parent can |
|
||||||
* only transition back to "clean" after calling build() on all children. |
|
||||||
*/ |
|
||||||
void markDirty(); |
|
||||||
} |
|
||||||
|
|
||||||
/** Create a nested builder. */ |
|
||||||
protected Message.Builder newBuilderForType(BuilderParent parent) { |
|
||||||
throw new UnsupportedOperationException("Nested builder is not supported for this type."); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
@Override |
|
||||||
public List<String> findInitializationErrors() { |
|
||||||
return MessageReflection.findMissingFields(this); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public String getInitializationErrorString() { |
|
||||||
return MessageReflection.delimitWithCommas(findInitializationErrors()); |
|
||||||
} |
|
||||||
|
|
||||||
/** TODO(jieluo): Clear it when all subclasses have implemented this method. */ |
|
||||||
@Override |
|
||||||
public boolean hasOneof(OneofDescriptor oneof) { |
|
||||||
throw new UnsupportedOperationException("hasOneof() is not implemented."); |
|
||||||
} |
|
||||||
|
|
||||||
/** TODO(jieluo): Clear it when all subclasses have implemented this method. */ |
|
||||||
@Override |
|
||||||
public FieldDescriptor getOneofFieldDescriptor(OneofDescriptor oneof) { |
|
||||||
throw new UnsupportedOperationException( |
|
||||||
"getOneofFieldDescriptor() is not implemented."); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public final String toString() { |
|
||||||
return TextFormat.printToString(this); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void writeTo(final CodedOutputStream output) throws IOException { |
|
||||||
MessageReflection.writeMessageTo(this, getAllFields(), output, false); |
|
||||||
} |
|
||||||
|
|
||||||
protected int memoizedSize = -1; |
|
||||||
|
|
||||||
@Override |
|
||||||
public int getSerializedSize() { |
|
||||||
int size = memoizedSize; |
|
||||||
if (size != -1) { |
|
||||||
return size; |
|
||||||
} |
|
||||||
|
|
||||||
memoizedSize = MessageReflection.getSerializedSize(this, getAllFields()); |
|
||||||
return memoizedSize; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public boolean equals(final Object other) { |
|
||||||
if (other == this) { |
|
||||||
return true; |
|
||||||
} |
|
||||||
if (!(other instanceof Message)) { |
|
||||||
return false; |
|
||||||
} |
|
||||||
final Message otherMessage = (Message) other; |
|
||||||
if (getDescriptorForType() != otherMessage.getDescriptorForType()) { |
|
||||||
return false; |
|
||||||
} |
|
||||||
return compareFields(getAllFields(), otherMessage.getAllFields()) && |
|
||||||
getUnknownFields().equals(otherMessage.getUnknownFields()); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public int hashCode() { |
|
||||||
int hash = memoizedHashCode; |
|
||||||
if (hash == 0) { |
|
||||||
hash = 41; |
|
||||||
hash = (19 * hash) + getDescriptorForType().hashCode(); |
|
||||||
hash = hashFields(hash, getAllFields()); |
|
||||||
hash = (29 * hash) + getUnknownFields().hashCode(); |
|
||||||
memoizedHashCode = hash; |
|
||||||
} |
|
||||||
return hash; |
|
||||||
} |
|
||||||
|
|
||||||
private static ByteString toByteString(Object value) { |
|
||||||
if (value instanceof byte[]) { |
|
||||||
return ByteString.copyFrom((byte[]) value); |
|
||||||
} else { |
|
||||||
return (ByteString) value; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Compares two bytes fields. The parameters must be either a byte array or a |
|
||||||
* ByteString object. They can be of different type though. |
|
||||||
*/ |
|
||||||
private static boolean compareBytes(Object a, Object b) { |
|
||||||
if (a instanceof byte[] && b instanceof byte[]) { |
|
||||||
return Arrays.equals((byte[])a, (byte[])b); |
|
||||||
} |
|
||||||
return toByteString(a).equals(toByteString(b)); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Converts a list of MapEntry messages into a Map used for equals() and |
|
||||||
* hashCode(). |
|
||||||
*/ |
|
||||||
@SuppressWarnings({"rawtypes", "unchecked"}) |
|
||||||
private static Map convertMapEntryListToMap(List list) { |
|
||||||
if (list.isEmpty()) { |
|
||||||
return Collections.emptyMap(); |
|
||||||
} |
|
||||||
Map result = new HashMap(); |
|
||||||
Iterator iterator = list.iterator(); |
|
||||||
Message entry = (Message) iterator.next(); |
|
||||||
Descriptors.Descriptor descriptor = entry.getDescriptorForType(); |
|
||||||
Descriptors.FieldDescriptor key = descriptor.findFieldByName("key"); |
|
||||||
Descriptors.FieldDescriptor value = descriptor.findFieldByName("value"); |
|
||||||
Object fieldValue = entry.getField(value); |
|
||||||
if (fieldValue instanceof EnumValueDescriptor) { |
|
||||||
fieldValue = ((EnumValueDescriptor) fieldValue).getNumber(); |
|
||||||
} |
|
||||||
result.put(entry.getField(key), fieldValue); |
|
||||||
while (iterator.hasNext()) { |
|
||||||
entry = (Message) iterator.next(); |
|
||||||
fieldValue = entry.getField(value); |
|
||||||
if (fieldValue instanceof EnumValueDescriptor) { |
|
||||||
fieldValue = ((EnumValueDescriptor) fieldValue).getNumber(); |
|
||||||
} |
|
||||||
result.put(entry.getField(key), fieldValue); |
|
||||||
} |
|
||||||
return result; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Compares two map fields. The parameters must be a list of MapEntry |
|
||||||
* messages. |
|
||||||
*/ |
|
||||||
@SuppressWarnings({"rawtypes", "unchecked"}) |
|
||||||
private static boolean compareMapField(Object a, Object b) { |
|
||||||
Map ma = convertMapEntryListToMap((List) a); |
|
||||||
Map mb = convertMapEntryListToMap((List) b); |
|
||||||
return MapFieldLite.equals(ma, mb); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Compares two set of fields. |
|
||||||
* This method is used to implement {@link AbstractMessage#equals(Object)} |
|
||||||
* and {@link AbstractMutableMessage#equals(Object)}. It takes special care |
|
||||||
* of bytes fields because immutable messages and mutable messages use |
|
||||||
* different Java type to reprensent a bytes field and this method should be |
|
||||||
* able to compare immutable messages, mutable messages and also an immutable |
|
||||||
* message to a mutable message. |
|
||||||
*/ |
|
||||||
static boolean compareFields(Map<FieldDescriptor, Object> a, |
|
||||||
Map<FieldDescriptor, Object> b) { |
|
||||||
if (a.size() != b.size()) { |
|
||||||
return false; |
|
||||||
} |
|
||||||
for (FieldDescriptor descriptor : a.keySet()) { |
|
||||||
if (!b.containsKey(descriptor)) { |
|
||||||
return false; |
|
||||||
} |
|
||||||
Object value1 = a.get(descriptor); |
|
||||||
Object value2 = b.get(descriptor); |
|
||||||
if (descriptor.getType() == FieldDescriptor.Type.BYTES) { |
|
||||||
if (descriptor.isRepeated()) { |
|
||||||
List list1 = (List) value1; |
|
||||||
List list2 = (List) value2; |
|
||||||
if (list1.size() != list2.size()) { |
|
||||||
return false; |
|
||||||
} |
|
||||||
for (int i = 0; i < list1.size(); i++) { |
|
||||||
if (!compareBytes(list1.get(i), list2.get(i))) { |
|
||||||
return false; |
|
||||||
} |
|
||||||
} |
|
||||||
} else { |
|
||||||
// Compares a singular bytes field.
|
|
||||||
if (!compareBytes(value1, value2)) { |
|
||||||
return false; |
|
||||||
} |
|
||||||
} |
|
||||||
} else if (descriptor.isMapField()) { |
|
||||||
if (!compareMapField(value1, value2)) { |
|
||||||
return false; |
|
||||||
} |
|
||||||
} else { |
|
||||||
// Compare non-bytes fields.
|
|
||||||
if (!value1.equals(value2)) { |
|
||||||
return false; |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
return true; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Calculates the hash code of a map field. {@code value} must be a list of |
|
||||||
* MapEntry messages. |
|
||||||
*/ |
|
||||||
@SuppressWarnings("unchecked") |
|
||||||
private static int hashMapField(Object value) { |
|
||||||
return MapFieldLite.calculateHashCodeForMap(convertMapEntryListToMap((List) value)); |
|
||||||
} |
|
||||||
|
|
||||||
/** Get a hash code for given fields and values, using the given seed. */ |
|
||||||
@SuppressWarnings("unchecked") |
|
||||||
protected static int hashFields(int hash, Map<FieldDescriptor, Object> map) { |
|
||||||
for (Map.Entry<FieldDescriptor, Object> entry : map.entrySet()) { |
|
||||||
FieldDescriptor field = entry.getKey(); |
|
||||||
Object value = entry.getValue(); |
|
||||||
hash = (37 * hash) + field.getNumber(); |
|
||||||
if (field.isMapField()) { |
|
||||||
hash = (53 * hash) + hashMapField(value); |
|
||||||
} else if (field.getType() != FieldDescriptor.Type.ENUM){ |
|
||||||
hash = (53 * hash) + value.hashCode(); |
|
||||||
} else if (field.isRepeated()) { |
|
||||||
List<? extends EnumLite> list = (List<? extends EnumLite>) value; |
|
||||||
hash = (53 * hash) + Internal.hashEnumList(list); |
|
||||||
} else { |
|
||||||
hash = (53 * hash) + Internal.hashEnum((EnumLite) value); |
|
||||||
} |
|
||||||
} |
|
||||||
return hash; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Package private helper method for AbstractParser to create |
|
||||||
* UninitializedMessageException with missing field information. |
|
||||||
*/ |
|
||||||
@Override |
|
||||||
UninitializedMessageException newUninitializedMessageException() { |
|
||||||
return Builder.newUninitializedMessageException(this); |
|
||||||
} |
|
||||||
|
|
||||||
// =================================================================
|
|
||||||
|
|
||||||
/** |
|
||||||
* A partial implementation of the {@link Message.Builder} interface which |
|
||||||
* implements as many methods of that interface as possible in terms of |
|
||||||
* other methods. |
|
||||||
*/ |
|
||||||
@SuppressWarnings("unchecked") |
|
||||||
public static abstract class Builder<BuilderType extends Builder<BuilderType>> |
|
||||||
extends AbstractMessageLite.Builder |
|
||||||
implements Message.Builder { |
|
||||||
// The compiler produces an error if this is not declared explicitly.
|
|
||||||
@Override |
|
||||||
public abstract BuilderType clone(); |
|
||||||
|
|
||||||
/** TODO(jieluo): Clear it when all subclasses have implemented this method. */ |
|
||||||
@Override |
|
||||||
public boolean hasOneof(OneofDescriptor oneof) { |
|
||||||
throw new UnsupportedOperationException("hasOneof() is not implemented."); |
|
||||||
} |
|
||||||
|
|
||||||
/** TODO(jieluo): Clear it when all subclasses have implemented this method. */ |
|
||||||
@Override |
|
||||||
public FieldDescriptor getOneofFieldDescriptor(OneofDescriptor oneof) { |
|
||||||
throw new UnsupportedOperationException( |
|
||||||
"getOneofFieldDescriptor() is not implemented."); |
|
||||||
} |
|
||||||
|
|
||||||
/** TODO(jieluo): Clear it when all subclasses have implemented this method. */ |
|
||||||
@Override |
|
||||||
public BuilderType clearOneof(OneofDescriptor oneof) { |
|
||||||
throw new UnsupportedOperationException("clearOneof() is not implemented."); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public BuilderType clear() { |
|
||||||
for (final Map.Entry<FieldDescriptor, Object> entry : |
|
||||||
getAllFields().entrySet()) { |
|
||||||
clearField(entry.getKey()); |
|
||||||
} |
|
||||||
return (BuilderType) this; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public List<String> findInitializationErrors() { |
|
||||||
return MessageReflection.findMissingFields(this); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public String getInitializationErrorString() { |
|
||||||
return MessageReflection.delimitWithCommas(findInitializationErrors()); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
protected BuilderType internalMergeFrom(AbstractMessageLite other) { |
|
||||||
return mergeFrom((Message) other); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public BuilderType mergeFrom(final Message other) { |
|
||||||
if (other.getDescriptorForType() != getDescriptorForType()) { |
|
||||||
throw new IllegalArgumentException( |
|
||||||
"mergeFrom(Message) can only merge messages of the same type."); |
|
||||||
} |
|
||||||
|
|
||||||
// Note: We don't attempt to verify that other's fields have valid
|
|
||||||
// types. Doing so would be a losing battle. We'd have to verify
|
|
||||||
// all sub-messages as well, and we'd have to make copies of all of
|
|
||||||
// them to insure that they don't change after verification (since
|
|
||||||
// the Message interface itself cannot enforce immutability of
|
|
||||||
// implementations).
|
|
||||||
// TODO(kenton): Provide a function somewhere called makeDeepCopy()
|
|
||||||
// which allows people to make secure deep copies of messages.
|
|
||||||
|
|
||||||
for (final Map.Entry<FieldDescriptor, Object> entry : |
|
||||||
other.getAllFields().entrySet()) { |
|
||||||
final FieldDescriptor field = entry.getKey(); |
|
||||||
if (field.isRepeated()) { |
|
||||||
for (final Object element : (List)entry.getValue()) { |
|
||||||
addRepeatedField(field, element); |
|
||||||
} |
|
||||||
} else if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) { |
|
||||||
final Message existingValue = (Message)getField(field); |
|
||||||
if (existingValue == existingValue.getDefaultInstanceForType()) { |
|
||||||
setField(field, entry.getValue()); |
|
||||||
} else { |
|
||||||
setField(field, |
|
||||||
existingValue.newBuilderForType() |
|
||||||
.mergeFrom(existingValue) |
|
||||||
.mergeFrom((Message)entry.getValue()) |
|
||||||
.build()); |
|
||||||
} |
|
||||||
} else { |
|
||||||
setField(field, entry.getValue()); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
mergeUnknownFields(other.getUnknownFields()); |
|
||||||
|
|
||||||
return (BuilderType) this; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public BuilderType mergeFrom(final CodedInputStream input) |
|
||||||
throws IOException { |
|
||||||
return mergeFrom(input, ExtensionRegistry.getEmptyRegistry()); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public BuilderType mergeFrom( |
|
||||||
final CodedInputStream input, |
|
||||||
final ExtensionRegistryLite extensionRegistry) |
|
||||||
throws IOException { |
|
||||||
final UnknownFieldSet.Builder unknownFields = |
|
||||||
UnknownFieldSet.newBuilder(getUnknownFields()); |
|
||||||
while (true) { |
|
||||||
final int tag = input.readTag(); |
|
||||||
if (tag == 0) { |
|
||||||
break; |
|
||||||
} |
|
||||||
|
|
||||||
MessageReflection.BuilderAdapter builderAdapter = |
|
||||||
new MessageReflection.BuilderAdapter(this); |
|
||||||
if (!MessageReflection.mergeFieldFrom(input, unknownFields, |
|
||||||
extensionRegistry, |
|
||||||
getDescriptorForType(), |
|
||||||
builderAdapter, |
|
||||||
tag)) { |
|
||||||
// end group tag
|
|
||||||
break; |
|
||||||
} |
|
||||||
} |
|
||||||
setUnknownFields(unknownFields.build()); |
|
||||||
return (BuilderType) this; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public BuilderType mergeUnknownFields(final UnknownFieldSet unknownFields) { |
|
||||||
setUnknownFields( |
|
||||||
UnknownFieldSet.newBuilder(getUnknownFields()) |
|
||||||
.mergeFrom(unknownFields) |
|
||||||
.build()); |
|
||||||
return (BuilderType) this; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public Message.Builder getFieldBuilder(final FieldDescriptor field) { |
|
||||||
throw new UnsupportedOperationException( |
|
||||||
"getFieldBuilder() called on an unsupported message type."); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public Message.Builder getRepeatedFieldBuilder(final FieldDescriptor field, int index) { |
|
||||||
throw new UnsupportedOperationException( |
|
||||||
"getRepeatedFieldBuilder() called on an unsupported message type."); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public String toString() { |
|
||||||
return TextFormat.printToString(this); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Construct an UninitializedMessageException reporting missing fields in |
|
||||||
* the given message. |
|
||||||
*/ |
|
||||||
protected static UninitializedMessageException |
|
||||||
newUninitializedMessageException(Message message) { |
|
||||||
return new UninitializedMessageException( |
|
||||||
MessageReflection.findMissingFields(message)); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Used to support nested builders and called to mark this builder as clean. |
|
||||||
* Clean builders will propagate the {@link BuilderParent#markDirty()} event |
|
||||||
* to their parent builders, while dirty builders will not, as their parents |
|
||||||
* should be dirty already. |
|
||||||
* |
|
||||||
* NOTE: Implementations that don't support nested builders don't need to |
|
||||||
* override this method. |
|
||||||
*/ |
|
||||||
void markClean() { |
|
||||||
throw new IllegalStateException("Should be overridden by subclasses."); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Used to support nested builders and called when this nested builder is |
|
||||||
* no longer used by its parent builder and should release the reference |
|
||||||
* to its parent builder. |
|
||||||
* |
|
||||||
* NOTE: Implementations that don't support nested builders don't need to |
|
||||||
* override this method. |
|
||||||
*/ |
|
||||||
void dispose() { |
|
||||||
throw new IllegalStateException("Should be overridden by subclasses."); |
|
||||||
} |
|
||||||
|
|
||||||
// ===============================================================
|
|
||||||
// The following definitions seem to be required in order to make javac
|
|
||||||
// not produce weird errors like:
|
|
||||||
//
|
|
||||||
// java/com/google/protobuf/DynamicMessage.java:203: types
|
|
||||||
// com.google.protobuf.AbstractMessage.Builder<
|
|
||||||
// com.google.protobuf.DynamicMessage.Builder> and
|
|
||||||
// com.google.protobuf.AbstractMessage.Builder<
|
|
||||||
// com.google.protobuf.DynamicMessage.Builder> are incompatible; both
|
|
||||||
// define mergeFrom(com.google.protobuf.ByteString), but with unrelated
|
|
||||||
// return types.
|
|
||||||
//
|
|
||||||
// Strangely, these lines are only needed if javac is invoked separately
|
|
||||||
// on AbstractMessage.java and AbstractMessageLite.java. If javac is
|
|
||||||
// invoked on both simultaneously, it works. (Or maybe the important
|
|
||||||
// point is whether or not DynamicMessage.java is compiled together with
|
|
||||||
// AbstractMessageLite.java -- not sure.) I suspect this is a compiler
|
|
||||||
// bug.
|
|
||||||
|
|
||||||
@Override |
|
||||||
public BuilderType mergeFrom(final ByteString data) |
|
||||||
throws InvalidProtocolBufferException { |
|
||||||
return (BuilderType) super.mergeFrom(data); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public BuilderType mergeFrom( |
|
||||||
final ByteString data, |
|
||||||
final ExtensionRegistryLite extensionRegistry) |
|
||||||
throws InvalidProtocolBufferException { |
|
||||||
return (BuilderType) super.mergeFrom(data, extensionRegistry); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public BuilderType mergeFrom(final byte[] data) |
|
||||||
throws InvalidProtocolBufferException { |
|
||||||
return (BuilderType) super.mergeFrom(data); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public BuilderType mergeFrom( |
|
||||||
final byte[] data, final int off, final int len) |
|
||||||
throws InvalidProtocolBufferException { |
|
||||||
return (BuilderType) super.mergeFrom(data, off, len); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public BuilderType mergeFrom( |
|
||||||
final byte[] data, |
|
||||||
final ExtensionRegistryLite extensionRegistry) |
|
||||||
throws InvalidProtocolBufferException { |
|
||||||
return (BuilderType) super.mergeFrom(data, extensionRegistry); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public BuilderType mergeFrom( |
|
||||||
final byte[] data, final int off, final int len, |
|
||||||
final ExtensionRegistryLite extensionRegistry) |
|
||||||
throws InvalidProtocolBufferException { |
|
||||||
return (BuilderType) super.mergeFrom(data, off, len, extensionRegistry); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public BuilderType mergeFrom(final InputStream input) |
|
||||||
throws IOException { |
|
||||||
return (BuilderType) super.mergeFrom(input); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public BuilderType mergeFrom( |
|
||||||
final InputStream input, |
|
||||||
final ExtensionRegistryLite extensionRegistry) |
|
||||||
throws IOException { |
|
||||||
return (BuilderType) super.mergeFrom(input, extensionRegistry); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public boolean mergeDelimitedFrom(final InputStream input) |
|
||||||
throws IOException { |
|
||||||
return super.mergeDelimitedFrom(input); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public boolean mergeDelimitedFrom( |
|
||||||
final InputStream input, |
|
||||||
final ExtensionRegistryLite extensionRegistry) |
|
||||||
throws IOException { |
|
||||||
return super.mergeDelimitedFrom(input, extensionRegistry); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* @deprecated from v3.0.0-beta-3+, for compatibility with v2.5.0 and v2.6.1 |
|
||||||
* generated code. |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
protected static int hashLong(long n) { |
|
||||||
return (int) (n ^ (n >>> 32)); |
|
||||||
} |
|
||||||
//
|
|
||||||
/** |
|
||||||
* @deprecated from v3.0.0-beta-3+, for compatibility with v2.5.0 and v2.6.1 |
|
||||||
* generated code. |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
protected static int hashBoolean(boolean b) { |
|
||||||
return b ? 1231 : 1237; |
|
||||||
} |
|
||||||
//
|
|
||||||
/** |
|
||||||
* @deprecated from v3.0.0-beta-3+, for compatibility with v2.5.0 and v2.6.1 |
|
||||||
* generated code. |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
protected static int hashEnum(EnumLite e) { |
|
||||||
return e.getNumber(); |
|
||||||
} |
|
||||||
//
|
|
||||||
/** |
|
||||||
* @deprecated from v3.0.0-beta-3+, for compatibility with v2.5.0 and v2.6.1 |
|
||||||
* generated code. |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
protected static int hashEnumList(List<? extends EnumLite> list) { |
|
||||||
int hash = 1; |
|
||||||
for (EnumLite e : list) { |
|
||||||
hash = 31 * hash + hashEnum(e); |
|
||||||
} |
|
||||||
return hash; |
|
||||||
} |
|
||||||
} |
|
@ -1,384 +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 com.google.protobuf; |
|
||||||
|
|
||||||
import java.io.FilterInputStream; |
|
||||||
import java.io.IOException; |
|
||||||
import java.io.InputStream; |
|
||||||
import java.io.OutputStream; |
|
||||||
import java.util.Collection; |
|
||||||
|
|
||||||
/** |
|
||||||
* A partial implementation of the {@link MessageLite} interface which |
|
||||||
* implements as many methods of that interface as possible in terms of other |
|
||||||
* methods. |
|
||||||
* |
|
||||||
* @author kenton@google.com Kenton Varda |
|
||||||
*/ |
|
||||||
public abstract class AbstractMessageLite< |
|
||||||
MessageType extends AbstractMessageLite<MessageType, BuilderType>, |
|
||||||
BuilderType extends AbstractMessageLite.Builder<MessageType, BuilderType>> |
|
||||||
implements MessageLite { |
|
||||||
protected int memoizedHashCode = 0; |
|
||||||
|
|
||||||
@Override |
|
||||||
public ByteString toByteString() { |
|
||||||
try { |
|
||||||
final ByteString.CodedBuilder out = |
|
||||||
ByteString.newCodedBuilder(getSerializedSize()); |
|
||||||
writeTo(out.getCodedOutput()); |
|
||||||
return out.build(); |
|
||||||
} catch (IOException e) { |
|
||||||
throw new RuntimeException(getSerializingExceptionMessage("ByteString"), e); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public byte[] toByteArray() { |
|
||||||
try { |
|
||||||
final byte[] result = new byte[getSerializedSize()]; |
|
||||||
final CodedOutputStream output = CodedOutputStream.newInstance(result); |
|
||||||
writeTo(output); |
|
||||||
output.checkNoSpaceLeft(); |
|
||||||
return result; |
|
||||||
} catch (IOException e) { |
|
||||||
throw new RuntimeException(getSerializingExceptionMessage("byte array"), e); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void writeTo(final OutputStream output) throws IOException { |
|
||||||
final int bufferSize = |
|
||||||
CodedOutputStream.computePreferredBufferSize(getSerializedSize()); |
|
||||||
final CodedOutputStream codedOutput = |
|
||||||
CodedOutputStream.newInstance(output, bufferSize); |
|
||||||
writeTo(codedOutput); |
|
||||||
codedOutput.flush(); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void writeDelimitedTo(final OutputStream output) throws IOException { |
|
||||||
final int serialized = getSerializedSize(); |
|
||||||
final int bufferSize = CodedOutputStream.computePreferredBufferSize( |
|
||||||
CodedOutputStream.computeRawVarint32Size(serialized) + serialized); |
|
||||||
final CodedOutputStream codedOutput = |
|
||||||
CodedOutputStream.newInstance(output, bufferSize); |
|
||||||
codedOutput.writeRawVarint32(serialized); |
|
||||||
writeTo(codedOutput); |
|
||||||
codedOutput.flush(); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Package private helper method for AbstractParser to create |
|
||||||
* UninitializedMessageException. |
|
||||||
*/ |
|
||||||
UninitializedMessageException newUninitializedMessageException() { |
|
||||||
return new UninitializedMessageException(this); |
|
||||||
} |
|
||||||
|
|
||||||
private String getSerializingExceptionMessage(String target) { |
|
||||||
return "Serializing " + getClass().getName() + " to a " + target |
|
||||||
+ " threw an IOException (should never happen)."; |
|
||||||
} |
|
||||||
|
|
||||||
protected static void checkByteStringIsUtf8(ByteString byteString) |
|
||||||
throws IllegalArgumentException { |
|
||||||
if (!byteString.isValidUtf8()) { |
|
||||||
throw new IllegalArgumentException("Byte string is not UTF-8."); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
protected static <T> void addAll(final Iterable<T> values, |
|
||||||
final Collection<? super T> list) { |
|
||||||
Builder.addAll(values, list); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* A partial implementation of the {@link Message.Builder} interface which |
|
||||||
* implements as many methods of that interface as possible in terms of |
|
||||||
* other methods. |
|
||||||
*/ |
|
||||||
@SuppressWarnings("unchecked") |
|
||||||
public abstract static class Builder< |
|
||||||
MessageType extends AbstractMessageLite<MessageType, BuilderType>, |
|
||||||
BuilderType extends Builder<MessageType, BuilderType>> |
|
||||||
implements MessageLite.Builder { |
|
||||||
// The compiler produces an error if this is not declared explicitly.
|
|
||||||
@Override |
|
||||||
public abstract BuilderType clone(); |
|
||||||
|
|
||||||
@Override |
|
||||||
public BuilderType mergeFrom(final CodedInputStream input) throws IOException { |
|
||||||
return mergeFrom(input, ExtensionRegistryLite.getEmptyRegistry()); |
|
||||||
} |
|
||||||
|
|
||||||
// Re-defined here for return type covariance.
|
|
||||||
@Override |
|
||||||
public abstract BuilderType mergeFrom( |
|
||||||
final CodedInputStream input, final ExtensionRegistryLite extensionRegistry) |
|
||||||
throws IOException; |
|
||||||
|
|
||||||
@Override |
|
||||||
public BuilderType mergeFrom(final ByteString data) throws InvalidProtocolBufferException { |
|
||||||
try { |
|
||||||
final CodedInputStream input = data.newCodedInput(); |
|
||||||
mergeFrom(input); |
|
||||||
input.checkLastTagWas(0); |
|
||||||
return (BuilderType) this; |
|
||||||
} catch (InvalidProtocolBufferException e) { |
|
||||||
throw e; |
|
||||||
} catch (IOException e) { |
|
||||||
throw new RuntimeException(getReadingExceptionMessage("ByteString"), e); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public BuilderType mergeFrom( |
|
||||||
final ByteString data, final ExtensionRegistryLite extensionRegistry) |
|
||||||
throws InvalidProtocolBufferException { |
|
||||||
try { |
|
||||||
final CodedInputStream input = data.newCodedInput(); |
|
||||||
mergeFrom(input, extensionRegistry); |
|
||||||
input.checkLastTagWas(0); |
|
||||||
return (BuilderType) this; |
|
||||||
} catch (InvalidProtocolBufferException e) { |
|
||||||
throw e; |
|
||||||
} catch (IOException e) { |
|
||||||
throw new RuntimeException(getReadingExceptionMessage("ByteString"), e); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public BuilderType mergeFrom(final byte[] data) throws InvalidProtocolBufferException { |
|
||||||
return mergeFrom(data, 0, data.length); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public BuilderType mergeFrom(final byte[] data, final int off, final int len) |
|
||||||
throws InvalidProtocolBufferException { |
|
||||||
try { |
|
||||||
final CodedInputStream input = |
|
||||||
CodedInputStream.newInstance(data, off, len); |
|
||||||
mergeFrom(input); |
|
||||||
input.checkLastTagWas(0); |
|
||||||
return (BuilderType) this; |
|
||||||
} catch (InvalidProtocolBufferException e) { |
|
||||||
throw e; |
|
||||||
} catch (IOException e) { |
|
||||||
throw new RuntimeException(getReadingExceptionMessage("byte array"), e); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public BuilderType mergeFrom(final byte[] data, final ExtensionRegistryLite extensionRegistry) |
|
||||||
throws InvalidProtocolBufferException { |
|
||||||
return mergeFrom(data, 0, data.length, extensionRegistry); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public BuilderType mergeFrom( |
|
||||||
final byte[] data, |
|
||||||
final int off, |
|
||||||
final int len, |
|
||||||
final ExtensionRegistryLite extensionRegistry) |
|
||||||
throws InvalidProtocolBufferException { |
|
||||||
try { |
|
||||||
final CodedInputStream input = |
|
||||||
CodedInputStream.newInstance(data, off, len); |
|
||||||
mergeFrom(input, extensionRegistry); |
|
||||||
input.checkLastTagWas(0); |
|
||||||
return (BuilderType) this; |
|
||||||
} catch (InvalidProtocolBufferException e) { |
|
||||||
throw e; |
|
||||||
} catch (IOException e) { |
|
||||||
throw new RuntimeException(getReadingExceptionMessage("byte array"), e); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public BuilderType mergeFrom(final InputStream input) throws IOException { |
|
||||||
final CodedInputStream codedInput = CodedInputStream.newInstance(input); |
|
||||||
mergeFrom(codedInput); |
|
||||||
codedInput.checkLastTagWas(0); |
|
||||||
return (BuilderType) this; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public BuilderType mergeFrom( |
|
||||||
final InputStream input, final ExtensionRegistryLite extensionRegistry) throws IOException { |
|
||||||
final CodedInputStream codedInput = CodedInputStream.newInstance(input); |
|
||||||
mergeFrom(codedInput, extensionRegistry); |
|
||||||
codedInput.checkLastTagWas(0); |
|
||||||
return (BuilderType) this; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* An InputStream implementations which reads from some other InputStream |
|
||||||
* but is limited to a particular number of bytes. Used by |
|
||||||
* mergeDelimitedFrom(). This is intentionally package-private so that |
|
||||||
* UnknownFieldSet can share it. |
|
||||||
*/ |
|
||||||
static final class LimitedInputStream extends FilterInputStream { |
|
||||||
private int limit; |
|
||||||
|
|
||||||
LimitedInputStream(InputStream in, int limit) { |
|
||||||
super(in); |
|
||||||
this.limit = limit; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public int available() throws IOException { |
|
||||||
return Math.min(super.available(), limit); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public int read() throws IOException { |
|
||||||
if (limit <= 0) { |
|
||||||
return -1; |
|
||||||
} |
|
||||||
final int result = super.read(); |
|
||||||
if (result >= 0) { |
|
||||||
--limit; |
|
||||||
} |
|
||||||
return result; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public int read(final byte[] b, final int off, int len) |
|
||||||
throws IOException { |
|
||||||
if (limit <= 0) { |
|
||||||
return -1; |
|
||||||
} |
|
||||||
len = Math.min(len, limit); |
|
||||||
final int result = super.read(b, off, len); |
|
||||||
if (result >= 0) { |
|
||||||
limit -= result; |
|
||||||
} |
|
||||||
return result; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public long skip(final long n) throws IOException { |
|
||||||
final long result = super.skip(Math.min(n, limit)); |
|
||||||
if (result >= 0) { |
|
||||||
limit -= result; |
|
||||||
} |
|
||||||
return result; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public boolean mergeDelimitedFrom( |
|
||||||
final InputStream input, final ExtensionRegistryLite extensionRegistry) throws IOException { |
|
||||||
final int firstByte = input.read(); |
|
||||||
if (firstByte == -1) { |
|
||||||
return false; |
|
||||||
} |
|
||||||
final int size = CodedInputStream.readRawVarint32(firstByte, input); |
|
||||||
final InputStream limitedInput = new LimitedInputStream(input, size); |
|
||||||
mergeFrom(limitedInput, extensionRegistry); |
|
||||||
return true; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public boolean mergeDelimitedFrom(final InputStream input) throws IOException { |
|
||||||
return mergeDelimitedFrom(input, |
|
||||||
ExtensionRegistryLite.getEmptyRegistry()); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
@SuppressWarnings("unchecked") // isInstance takes care of this
|
|
||||||
public BuilderType mergeFrom(final MessageLite other) { |
|
||||||
if (!getDefaultInstanceForType().getClass().isInstance(other)) { |
|
||||||
throw new IllegalArgumentException( |
|
||||||
"mergeFrom(MessageLite) can only merge messages of the same type."); |
|
||||||
} |
|
||||||
|
|
||||||
return internalMergeFrom((MessageType) other); |
|
||||||
} |
|
||||||
|
|
||||||
protected abstract BuilderType internalMergeFrom(MessageType message); |
|
||||||
|
|
||||||
private String getReadingExceptionMessage(String target) { |
|
||||||
return "Reading " + getClass().getName() + " from a " + target |
|
||||||
+ " threw an IOException (should never happen)."; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Construct an UninitializedMessageException reporting missing fields in |
|
||||||
* the given message. |
|
||||||
*/ |
|
||||||
protected static UninitializedMessageException |
|
||||||
newUninitializedMessageException(MessageLite message) { |
|
||||||
return new UninitializedMessageException(message); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Adds the {@code values} to the {@code list}. This is a helper method |
|
||||||
* used by generated code. Users should ignore it. |
|
||||||
* |
|
||||||
* @throws NullPointerException if {@code values} or any of the elements of |
|
||||||
* {@code values} is null. When that happens, some elements of |
|
||||||
* {@code values} may have already been added to the result {@code list}. |
|
||||||
*/ |
|
||||||
protected static <T> void addAll(final Iterable<T> values, |
|
||||||
final Collection<? super T> list) { |
|
||||||
if (values == null) { |
|
||||||
throw new NullPointerException(); |
|
||||||
} |
|
||||||
if (values instanceof LazyStringList) { |
|
||||||
// For StringOrByteStringLists, check the underlying elements to avoid
|
|
||||||
// forcing conversions of ByteStrings to Strings.
|
|
||||||
checkForNullValues(((LazyStringList) values).getUnderlyingElements()); |
|
||||||
list.addAll((Collection<T>) values); |
|
||||||
} else if (values instanceof Collection) { |
|
||||||
checkForNullValues(values); |
|
||||||
list.addAll((Collection<T>) values); |
|
||||||
} else { |
|
||||||
for (final T value : values) { |
|
||||||
if (value == null) { |
|
||||||
throw new NullPointerException(); |
|
||||||
} |
|
||||||
list.add(value); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
private static void checkForNullValues(final Iterable<?> values) { |
|
||||||
for (final Object value : values) { |
|
||||||
if (value == null) { |
|
||||||
throw new NullPointerException(); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,258 +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 com.google.protobuf; |
|
||||||
|
|
||||||
import com.google.protobuf.AbstractMessageLite.Builder.LimitedInputStream; |
|
||||||
|
|
||||||
import java.io.IOException; |
|
||||||
import java.io.InputStream; |
|
||||||
|
|
||||||
/** |
|
||||||
* A partial implementation of the {@link Parser} interface which implements |
|
||||||
* as many methods of that interface as possible in terms of other methods. |
|
||||||
* |
|
||||||
* Note: This class implements all the convenience methods in the |
|
||||||
* {@link Parser} interface. See {@link Parser} for related javadocs. |
|
||||||
* Subclasses need to implement |
|
||||||
* {@link Parser#parsePartialFrom(CodedInputStream, ExtensionRegistryLite)} |
|
||||||
* |
|
||||||
* @author liujisi@google.com (Pherl Liu) |
|
||||||
*/ |
|
||||||
public abstract class AbstractParser<MessageType extends MessageLite> |
|
||||||
implements Parser<MessageType> { |
|
||||||
/** |
|
||||||
* Creates an UninitializedMessageException for MessageType. |
|
||||||
*/ |
|
||||||
private UninitializedMessageException |
|
||||||
newUninitializedMessageException(MessageType message) { |
|
||||||
if (message instanceof AbstractMessageLite) { |
|
||||||
return ((AbstractMessageLite) message).newUninitializedMessageException(); |
|
||||||
} |
|
||||||
return new UninitializedMessageException(message); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Helper method to check if message is initialized. |
|
||||||
* |
|
||||||
* @throws InvalidProtocolBufferException if it is not initialized. |
|
||||||
* @return The message to check. |
|
||||||
*/ |
|
||||||
private MessageType checkMessageInitialized(MessageType message) |
|
||||||
throws InvalidProtocolBufferException { |
|
||||||
if (message != null && !message.isInitialized()) { |
|
||||||
throw newUninitializedMessageException(message) |
|
||||||
.asInvalidProtocolBufferException() |
|
||||||
.setUnfinishedMessage(message); |
|
||||||
} |
|
||||||
return message; |
|
||||||
} |
|
||||||
|
|
||||||
private static final ExtensionRegistryLite EMPTY_REGISTRY |
|
||||||
= ExtensionRegistryLite.getEmptyRegistry(); |
|
||||||
|
|
||||||
@Override |
|
||||||
public MessageType parsePartialFrom(CodedInputStream input) |
|
||||||
throws InvalidProtocolBufferException { |
|
||||||
return parsePartialFrom(input, EMPTY_REGISTRY); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public MessageType parseFrom(CodedInputStream input, ExtensionRegistryLite extensionRegistry) |
|
||||||
throws InvalidProtocolBufferException { |
|
||||||
return checkMessageInitialized( |
|
||||||
parsePartialFrom(input, extensionRegistry)); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public MessageType parseFrom(CodedInputStream input) throws InvalidProtocolBufferException { |
|
||||||
return parseFrom(input, EMPTY_REGISTRY); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public MessageType parsePartialFrom(ByteString data, ExtensionRegistryLite extensionRegistry) |
|
||||||
throws InvalidProtocolBufferException { |
|
||||||
MessageType message; |
|
||||||
try { |
|
||||||
CodedInputStream input = data.newCodedInput(); |
|
||||||
message = parsePartialFrom(input, extensionRegistry); |
|
||||||
try { |
|
||||||
input.checkLastTagWas(0); |
|
||||||
} catch (InvalidProtocolBufferException e) { |
|
||||||
throw e.setUnfinishedMessage(message); |
|
||||||
} |
|
||||||
return message; |
|
||||||
} catch (InvalidProtocolBufferException e) { |
|
||||||
throw e; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public MessageType parsePartialFrom(ByteString data) throws InvalidProtocolBufferException { |
|
||||||
return parsePartialFrom(data, EMPTY_REGISTRY); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public MessageType parseFrom(ByteString data, ExtensionRegistryLite extensionRegistry) |
|
||||||
throws InvalidProtocolBufferException { |
|
||||||
return checkMessageInitialized(parsePartialFrom(data, extensionRegistry)); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public MessageType parseFrom(ByteString data) throws InvalidProtocolBufferException { |
|
||||||
return parseFrom(data, EMPTY_REGISTRY); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public MessageType parsePartialFrom( |
|
||||||
byte[] data, int off, int len, ExtensionRegistryLite extensionRegistry) |
|
||||||
throws InvalidProtocolBufferException { |
|
||||||
try { |
|
||||||
CodedInputStream input = CodedInputStream.newInstance(data, off, len); |
|
||||||
MessageType message = parsePartialFrom(input, extensionRegistry); |
|
||||||
try { |
|
||||||
input.checkLastTagWas(0); |
|
||||||
} catch (InvalidProtocolBufferException e) { |
|
||||||
throw e.setUnfinishedMessage(message); |
|
||||||
} |
|
||||||
return message; |
|
||||||
} catch (InvalidProtocolBufferException e) { |
|
||||||
throw e; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public MessageType parsePartialFrom(byte[] data, int off, int len) |
|
||||||
throws InvalidProtocolBufferException { |
|
||||||
return parsePartialFrom(data, off, len, EMPTY_REGISTRY); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public MessageType parsePartialFrom(byte[] data, ExtensionRegistryLite extensionRegistry) |
|
||||||
throws InvalidProtocolBufferException { |
|
||||||
return parsePartialFrom(data, 0, data.length, extensionRegistry); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public MessageType parsePartialFrom(byte[] data) throws InvalidProtocolBufferException { |
|
||||||
return parsePartialFrom(data, 0, data.length, EMPTY_REGISTRY); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public MessageType parseFrom( |
|
||||||
byte[] data, int off, int len, ExtensionRegistryLite extensionRegistry) |
|
||||||
throws InvalidProtocolBufferException { |
|
||||||
return checkMessageInitialized( |
|
||||||
parsePartialFrom(data, off, len, extensionRegistry)); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public MessageType parseFrom(byte[] data, int off, int len) |
|
||||||
throws InvalidProtocolBufferException { |
|
||||||
return parseFrom(data, off, len, EMPTY_REGISTRY); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public MessageType parseFrom(byte[] data, ExtensionRegistryLite extensionRegistry) |
|
||||||
throws InvalidProtocolBufferException { |
|
||||||
return parseFrom(data, 0, data.length, extensionRegistry); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public MessageType parseFrom(byte[] data) throws InvalidProtocolBufferException { |
|
||||||
return parseFrom(data, EMPTY_REGISTRY); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public MessageType parsePartialFrom(InputStream input, ExtensionRegistryLite extensionRegistry) |
|
||||||
throws InvalidProtocolBufferException { |
|
||||||
CodedInputStream codedInput = CodedInputStream.newInstance(input); |
|
||||||
MessageType message = parsePartialFrom(codedInput, extensionRegistry); |
|
||||||
try { |
|
||||||
codedInput.checkLastTagWas(0); |
|
||||||
} catch (InvalidProtocolBufferException e) { |
|
||||||
throw e.setUnfinishedMessage(message); |
|
||||||
} |
|
||||||
return message; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public MessageType parsePartialFrom(InputStream input) throws InvalidProtocolBufferException { |
|
||||||
return parsePartialFrom(input, EMPTY_REGISTRY); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public MessageType parseFrom(InputStream input, ExtensionRegistryLite extensionRegistry) |
|
||||||
throws InvalidProtocolBufferException { |
|
||||||
return checkMessageInitialized( |
|
||||||
parsePartialFrom(input, extensionRegistry)); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public MessageType parseFrom(InputStream input) throws InvalidProtocolBufferException { |
|
||||||
return parseFrom(input, EMPTY_REGISTRY); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public MessageType parsePartialDelimitedFrom( |
|
||||||
InputStream input, ExtensionRegistryLite extensionRegistry) |
|
||||||
throws InvalidProtocolBufferException { |
|
||||||
int size; |
|
||||||
try { |
|
||||||
int firstByte = input.read(); |
|
||||||
if (firstByte == -1) { |
|
||||||
return null; |
|
||||||
} |
|
||||||
size = CodedInputStream.readRawVarint32(firstByte, input); |
|
||||||
} catch (IOException e) { |
|
||||||
throw new InvalidProtocolBufferException(e.getMessage()); |
|
||||||
} |
|
||||||
InputStream limitedInput = new LimitedInputStream(input, size); |
|
||||||
return parsePartialFrom(limitedInput, extensionRegistry); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public MessageType parsePartialDelimitedFrom(InputStream input) |
|
||||||
throws InvalidProtocolBufferException { |
|
||||||
return parsePartialDelimitedFrom(input, EMPTY_REGISTRY); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public MessageType parseDelimitedFrom(InputStream input, ExtensionRegistryLite extensionRegistry) |
|
||||||
throws InvalidProtocolBufferException { |
|
||||||
return checkMessageInitialized( |
|
||||||
parsePartialDelimitedFrom(input, extensionRegistry)); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public MessageType parseDelimitedFrom(InputStream input) throws InvalidProtocolBufferException { |
|
||||||
return parseDelimitedFrom(input, EMPTY_REGISTRY); |
|
||||||
} |
|
||||||
} |
|
@ -1,180 +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 com.google.protobuf; |
|
||||||
|
|
||||||
import com.google.protobuf.Internal.ProtobufList; |
|
||||||
|
|
||||||
import java.util.AbstractList; |
|
||||||
import java.util.Collection; |
|
||||||
import java.util.List; |
|
||||||
import java.util.RandomAccess; |
|
||||||
|
|
||||||
/** |
|
||||||
* An abstract implementation of {@link ProtobufList} which manages mutability semantics. All mutate |
|
||||||
* methods must check if the list is mutable before proceeding. Subclasses must invoke |
|
||||||
* {@link #ensureIsMutable()} manually when overriding those methods. |
|
||||||
* <p> |
|
||||||
* This implementation assumes all subclasses are array based, supporting random access. |
|
||||||
*/ |
|
||||||
abstract class AbstractProtobufList<E> extends AbstractList<E> implements ProtobufList<E> { |
|
||||||
|
|
||||||
protected static final int DEFAULT_CAPACITY = 10; |
|
||||||
|
|
||||||
/** |
|
||||||
* Whether or not this list is modifiable. |
|
||||||
*/ |
|
||||||
private boolean isMutable; |
|
||||||
|
|
||||||
/** |
|
||||||
* Constructs a mutable list by default. |
|
||||||
*/ |
|
||||||
AbstractProtobufList() { |
|
||||||
isMutable = true; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public boolean equals(Object o) { |
|
||||||
if (o == this) { |
|
||||||
return true; |
|
||||||
} |
|
||||||
if (!(o instanceof List)) { |
|
||||||
return false; |
|
||||||
} |
|
||||||
// Handle lists that do not support RandomAccess as efficiently as possible by using an iterator
|
|
||||||
// based approach in our super class. Otherwise our index based approach will avoid those
|
|
||||||
// allocations.
|
|
||||||
if (!(o instanceof RandomAccess)) { |
|
||||||
return super.equals(o); |
|
||||||
} |
|
||||||
|
|
||||||
List<?> other = (List<?>) o; |
|
||||||
final int size = size(); |
|
||||||
if (size != other.size()) { |
|
||||||
return false; |
|
||||||
} |
|
||||||
for (int i = 0; i < size; i++) { |
|
||||||
if (!get(i).equals(other.get(i))) { |
|
||||||
return false; |
|
||||||
} |
|
||||||
} |
|
||||||
return true; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public int hashCode() { |
|
||||||
final int size = size(); |
|
||||||
int hashCode = 1; |
|
||||||
for (int i = 0; i < size; i++) { |
|
||||||
hashCode = (31 * hashCode) + get(i).hashCode(); |
|
||||||
} |
|
||||||
return hashCode; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public boolean add(E e) { |
|
||||||
ensureIsMutable(); |
|
||||||
return super.add(e); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void add(int index, E element) { |
|
||||||
ensureIsMutable(); |
|
||||||
super.add(index, element); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public boolean addAll(Collection<? extends E> c) { |
|
||||||
ensureIsMutable(); |
|
||||||
return super.addAll(c); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public boolean addAll(int index, Collection<? extends E> c) { |
|
||||||
ensureIsMutable(); |
|
||||||
return super.addAll(index, c); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void clear() { |
|
||||||
ensureIsMutable(); |
|
||||||
super.clear(); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public boolean isModifiable() { |
|
||||||
return isMutable; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public final void makeImmutable() { |
|
||||||
isMutable = false; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public E remove(int index) { |
|
||||||
ensureIsMutable(); |
|
||||||
return super.remove(index); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public boolean remove(Object o) { |
|
||||||
ensureIsMutable(); |
|
||||||
return super.remove(o); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public boolean removeAll(Collection<?> c) { |
|
||||||
ensureIsMutable(); |
|
||||||
return super.removeAll(c); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public boolean retainAll(Collection<?> c) { |
|
||||||
ensureIsMutable(); |
|
||||||
return super.retainAll(c); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public E set(int index, E element) { |
|
||||||
ensureIsMutable(); |
|
||||||
return super.set(index, element); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Throws an {@link UnsupportedOperationException} if the list is immutable. Subclasses are |
|
||||||
* responsible for invoking this method on mutate operations. |
|
||||||
*/ |
|
||||||
protected void ensureIsMutable() { |
|
||||||
if (!isMutable) { |
|
||||||
throw new UnsupportedOperationException(); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,51 +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 com.google.protobuf; |
|
||||||
|
|
||||||
/** |
|
||||||
* <p>Abstract interface for a blocking RPC channel. {@code BlockingRpcChannel} |
|
||||||
* is the blocking equivalent to {@link RpcChannel}. |
|
||||||
* |
|
||||||
* @author kenton@google.com Kenton Varda |
|
||||||
* @author cpovirk@google.com Chris Povirk |
|
||||||
*/ |
|
||||||
public interface BlockingRpcChannel { |
|
||||||
/** |
|
||||||
* Call the given method of the remote service and blocks until it returns. |
|
||||||
* {@code callBlockingMethod()} is the blocking equivalent to |
|
||||||
* {@link RpcChannel#callMethod}. |
|
||||||
*/ |
|
||||||
Message callBlockingMethod( |
|
||||||
Descriptors.MethodDescriptor method, |
|
||||||
RpcController controller, |
|
||||||
Message request, |
|
||||||
Message responsePrototype) throws ServiceException; |
|
||||||
} |
|
@ -1,64 +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 com.google.protobuf; |
|
||||||
|
|
||||||
/** |
|
||||||
* Blocking equivalent to {@link Service}. |
|
||||||
* |
|
||||||
* @author kenton@google.com Kenton Varda |
|
||||||
* @author cpovirk@google.com Chris Povirk |
|
||||||
*/ |
|
||||||
public interface BlockingService { |
|
||||||
/** |
|
||||||
* Equivalent to {@link Service#getDescriptorForType}. |
|
||||||
*/ |
|
||||||
Descriptors.ServiceDescriptor getDescriptorForType(); |
|
||||||
|
|
||||||
/** |
|
||||||
* Equivalent to {@link Service#callMethod}, except that |
|
||||||
* {@code callBlockingMethod()} returns the result of the RPC or throws a |
|
||||||
* {@link ServiceException} if there is a failure, rather than passing the |
|
||||||
* information to a callback. |
|
||||||
*/ |
|
||||||
Message callBlockingMethod(Descriptors.MethodDescriptor method, |
|
||||||
RpcController controller, |
|
||||||
Message request) throws ServiceException; |
|
||||||
|
|
||||||
/** |
|
||||||
* Equivalent to {@link Service#getRequestPrototype}. |
|
||||||
*/ |
|
||||||
Message getRequestPrototype(Descriptors.MethodDescriptor method); |
|
||||||
|
|
||||||
/** |
|
||||||
* Equivalent to {@link Service#getResponsePrototype}. |
|
||||||
*/ |
|
||||||
Message getResponsePrototype(Descriptors.MethodDescriptor method); |
|
||||||
} |
|
Loading…
Reference in new issue