| Index: third_party/protobuf/java/core/src/main/java/com/google/protobuf/AbstractMessage.java
|
| diff --git a/third_party/protobuf/java/core/src/main/java/com/google/protobuf/AbstractMessage.java b/third_party/protobuf/java/core/src/main/java/com/google/protobuf/AbstractMessage.java
|
| index 03c0d5797d3507c2eb47872b9e3f34273abbbc9e..7639efcfca6788e93d1c0b36150ffaf812c700e9 100644
|
| --- a/third_party/protobuf/java/core/src/main/java/com/google/protobuf/AbstractMessage.java
|
| +++ b/third_party/protobuf/java/core/src/main/java/com/google/protobuf/AbstractMessage.java
|
| @@ -54,12 +54,40 @@ 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() {
|
| @@ -460,6 +488,31 @@ public abstract class AbstractMessage
|
| 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:
|
| @@ -550,4 +603,44 @@ public abstract class AbstractMessage
|
| 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;
|
| + }
|
| }
|
|
|