/thirdparty/breakpad/third_party/protobuf/protobuf/java/src/main/java/com/google/protobuf/GeneratedMessageLite.java

http://github.com/tomahawk-player/tomahawk · Java · 731 lines · 505 code · 81 blank · 145 comment · 54 complexity · fd7c19da7db72a896693017f2387834d MD5 · raw file

  1. // Protocol Buffers - Google's data interchange format
  2. // Copyright 2008 Google Inc. All rights reserved.
  3. // http://code.google.com/p/protobuf/
  4. //
  5. // Redistribution and use in source and binary forms, with or without
  6. // modification, are permitted provided that the following conditions are
  7. // met:
  8. //
  9. // * Redistributions of source code must retain the above copyright
  10. // notice, this list of conditions and the following disclaimer.
  11. // * Redistributions in binary form must reproduce the above
  12. // copyright notice, this list of conditions and the following disclaimer
  13. // in the documentation and/or other materials provided with the
  14. // distribution.
  15. // * Neither the name of Google Inc. nor the names of its
  16. // contributors may be used to endorse or promote products derived from
  17. // this software without specific prior written permission.
  18. //
  19. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  20. // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  21. // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  22. // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  23. // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  24. // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  25. // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  26. // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  27. // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  28. // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  29. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  30. package com.google.protobuf;
  31. import java.io.IOException;
  32. import java.io.ObjectStreamException;
  33. import java.io.Serializable;
  34. import java.lang.reflect.InvocationTargetException;
  35. import java.lang.reflect.Method;
  36. import java.util.Collections;
  37. import java.util.Iterator;
  38. import java.util.List;
  39. import java.util.Map;
  40. /**
  41. * Lite version of {@link GeneratedMessage}.
  42. *
  43. * @author kenton@google.com Kenton Varda
  44. */
  45. public abstract class GeneratedMessageLite extends AbstractMessageLite
  46. implements Serializable {
  47. private static final long serialVersionUID = 1L;
  48. protected GeneratedMessageLite() {
  49. }
  50. protected GeneratedMessageLite(Builder builder) {
  51. }
  52. @SuppressWarnings("unchecked")
  53. public abstract static class Builder<MessageType extends GeneratedMessageLite,
  54. BuilderType extends Builder>
  55. extends AbstractMessageLite.Builder<BuilderType> {
  56. protected Builder() {}
  57. //@Override (Java 1.6 override semantics, but we must support 1.5)
  58. public BuilderType clear() {
  59. return (BuilderType) this;
  60. }
  61. // This is implemented here only to work around an apparent bug in the
  62. // Java compiler and/or build system. See bug #1898463. The mere presence
  63. // of this dummy clone() implementation makes it go away.
  64. @Override
  65. public BuilderType clone() {
  66. throw new UnsupportedOperationException(
  67. "This is supposed to be overridden by subclasses.");
  68. }
  69. /** All subclasses implement this. */
  70. public abstract BuilderType mergeFrom(MessageType message);
  71. // Defined here for return type covariance.
  72. public abstract MessageType getDefaultInstanceForType();
  73. /**
  74. * Called by subclasses to parse an unknown field.
  75. * @return {@code true} unless the tag is an end-group tag.
  76. */
  77. protected boolean parseUnknownField(
  78. final CodedInputStream input,
  79. final ExtensionRegistryLite extensionRegistry,
  80. final int tag) throws IOException {
  81. return input.skipField(tag);
  82. }
  83. }
  84. // =================================================================
  85. // Extensions-related stuff
  86. /**
  87. * Lite equivalent of {@link com.google.protobuf.GeneratedMessage.ExtendableMessageOrBuilder}.
  88. */
  89. public interface ExtendableMessageOrBuilder<
  90. MessageType extends ExtendableMessage> extends MessageLiteOrBuilder {
  91. /** Check if a singular extension is present. */
  92. <Type> boolean hasExtension(
  93. GeneratedExtension<MessageType, Type> extension);
  94. /** Get the number of elements in a repeated extension. */
  95. <Type> int getExtensionCount(
  96. GeneratedExtension<MessageType, List<Type>> extension);
  97. /** Get the value of an extension. */
  98. <Type> Type getExtension(GeneratedExtension<MessageType, Type> extension);
  99. /** Get one element of a repeated extension. */
  100. <Type> Type getExtension(
  101. GeneratedExtension<MessageType, List<Type>> extension,
  102. int index);
  103. }
  104. /**
  105. * Lite equivalent of {@link GeneratedMessage.ExtendableMessage}.
  106. */
  107. public abstract static class ExtendableMessage<
  108. MessageType extends ExtendableMessage<MessageType>>
  109. extends GeneratedMessageLite
  110. implements ExtendableMessageOrBuilder<MessageType> {
  111. private final FieldSet<ExtensionDescriptor> extensions;
  112. protected ExtendableMessage() {
  113. this.extensions = FieldSet.newFieldSet();
  114. }
  115. protected ExtendableMessage(ExtendableBuilder<MessageType, ?> builder) {
  116. this.extensions = builder.buildExtensions();
  117. }
  118. private void verifyExtensionContainingType(
  119. final GeneratedExtension<MessageType, ?> extension) {
  120. if (extension.getContainingTypeDefaultInstance() !=
  121. getDefaultInstanceForType()) {
  122. // This can only happen if someone uses unchecked operations.
  123. throw new IllegalArgumentException(
  124. "This extension is for a different message type. Please make " +
  125. "sure that you are not suppressing any generics type warnings.");
  126. }
  127. }
  128. /** Check if a singular extension is present. */
  129. //@Override (Java 1.6 override semantics, but we must support 1.5)
  130. public final <Type> boolean hasExtension(
  131. final GeneratedExtension<MessageType, Type> extension) {
  132. verifyExtensionContainingType(extension);
  133. return extensions.hasField(extension.descriptor);
  134. }
  135. /** Get the number of elements in a repeated extension. */
  136. //@Override (Java 1.6 override semantics, but we must support 1.5)
  137. public final <Type> int getExtensionCount(
  138. final GeneratedExtension<MessageType, List<Type>> extension) {
  139. verifyExtensionContainingType(extension);
  140. return extensions.getRepeatedFieldCount(extension.descriptor);
  141. }
  142. /** Get the value of an extension. */
  143. //@Override (Java 1.6 override semantics, but we must support 1.5)
  144. @SuppressWarnings("unchecked")
  145. public final <Type> Type getExtension(
  146. final GeneratedExtension<MessageType, Type> extension) {
  147. verifyExtensionContainingType(extension);
  148. final Object value = extensions.getField(extension.descriptor);
  149. if (value == null) {
  150. return extension.defaultValue;
  151. } else {
  152. return (Type) value;
  153. }
  154. }
  155. /** Get one element of a repeated extension. */
  156. //@Override (Java 1.6 override semantics, but we must support 1.5)
  157. @SuppressWarnings("unchecked")
  158. public final <Type> Type getExtension(
  159. final GeneratedExtension<MessageType, List<Type>> extension,
  160. final int index) {
  161. verifyExtensionContainingType(extension);
  162. return (Type) extensions.getRepeatedField(extension.descriptor, index);
  163. }
  164. /** Called by subclasses to check if all extensions are initialized. */
  165. protected boolean extensionsAreInitialized() {
  166. return extensions.isInitialized();
  167. }
  168. /**
  169. * Used by subclasses to serialize extensions. Extension ranges may be
  170. * interleaved with field numbers, but we must write them in canonical
  171. * (sorted by field number) order. ExtensionWriter helps us write
  172. * individual ranges of extensions at once.
  173. */
  174. protected class ExtensionWriter {
  175. // Imagine how much simpler this code would be if Java iterators had
  176. // a way to get the next element without advancing the iterator.
  177. private final Iterator<Map.Entry<ExtensionDescriptor, Object>> iter =
  178. extensions.iterator();
  179. private Map.Entry<ExtensionDescriptor, Object> next;
  180. private final boolean messageSetWireFormat;
  181. private ExtensionWriter(boolean messageSetWireFormat) {
  182. if (iter.hasNext()) {
  183. next = iter.next();
  184. }
  185. this.messageSetWireFormat = messageSetWireFormat;
  186. }
  187. public void writeUntil(final int end, final CodedOutputStream output)
  188. throws IOException {
  189. while (next != null && next.getKey().getNumber() < end) {
  190. ExtensionDescriptor extension = next.getKey();
  191. if (messageSetWireFormat && extension.getLiteJavaType() ==
  192. WireFormat.JavaType.MESSAGE &&
  193. !extension.isRepeated()) {
  194. output.writeMessageSetExtension(extension.getNumber(),
  195. (MessageLite) next.getValue());
  196. } else {
  197. FieldSet.writeField(extension, next.getValue(), output);
  198. }
  199. if (iter.hasNext()) {
  200. next = iter.next();
  201. } else {
  202. next = null;
  203. }
  204. }
  205. }
  206. }
  207. protected ExtensionWriter newExtensionWriter() {
  208. return new ExtensionWriter(false);
  209. }
  210. protected ExtensionWriter newMessageSetExtensionWriter() {
  211. return new ExtensionWriter(true);
  212. }
  213. /** Called by subclasses to compute the size of extensions. */
  214. protected int extensionsSerializedSize() {
  215. return extensions.getSerializedSize();
  216. }
  217. protected int extensionsSerializedSizeAsMessageSet() {
  218. return extensions.getMessageSetSerializedSize();
  219. }
  220. }
  221. /**
  222. * Lite equivalent of {@link GeneratedMessage.ExtendableBuilder}.
  223. */
  224. @SuppressWarnings("unchecked")
  225. public abstract static class ExtendableBuilder<
  226. MessageType extends ExtendableMessage<MessageType>,
  227. BuilderType extends ExtendableBuilder<MessageType, BuilderType>>
  228. extends Builder<MessageType, BuilderType>
  229. implements ExtendableMessageOrBuilder<MessageType> {
  230. protected ExtendableBuilder() {}
  231. private FieldSet<ExtensionDescriptor> extensions = FieldSet.emptySet();
  232. private boolean extensionsIsMutable;
  233. @Override
  234. public BuilderType clear() {
  235. extensions.clear();
  236. extensionsIsMutable = false;
  237. return super.clear();
  238. }
  239. private void ensureExtensionsIsMutable() {
  240. if (!extensionsIsMutable) {
  241. extensions = extensions.clone();
  242. extensionsIsMutable = true;
  243. }
  244. }
  245. /**
  246. * Called by the build code path to create a copy of the extensions for
  247. * building the message.
  248. */
  249. private FieldSet<ExtensionDescriptor> buildExtensions() {
  250. extensions.makeImmutable();
  251. extensionsIsMutable = false;
  252. return extensions;
  253. }
  254. private void verifyExtensionContainingType(
  255. final GeneratedExtension<MessageType, ?> extension) {
  256. if (extension.getContainingTypeDefaultInstance() !=
  257. getDefaultInstanceForType()) {
  258. // This can only happen if someone uses unchecked operations.
  259. throw new IllegalArgumentException(
  260. "This extension is for a different message type. Please make " +
  261. "sure that you are not suppressing any generics type warnings.");
  262. }
  263. }
  264. /** Check if a singular extension is present. */
  265. //@Override (Java 1.6 override semantics, but we must support 1.5)
  266. public final <Type> boolean hasExtension(
  267. final GeneratedExtension<MessageType, Type> extension) {
  268. verifyExtensionContainingType(extension);
  269. return extensions.hasField(extension.descriptor);
  270. }
  271. /** Get the number of elements in a repeated extension. */
  272. //@Override (Java 1.6 override semantics, but we must support 1.5)
  273. public final <Type> int getExtensionCount(
  274. final GeneratedExtension<MessageType, List<Type>> extension) {
  275. verifyExtensionContainingType(extension);
  276. return extensions.getRepeatedFieldCount(extension.descriptor);
  277. }
  278. /** Get the value of an extension. */
  279. //@Override (Java 1.6 override semantics, but we must support 1.5)
  280. @SuppressWarnings("unchecked")
  281. public final <Type> Type getExtension(
  282. final GeneratedExtension<MessageType, Type> extension) {
  283. verifyExtensionContainingType(extension);
  284. final Object value = extensions.getField(extension.descriptor);
  285. if (value == null) {
  286. return extension.defaultValue;
  287. } else {
  288. return (Type) value;
  289. }
  290. }
  291. /** Get one element of a repeated extension. */
  292. @SuppressWarnings("unchecked")
  293. //@Override (Java 1.6 override semantics, but we must support 1.5)
  294. public final <Type> Type getExtension(
  295. final GeneratedExtension<MessageType, List<Type>> extension,
  296. final int index) {
  297. verifyExtensionContainingType(extension);
  298. return (Type) extensions.getRepeatedField(extension.descriptor, index);
  299. }
  300. // This is implemented here only to work around an apparent bug in the
  301. // Java compiler and/or build system. See bug #1898463. The mere presence
  302. // of this dummy clone() implementation makes it go away.
  303. @Override
  304. public BuilderType clone() {
  305. throw new UnsupportedOperationException(
  306. "This is supposed to be overridden by subclasses.");
  307. }
  308. /** Set the value of an extension. */
  309. public final <Type> BuilderType setExtension(
  310. final GeneratedExtension<MessageType, Type> extension,
  311. final Type value) {
  312. verifyExtensionContainingType(extension);
  313. ensureExtensionsIsMutable();
  314. extensions.setField(extension.descriptor, value);
  315. return (BuilderType) this;
  316. }
  317. /** Set the value of one element of a repeated extension. */
  318. public final <Type> BuilderType setExtension(
  319. final GeneratedExtension<MessageType, List<Type>> extension,
  320. final int index, final Type value) {
  321. verifyExtensionContainingType(extension);
  322. ensureExtensionsIsMutable();
  323. extensions.setRepeatedField(extension.descriptor, index, value);
  324. return (BuilderType) this;
  325. }
  326. /** Append a value to a repeated extension. */
  327. public final <Type> BuilderType addExtension(
  328. final GeneratedExtension<MessageType, List<Type>> extension,
  329. final Type value) {
  330. verifyExtensionContainingType(extension);
  331. ensureExtensionsIsMutable();
  332. extensions.addRepeatedField(extension.descriptor, value);
  333. return (BuilderType) this;
  334. }
  335. /** Clear an extension. */
  336. public final <Type> BuilderType clearExtension(
  337. final GeneratedExtension<MessageType, ?> extension) {
  338. verifyExtensionContainingType(extension);
  339. ensureExtensionsIsMutable();
  340. extensions.clearField(extension.descriptor);
  341. return (BuilderType) this;
  342. }
  343. /** Called by subclasses to check if all extensions are initialized. */
  344. protected boolean extensionsAreInitialized() {
  345. return extensions.isInitialized();
  346. }
  347. /**
  348. * Called by subclasses to parse an unknown field or an extension.
  349. * @return {@code true} unless the tag is an end-group tag.
  350. */
  351. @Override
  352. protected boolean parseUnknownField(
  353. final CodedInputStream input,
  354. final ExtensionRegistryLite extensionRegistry,
  355. final int tag) throws IOException {
  356. final int wireType = WireFormat.getTagWireType(tag);
  357. final int fieldNumber = WireFormat.getTagFieldNumber(tag);
  358. final GeneratedExtension<MessageType, ?> extension =
  359. extensionRegistry.findLiteExtensionByNumber(
  360. getDefaultInstanceForType(), fieldNumber);
  361. boolean unknown = false;
  362. boolean packed = false;
  363. if (extension == null) {
  364. unknown = true; // Unknown field.
  365. } else if (wireType == FieldSet.getWireFormatForFieldType(
  366. extension.descriptor.getLiteType(),
  367. false /* isPacked */)) {
  368. packed = false; // Normal, unpacked value.
  369. } else if (extension.descriptor.isRepeated &&
  370. extension.descriptor.type.isPackable() &&
  371. wireType == FieldSet.getWireFormatForFieldType(
  372. extension.descriptor.getLiteType(),
  373. true /* isPacked */)) {
  374. packed = true; // Packed value.
  375. } else {
  376. unknown = true; // Wrong wire type.
  377. }
  378. if (unknown) { // Unknown field or wrong wire type. Skip.
  379. return input.skipField(tag);
  380. }
  381. if (packed) {
  382. final int length = input.readRawVarint32();
  383. final int limit = input.pushLimit(length);
  384. if (extension.descriptor.getLiteType() == WireFormat.FieldType.ENUM) {
  385. while (input.getBytesUntilLimit() > 0) {
  386. final int rawValue = input.readEnum();
  387. final Object value =
  388. extension.descriptor.getEnumType().findValueByNumber(rawValue);
  389. if (value == null) {
  390. // If the number isn't recognized as a valid value for this
  391. // enum, drop it (don't even add it to unknownFields).
  392. return true;
  393. }
  394. ensureExtensionsIsMutable();
  395. extensions.addRepeatedField(extension.descriptor, value);
  396. }
  397. } else {
  398. while (input.getBytesUntilLimit() > 0) {
  399. final Object value =
  400. FieldSet.readPrimitiveField(input,
  401. extension.descriptor.getLiteType());
  402. ensureExtensionsIsMutable();
  403. extensions.addRepeatedField(extension.descriptor, value);
  404. }
  405. }
  406. input.popLimit(limit);
  407. } else {
  408. final Object value;
  409. switch (extension.descriptor.getLiteJavaType()) {
  410. case MESSAGE: {
  411. MessageLite.Builder subBuilder = null;
  412. if (!extension.descriptor.isRepeated()) {
  413. MessageLite existingValue =
  414. (MessageLite) extensions.getField(extension.descriptor);
  415. if (existingValue != null) {
  416. subBuilder = existingValue.toBuilder();
  417. }
  418. }
  419. if (subBuilder == null) {
  420. subBuilder = extension.messageDefaultInstance.newBuilderForType();
  421. }
  422. if (extension.descriptor.getLiteType() ==
  423. WireFormat.FieldType.GROUP) {
  424. input.readGroup(extension.getNumber(),
  425. subBuilder, extensionRegistry);
  426. } else {
  427. input.readMessage(subBuilder, extensionRegistry);
  428. }
  429. value = subBuilder.build();
  430. break;
  431. }
  432. case ENUM:
  433. final int rawValue = input.readEnum();
  434. value = extension.descriptor.getEnumType()
  435. .findValueByNumber(rawValue);
  436. // If the number isn't recognized as a valid value for this enum,
  437. // drop it.
  438. if (value == null) {
  439. return true;
  440. }
  441. break;
  442. default:
  443. value = FieldSet.readPrimitiveField(input,
  444. extension.descriptor.getLiteType());
  445. break;
  446. }
  447. if (extension.descriptor.isRepeated()) {
  448. ensureExtensionsIsMutable();
  449. extensions.addRepeatedField(extension.descriptor, value);
  450. } else {
  451. ensureExtensionsIsMutable();
  452. extensions.setField(extension.descriptor, value);
  453. }
  454. }
  455. return true;
  456. }
  457. protected final void mergeExtensionFields(final MessageType other) {
  458. ensureExtensionsIsMutable();
  459. extensions.mergeFrom(((ExtendableMessage) other).extensions);
  460. }
  461. }
  462. // -----------------------------------------------------------------
  463. /** For use by generated code only. */
  464. public static <ContainingType extends MessageLite, Type>
  465. GeneratedExtension<ContainingType, Type>
  466. newSingularGeneratedExtension(
  467. final ContainingType containingTypeDefaultInstance,
  468. final Type defaultValue,
  469. final MessageLite messageDefaultInstance,
  470. final Internal.EnumLiteMap<?> enumTypeMap,
  471. final int number,
  472. final WireFormat.FieldType type) {
  473. return new GeneratedExtension<ContainingType, Type>(
  474. containingTypeDefaultInstance,
  475. defaultValue,
  476. messageDefaultInstance,
  477. new ExtensionDescriptor(enumTypeMap, number, type,
  478. false /* isRepeated */,
  479. false /* isPacked */));
  480. }
  481. /** For use by generated code only. */
  482. public static <ContainingType extends MessageLite, Type>
  483. GeneratedExtension<ContainingType, Type>
  484. newRepeatedGeneratedExtension(
  485. final ContainingType containingTypeDefaultInstance,
  486. final MessageLite messageDefaultInstance,
  487. final Internal.EnumLiteMap<?> enumTypeMap,
  488. final int number,
  489. final WireFormat.FieldType type,
  490. final boolean isPacked) {
  491. @SuppressWarnings("unchecked") // Subclasses ensure Type is a List
  492. Type emptyList = (Type) Collections.emptyList();
  493. return new GeneratedExtension<ContainingType, Type>(
  494. containingTypeDefaultInstance,
  495. emptyList,
  496. messageDefaultInstance,
  497. new ExtensionDescriptor(
  498. enumTypeMap, number, type, true /* isRepeated */, isPacked));
  499. }
  500. private static final class ExtensionDescriptor
  501. implements FieldSet.FieldDescriptorLite<
  502. ExtensionDescriptor> {
  503. private ExtensionDescriptor(
  504. final Internal.EnumLiteMap<?> enumTypeMap,
  505. final int number,
  506. final WireFormat.FieldType type,
  507. final boolean isRepeated,
  508. final boolean isPacked) {
  509. this.enumTypeMap = enumTypeMap;
  510. this.number = number;
  511. this.type = type;
  512. this.isRepeated = isRepeated;
  513. this.isPacked = isPacked;
  514. }
  515. private final Internal.EnumLiteMap<?> enumTypeMap;
  516. private final int number;
  517. private final WireFormat.FieldType type;
  518. private final boolean isRepeated;
  519. private final boolean isPacked;
  520. public int getNumber() {
  521. return number;
  522. }
  523. public WireFormat.FieldType getLiteType() {
  524. return type;
  525. }
  526. public WireFormat.JavaType getLiteJavaType() {
  527. return type.getJavaType();
  528. }
  529. public boolean isRepeated() {
  530. return isRepeated;
  531. }
  532. public boolean isPacked() {
  533. return isPacked;
  534. }
  535. public Internal.EnumLiteMap<?> getEnumType() {
  536. return enumTypeMap;
  537. }
  538. @SuppressWarnings("unchecked")
  539. public MessageLite.Builder internalMergeFrom(
  540. MessageLite.Builder to, MessageLite from) {
  541. return ((Builder) to).mergeFrom((GeneratedMessageLite) from);
  542. }
  543. public int compareTo(ExtensionDescriptor other) {
  544. return number - other.number;
  545. }
  546. }
  547. /**
  548. * Lite equivalent to {@link GeneratedMessage.GeneratedExtension}.
  549. *
  550. * Users should ignore the contents of this class and only use objects of
  551. * this type as parameters to extension accessors and ExtensionRegistry.add().
  552. */
  553. public static final class GeneratedExtension<
  554. ContainingType extends MessageLite, Type> {
  555. private GeneratedExtension(
  556. final ContainingType containingTypeDefaultInstance,
  557. final Type defaultValue,
  558. final MessageLite messageDefaultInstance,
  559. final ExtensionDescriptor descriptor) {
  560. // Defensive checks to verify the correct initialization order of
  561. // GeneratedExtensions and their related GeneratedMessages.
  562. if (containingTypeDefaultInstance == null) {
  563. throw new IllegalArgumentException(
  564. "Null containingTypeDefaultInstance");
  565. }
  566. if (descriptor.getLiteType() == WireFormat.FieldType.MESSAGE &&
  567. messageDefaultInstance == null) {
  568. throw new IllegalArgumentException(
  569. "Null messageDefaultInstance");
  570. }
  571. this.containingTypeDefaultInstance = containingTypeDefaultInstance;
  572. this.defaultValue = defaultValue;
  573. this.messageDefaultInstance = messageDefaultInstance;
  574. this.descriptor = descriptor;
  575. }
  576. private final ContainingType containingTypeDefaultInstance;
  577. private final Type defaultValue;
  578. private final MessageLite messageDefaultInstance;
  579. private final ExtensionDescriptor descriptor;
  580. /**
  581. * Default instance of the type being extended, used to identify that type.
  582. */
  583. public ContainingType getContainingTypeDefaultInstance() {
  584. return containingTypeDefaultInstance;
  585. }
  586. /** Get the field number. */
  587. public int getNumber() {
  588. return descriptor.getNumber();
  589. }
  590. /**
  591. * If the extension is an embedded message, this is the default instance of
  592. * that type.
  593. */
  594. public MessageLite getMessageDefaultInstance() {
  595. return messageDefaultInstance;
  596. }
  597. }
  598. /**
  599. * A serialized (serializable) form of the generated message. Stores the
  600. * message as a class name and a byte array.
  601. */
  602. static final class SerializedForm implements Serializable {
  603. private static final long serialVersionUID = 0L;
  604. private String messageClassName;
  605. private byte[] asBytes;
  606. /**
  607. * Creates the serialized form by calling {@link com.google.protobuf.MessageLite#toByteArray}.
  608. * @param regularForm the message to serialize
  609. */
  610. SerializedForm(MessageLite regularForm) {
  611. messageClassName = regularForm.getClass().getName();
  612. asBytes = regularForm.toByteArray();
  613. }
  614. /**
  615. * When read from an ObjectInputStream, this method converts this object
  616. * back to the regular form. Part of Java's serialization magic.
  617. * @return a GeneratedMessage of the type that was serialized
  618. */
  619. @SuppressWarnings("unchecked")
  620. protected Object readResolve() throws ObjectStreamException {
  621. try {
  622. Class messageClass = Class.forName(messageClassName);
  623. Method newBuilder = messageClass.getMethod("newBuilder");
  624. MessageLite.Builder builder =
  625. (MessageLite.Builder) newBuilder.invoke(null);
  626. builder.mergeFrom(asBytes);
  627. return builder.buildPartial();
  628. } catch (ClassNotFoundException e) {
  629. throw new RuntimeException("Unable to find proto buffer class", e);
  630. } catch (NoSuchMethodException e) {
  631. throw new RuntimeException("Unable to find newBuilder method", e);
  632. } catch (IllegalAccessException e) {
  633. throw new RuntimeException("Unable to call newBuilder method", e);
  634. } catch (InvocationTargetException e) {
  635. throw new RuntimeException("Error calling newBuilder", e.getCause());
  636. } catch (InvalidProtocolBufferException e) {
  637. throw new RuntimeException("Unable to understand proto buffer", e);
  638. }
  639. }
  640. }
  641. /**
  642. * Replaces this object in the output stream with a serialized form.
  643. * Part of Java's serialization magic. Generated sub-classes must override
  644. * this method by calling <code>return super.writeReplace();</code>
  645. * @return a SerializedForm of this message
  646. */
  647. protected Object writeReplace() throws ObjectStreamException {
  648. return new SerializedForm(this);
  649. }
  650. }