PageRenderTime 62ms CodeModel.GetById 28ms RepoModel.GetById 0ms app.codeStats 0ms

/game_server/src/com/google/protobuf/AbstractMessage.java

http://mmorpg-client-server-learning.googlecode.com/
Java | 764 lines | 548 code | 72 blank | 144 comment | 145 complexity | 2247657b714325453602aca885e9497a 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 com.google.protobuf.Descriptors.Descriptor;
  32. import com.google.protobuf.Descriptors.FieldDescriptor;
  33. import com.google.protobuf.Internal.EnumLite;
  34. import java.io.IOException;
  35. import java.io.InputStream;
  36. import java.util.ArrayList;
  37. import java.util.List;
  38. import java.util.Map;
  39. /**
  40. * A partial implementation of the {@link com.google.protobuf.Message} interface which implements
  41. * as many methods of that interface as possible in terms of other methods.
  42. *
  43. * @author kenton@google.com Kenton Varda
  44. */
  45. public abstract class AbstractMessage extends AbstractMessageLite
  46. implements Message {
  47. @SuppressWarnings("unchecked")
  48. public boolean isInitialized() {
  49. // Check that all required fields are present.
  50. for (final FieldDescriptor field : getDescriptorForType().getFields()) {
  51. if (field.isRequired()) {
  52. if (!hasField(field)) {
  53. return false;
  54. }
  55. }
  56. }
  57. // Check that embedded messages are initialized.
  58. for (final Map.Entry<FieldDescriptor, Object> entry :
  59. getAllFields().entrySet()) {
  60. final FieldDescriptor field = entry.getKey();
  61. if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
  62. if (field.isRepeated()) {
  63. for (final Message element : (List<Message>) entry.getValue()) {
  64. if (!element.isInitialized()) {
  65. return false;
  66. }
  67. }
  68. } else {
  69. if (!((Message) entry.getValue()).isInitialized()) {
  70. return false;
  71. }
  72. }
  73. }
  74. }
  75. return true;
  76. }
  77. @Override
  78. public final String toString() {
  79. return TextFormat.printToString(this);
  80. }
  81. public void writeTo(final CodedOutputStream output) throws IOException {
  82. final boolean isMessageSet =
  83. getDescriptorForType().getOptions().getMessageSetWireFormat();
  84. for (final Map.Entry<FieldDescriptor, Object> entry :
  85. getAllFields().entrySet()) {
  86. final FieldDescriptor field = entry.getKey();
  87. final Object value = entry.getValue();
  88. if (isMessageSet && field.isExtension() &&
  89. field.getType() == FieldDescriptor.Type.MESSAGE &&
  90. !field.isRepeated()) {
  91. output.writeMessageSetExtension(field.getNumber(), (Message) value);
  92. } else {
  93. FieldSet.writeField(field, value, output);
  94. }
  95. }
  96. final UnknownFieldSet unknownFields = getUnknownFields();
  97. if (isMessageSet) {
  98. unknownFields.writeAsMessageSetTo(output);
  99. } else {
  100. unknownFields.writeTo(output);
  101. }
  102. }
  103. private int memoizedSize = -1;
  104. public int getSerializedSize() {
  105. int size = memoizedSize;
  106. if (size != -1) {
  107. return size;
  108. }
  109. size = 0;
  110. final boolean isMessageSet =
  111. getDescriptorForType().getOptions().getMessageSetWireFormat();
  112. for (final Map.Entry<FieldDescriptor, Object> entry :
  113. getAllFields().entrySet()) {
  114. final FieldDescriptor field = entry.getKey();
  115. final Object value = entry.getValue();
  116. if (isMessageSet && field.isExtension() &&
  117. field.getType() == FieldDescriptor.Type.MESSAGE &&
  118. !field.isRepeated()) {
  119. size += CodedOutputStream.computeMessageSetExtensionSize(
  120. field.getNumber(), (Message) value);
  121. } else {
  122. size += FieldSet.computeFieldSize(field, value);
  123. }
  124. }
  125. final UnknownFieldSet unknownFields = getUnknownFields();
  126. if (isMessageSet) {
  127. size += unknownFields.getSerializedSizeAsMessageSet();
  128. } else {
  129. size += unknownFields.getSerializedSize();
  130. }
  131. memoizedSize = size;
  132. return size;
  133. }
  134. @Override
  135. public boolean equals(final Object other) {
  136. if (other == this) {
  137. return true;
  138. }
  139. if (!(other instanceof Message)) {
  140. return false;
  141. }
  142. final Message otherMessage = (Message) other;
  143. if (getDescriptorForType() != otherMessage.getDescriptorForType()) {
  144. return false;
  145. }
  146. return getAllFields().equals(otherMessage.getAllFields()) &&
  147. getUnknownFields().equals(otherMessage.getUnknownFields());
  148. }
  149. @Override
  150. public int hashCode() {
  151. int hash = 41;
  152. hash = (19 * hash) + getDescriptorForType().hashCode();
  153. hash = hashFields(hash, getAllFields());
  154. hash = (29 * hash) + getUnknownFields().hashCode();
  155. return hash;
  156. }
  157. /** Get a hash code for given fields and values, using the given seed. */
  158. @SuppressWarnings("unchecked")
  159. protected int hashFields(int hash, Map<FieldDescriptor, Object> map) {
  160. for (Map.Entry<FieldDescriptor, Object> entry : map.entrySet()) {
  161. FieldDescriptor field = entry.getKey();
  162. Object value = entry.getValue();
  163. hash = (37 * hash) + field.getNumber();
  164. if (field.getType() != FieldDescriptor.Type.ENUM){
  165. hash = (53 * hash) + value.hashCode();
  166. } else if (field.isRepeated()) {
  167. List<? extends EnumLite> list = (List<? extends EnumLite>) value;
  168. hash = (53 * hash) + hashEnumList(list);
  169. } else {
  170. hash = (53 * hash) + hashEnum((EnumLite) value);
  171. }
  172. }
  173. return hash;
  174. }
  175. /**
  176. * Helper method for implementing {@link com.google.protobuf.Message#hashCode()}.
  177. * @see Boolean#hashCode()
  178. */
  179. protected static int hashLong(long n) {
  180. return (int) (n ^ (n >>> 32));
  181. }
  182. /**
  183. * Helper method for implementing {@link com.google.protobuf.Message#hashCode()}.
  184. * @see Boolean#hashCode()
  185. */
  186. protected static int hashBoolean(boolean b) {
  187. return b ? 1231 : 1237;
  188. }
  189. /**
  190. * Helper method for implementing {@link com.google.protobuf.Message#hashCode()}.
  191. * <p>
  192. * This is needed because {@link Enum#hashCode()} is final, but we
  193. * need to use the field number as the hash code to ensure compatibility
  194. * between statically and dynamically generated enum objects.
  195. */
  196. protected static int hashEnum(EnumLite e) {
  197. return e.getNumber();
  198. }
  199. /** Helper method for implementing {@link com.google.protobuf.Message#hashCode()}. */
  200. protected static int hashEnumList(List<? extends EnumLite> list) {
  201. int hash = 1;
  202. for (EnumLite e : list) {
  203. hash = 31 * hash + hashEnum(e);
  204. }
  205. return hash;
  206. }
  207. // =================================================================
  208. /**
  209. * A partial implementation of the {@link com.google.protobuf.Message.Builder} interface which
  210. * implements as many methods of that interface as possible in terms of
  211. * other methods.
  212. */
  213. @SuppressWarnings("unchecked")
  214. public static abstract class Builder<BuilderType extends Builder>
  215. extends AbstractMessageLite.Builder<BuilderType>
  216. implements Message.Builder {
  217. // The compiler produces an error if this is not declared explicitly.
  218. @Override
  219. public abstract BuilderType clone();
  220. public BuilderType clear() {
  221. for (final Map.Entry<FieldDescriptor, Object> entry :
  222. getAllFields().entrySet()) {
  223. clearField(entry.getKey());
  224. }
  225. return (BuilderType) this;
  226. }
  227. public BuilderType mergeFrom(final Message other) {
  228. if (other.getDescriptorForType() != getDescriptorForType()) {
  229. throw new IllegalArgumentException(
  230. "mergeFrom(Message) can only merge messages of the same type.");
  231. }
  232. // Note: We don't attempt to verify that other's fields have valid
  233. // types. Doing so would be a losing battle. We'd have to verify
  234. // all sub-messages as well, and we'd have to make copies of all of
  235. // them to insure that they don't change after verification (since
  236. // the Message interface itself cannot enforce immutability of
  237. // implementations).
  238. // TODO(kenton): Provide a function somewhere called makeDeepCopy()
  239. // which allows people to make secure deep copies of messages.
  240. for (final Map.Entry<FieldDescriptor, Object> entry :
  241. other.getAllFields().entrySet()) {
  242. final FieldDescriptor field = entry.getKey();
  243. if (field.isRepeated()) {
  244. for (final Object element : (List)entry.getValue()) {
  245. addRepeatedField(field, element);
  246. }
  247. } else if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
  248. final Message existingValue = (Message)getField(field);
  249. if (existingValue == existingValue.getDefaultInstanceForType()) {
  250. setField(field, entry.getValue());
  251. } else {
  252. setField(field,
  253. existingValue.newBuilderForType()
  254. .mergeFrom(existingValue)
  255. .mergeFrom((Message)entry.getValue())
  256. .build());
  257. }
  258. } else {
  259. setField(field, entry.getValue());
  260. }
  261. }
  262. mergeUnknownFields(other.getUnknownFields());
  263. return (BuilderType) this;
  264. }
  265. @Override
  266. public BuilderType mergeFrom(final CodedInputStream input)
  267. throws IOException {
  268. return mergeFrom(input, ExtensionRegistry.getEmptyRegistry());
  269. }
  270. @Override
  271. public BuilderType mergeFrom(
  272. final CodedInputStream input,
  273. final ExtensionRegistryLite extensionRegistry)
  274. throws IOException {
  275. final UnknownFieldSet.Builder unknownFields =
  276. UnknownFieldSet.newBuilder(getUnknownFields());
  277. while (true) {
  278. final int tag = input.readTag();
  279. if (tag == 0) {
  280. break;
  281. }
  282. if (!mergeFieldFrom(input, unknownFields, extensionRegistry,
  283. this, tag)) {
  284. // end group tag
  285. break;
  286. }
  287. }
  288. setUnknownFields(unknownFields.build());
  289. return (BuilderType) this;
  290. }
  291. /**
  292. * Like {@link #mergeFrom(com.google.protobuf.CodedInputStream, com.google.protobuf.UnknownFieldSet.Builder,
  293. * com.google.protobuf.ExtensionRegistryLite, com.google.protobuf.Message.Builder)}, but parses a single field.
  294. * Package-private because it is used by GeneratedMessage.ExtendableMessage.
  295. * @param tag The tag, which should have already been read.
  296. * @return {@code true} unless the tag is an end-group tag.
  297. */
  298. static boolean mergeFieldFrom(
  299. final CodedInputStream input,
  300. final UnknownFieldSet.Builder unknownFields,
  301. final ExtensionRegistryLite extensionRegistry,
  302. final Message.Builder builder,
  303. final int tag) throws IOException {
  304. final Descriptor type = builder.getDescriptorForType();
  305. if (type.getOptions().getMessageSetWireFormat() &&
  306. tag == WireFormat.MESSAGE_SET_ITEM_TAG) {
  307. mergeMessageSetExtensionFromCodedStream(
  308. input, unknownFields, extensionRegistry, builder);
  309. return true;
  310. }
  311. final int wireType = WireFormat.getTagWireType(tag);
  312. final int fieldNumber = WireFormat.getTagFieldNumber(tag);
  313. final FieldDescriptor field;
  314. Message defaultInstance = null;
  315. if (type.isExtensionNumber(fieldNumber)) {
  316. // extensionRegistry may be either ExtensionRegistry or
  317. // ExtensionRegistryLite. Since the type we are parsing is a full
  318. // message, only a full ExtensionRegistry could possibly contain
  319. // extensions of it. Otherwise we will treat the registry as if it
  320. // were empty.
  321. if (extensionRegistry instanceof ExtensionRegistry) {
  322. final ExtensionRegistry.ExtensionInfo extension =
  323. ((ExtensionRegistry) extensionRegistry)
  324. .findExtensionByNumber(type, fieldNumber);
  325. if (extension == null) {
  326. field = null;
  327. } else {
  328. field = extension.descriptor;
  329. defaultInstance = extension.defaultInstance;
  330. if (defaultInstance == null &&
  331. field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
  332. throw new IllegalStateException(
  333. "Message-typed extension lacked default instance: " +
  334. field.getFullName());
  335. }
  336. }
  337. } else {
  338. field = null;
  339. }
  340. } else {
  341. field = type.findFieldByNumber(fieldNumber);
  342. }
  343. boolean unknown = false;
  344. boolean packed = false;
  345. if (field == null) {
  346. unknown = true; // Unknown field.
  347. } else if (wireType == FieldSet.getWireFormatForFieldType(
  348. field.getLiteType(),
  349. false /* isPacked */)) {
  350. packed = false;
  351. } else if (field.isPackable() &&
  352. wireType == FieldSet.getWireFormatForFieldType(
  353. field.getLiteType(),
  354. true /* isPacked */)) {
  355. packed = true;
  356. } else {
  357. unknown = true; // Unknown wire type.
  358. }
  359. if (unknown) { // Unknown field or wrong wire type. Skip.
  360. return unknownFields.mergeFieldFrom(tag, input);
  361. }
  362. if (packed) {
  363. final int length = input.readRawVarint32();
  364. final int limit = input.pushLimit(length);
  365. if (field.getLiteType() == WireFormat.FieldType.ENUM) {
  366. while (input.getBytesUntilLimit() > 0) {
  367. final int rawValue = input.readEnum();
  368. final Object value = field.getEnumType().findValueByNumber(rawValue);
  369. if (value == null) {
  370. // If the number isn't recognized as a valid value for this
  371. // enum, drop it (don't even add it to unknownFields).
  372. return true;
  373. }
  374. builder.addRepeatedField(field, value);
  375. }
  376. } else {
  377. while (input.getBytesUntilLimit() > 0) {
  378. final Object value =
  379. FieldSet.readPrimitiveField(input, field.getLiteType());
  380. builder.addRepeatedField(field, value);
  381. }
  382. }
  383. input.popLimit(limit);
  384. } else {
  385. final Object value;
  386. switch (field.getType()) {
  387. case GROUP: {
  388. final Message.Builder subBuilder;
  389. if (defaultInstance != null) {
  390. subBuilder = defaultInstance.newBuilderForType();
  391. } else {
  392. subBuilder = builder.newBuilderForField(field);
  393. }
  394. if (!field.isRepeated()) {
  395. subBuilder.mergeFrom((Message) builder.getField(field));
  396. }
  397. input.readGroup(field.getNumber(), subBuilder, extensionRegistry);
  398. value = subBuilder.build();
  399. break;
  400. }
  401. case MESSAGE: {
  402. final Message.Builder subBuilder;
  403. if (defaultInstance != null) {
  404. subBuilder = defaultInstance.newBuilderForType();
  405. } else {
  406. subBuilder = builder.newBuilderForField(field);
  407. }
  408. if (!field.isRepeated()) {
  409. subBuilder.mergeFrom((Message) builder.getField(field));
  410. }
  411. input.readMessage(subBuilder, extensionRegistry);
  412. value = subBuilder.build();
  413. break;
  414. }
  415. case ENUM:
  416. final int rawValue = input.readEnum();
  417. value = field.getEnumType().findValueByNumber(rawValue);
  418. // If the number isn't recognized as a valid value for this enum,
  419. // drop it.
  420. if (value == null) {
  421. unknownFields.mergeVarintField(fieldNumber, rawValue);
  422. return true;
  423. }
  424. break;
  425. default:
  426. value = FieldSet.readPrimitiveField(input, field.getLiteType());
  427. break;
  428. }
  429. if (field.isRepeated()) {
  430. builder.addRepeatedField(field, value);
  431. } else {
  432. builder.setField(field, value);
  433. }
  434. }
  435. return true;
  436. }
  437. /** Called by {@code #mergeFieldFrom()} to parse a MessageSet extension. */
  438. private static void mergeMessageSetExtensionFromCodedStream(
  439. final CodedInputStream input,
  440. final UnknownFieldSet.Builder unknownFields,
  441. final ExtensionRegistryLite extensionRegistry,
  442. final Message.Builder builder) throws IOException {
  443. final Descriptor type = builder.getDescriptorForType();
  444. // The wire format for MessageSet is:
  445. // message MessageSet {
  446. // repeated group Item = 1 {
  447. // required int32 typeId = 2;
  448. // required bytes message = 3;
  449. // }
  450. // }
  451. // "typeId" is the extension's field number. The extension can only be
  452. // a message type, where "message" contains the encoded bytes of that
  453. // message.
  454. //
  455. // In practice, we will probably never see a MessageSet item in which
  456. // the message appears before the type ID, or where either field does not
  457. // appear exactly once. However, in theory such cases are valid, so we
  458. // should be prepared to accept them.
  459. int typeId = 0;
  460. ByteString rawBytes = null; // If we encounter "message" before "typeId"
  461. Message.Builder subBuilder = null;
  462. FieldDescriptor field = null;
  463. while (true) {
  464. final int tag = input.readTag();
  465. if (tag == 0) {
  466. break;
  467. }
  468. if (tag == WireFormat.MESSAGE_SET_TYPE_ID_TAG) {
  469. typeId = input.readUInt32();
  470. // Zero is not a valid type ID.
  471. if (typeId != 0) {
  472. final ExtensionRegistry.ExtensionInfo extension;
  473. // extensionRegistry may be either ExtensionRegistry or
  474. // ExtensionRegistryLite. Since the type we are parsing is a full
  475. // message, only a full ExtensionRegistry could possibly contain
  476. // extensions of it. Otherwise we will treat the registry as if it
  477. // were empty.
  478. if (extensionRegistry instanceof ExtensionRegistry) {
  479. extension = ((ExtensionRegistry) extensionRegistry)
  480. .findExtensionByNumber(type, typeId);
  481. } else {
  482. extension = null;
  483. }
  484. if (extension != null) {
  485. field = extension.descriptor;
  486. subBuilder = extension.defaultInstance.newBuilderForType();
  487. final Message originalMessage = (Message)builder.getField(field);
  488. if (originalMessage != null) {
  489. subBuilder.mergeFrom(originalMessage);
  490. }
  491. if (rawBytes != null) {
  492. // We already encountered the message. Parse it now.
  493. subBuilder.mergeFrom(
  494. CodedInputStream.newInstance(rawBytes.newInput()));
  495. rawBytes = null;
  496. }
  497. } else {
  498. // Unknown extension number. If we already saw data, put it
  499. // in rawBytes.
  500. if (rawBytes != null) {
  501. unknownFields.mergeField(typeId,
  502. UnknownFieldSet.Field.newBuilder()
  503. .addLengthDelimited(rawBytes)
  504. .build());
  505. rawBytes = null;
  506. }
  507. }
  508. }
  509. } else if (tag == WireFormat.MESSAGE_SET_MESSAGE_TAG) {
  510. if (typeId == 0) {
  511. // We haven't seen a type ID yet, so we have to store the raw bytes
  512. // for now.
  513. rawBytes = input.readBytes();
  514. } else if (subBuilder == null) {
  515. // We don't know how to parse this. Ignore it.
  516. unknownFields.mergeField(typeId,
  517. UnknownFieldSet.Field.newBuilder()
  518. .addLengthDelimited(input.readBytes())
  519. .build());
  520. } else {
  521. // We already know the type, so we can parse directly from the input
  522. // with no copying. Hooray!
  523. input.readMessage(subBuilder, extensionRegistry);
  524. }
  525. } else {
  526. // Unknown tag. Skip it.
  527. if (!input.skipField(tag)) {
  528. break; // end of group
  529. }
  530. }
  531. }
  532. input.checkLastTagWas(WireFormat.MESSAGE_SET_ITEM_END_TAG);
  533. if (subBuilder != null) {
  534. builder.setField(field, subBuilder.build());
  535. }
  536. }
  537. public BuilderType mergeUnknownFields(final UnknownFieldSet unknownFields) {
  538. setUnknownFields(
  539. UnknownFieldSet.newBuilder(getUnknownFields())
  540. .mergeFrom(unknownFields)
  541. .build());
  542. return (BuilderType) this;
  543. }
  544. /**
  545. * Construct an UninitializedMessageException reporting missing fields in
  546. * the given message.
  547. */
  548. protected static UninitializedMessageException
  549. newUninitializedMessageException(Message message) {
  550. return new UninitializedMessageException(findMissingFields(message));
  551. }
  552. /**
  553. * Populates {@code this.missingFields} with the full "path" of each
  554. * missing required field in the given message.
  555. */
  556. private static List<String> findMissingFields(final Message message) {
  557. final List<String> results = new ArrayList<String>();
  558. findMissingFields(message, "", results);
  559. return results;
  560. }
  561. /** Recursive helper implementing {@link #findMissingFields(com.google.protobuf.Message)}. */
  562. private static void findMissingFields(final Message message,
  563. final String prefix,
  564. final List<String> results) {
  565. for (final FieldDescriptor field :
  566. message.getDescriptorForType().getFields()) {
  567. if (field.isRequired() && !message.hasField(field)) {
  568. results.add(prefix + field.getName());
  569. }
  570. }
  571. for (final Map.Entry<FieldDescriptor, Object> entry :
  572. message.getAllFields().entrySet()) {
  573. final FieldDescriptor field = entry.getKey();
  574. final Object value = entry.getValue();
  575. if (field.getJavaType() == FieldDescriptor.JavaType.MESSAGE) {
  576. if (field.isRepeated()) {
  577. int i = 0;
  578. for (final Object element : (List) value) {
  579. findMissingFields((Message) element,
  580. subMessagePrefix(prefix, field, i++),
  581. results);
  582. }
  583. } else {
  584. if (message.hasField(field)) {
  585. findMissingFields((Message) value,
  586. subMessagePrefix(prefix, field, -1),
  587. results);
  588. }
  589. }
  590. }
  591. }
  592. }
  593. private static String subMessagePrefix(final String prefix,
  594. final FieldDescriptor field,
  595. final int index) {
  596. final StringBuilder result = new StringBuilder(prefix);
  597. if (field.isExtension()) {
  598. result.append('(')
  599. .append(field.getFullName())
  600. .append(')');
  601. } else {
  602. result.append(field.getName());
  603. }
  604. if (index != -1) {
  605. result.append('[')
  606. .append(index)
  607. .append(']');
  608. }
  609. result.append('.');
  610. return result.toString();
  611. }
  612. // ===============================================================
  613. // The following definitions seem to be required in order to make javac
  614. // not produce weird errors like:
  615. //
  616. // java/com/google/protobuf/DynamicMessage.java:203: types
  617. // com.google.protobuf.AbstractMessage.Builder<
  618. // com.google.protobuf.DynamicMessage.Builder> and
  619. // com.google.protobuf.AbstractMessage.Builder<
  620. // com.google.protobuf.DynamicMessage.Builder> are incompatible; both
  621. // define mergeFrom(com.google.protobuf.ByteString), but with unrelated
  622. // return types.
  623. //
  624. // Strangely, these lines are only needed if javac is invoked separately
  625. // on AbstractMessage.java and AbstractMessageLite.java. If javac is
  626. // invoked on both simultaneously, it works. (Or maybe the important
  627. // point is whether or not DynamicMessage.java is compiled together with
  628. // AbstractMessageLite.java -- not sure.) I suspect this is a compiler
  629. // bug.
  630. @Override
  631. public BuilderType mergeFrom(final ByteString data)
  632. throws InvalidProtocolBufferException {
  633. return super.mergeFrom(data);
  634. }
  635. @Override
  636. public BuilderType mergeFrom(
  637. final ByteString data,
  638. final ExtensionRegistryLite extensionRegistry)
  639. throws InvalidProtocolBufferException {
  640. return super.mergeFrom(data, extensionRegistry);
  641. }
  642. @Override
  643. public BuilderType mergeFrom(final byte[] data)
  644. throws InvalidProtocolBufferException {
  645. return super.mergeFrom(data);
  646. }
  647. @Override
  648. public BuilderType mergeFrom(
  649. final byte[] data, final int off, final int len)
  650. throws InvalidProtocolBufferException {
  651. return super.mergeFrom(data, off, len);
  652. }
  653. @Override
  654. public BuilderType mergeFrom(
  655. final byte[] data,
  656. final ExtensionRegistryLite extensionRegistry)
  657. throws InvalidProtocolBufferException {
  658. return super.mergeFrom(data, extensionRegistry);
  659. }
  660. @Override
  661. public BuilderType mergeFrom(
  662. final byte[] data, final int off, final int len,
  663. final ExtensionRegistryLite extensionRegistry)
  664. throws InvalidProtocolBufferException {
  665. return super.mergeFrom(data, off, len, extensionRegistry);
  666. }
  667. @Override
  668. public BuilderType mergeFrom(final InputStream input)
  669. throws IOException {
  670. return super.mergeFrom(input);
  671. }
  672. @Override
  673. public BuilderType mergeFrom(
  674. final InputStream input,
  675. final ExtensionRegistryLite extensionRegistry)
  676. throws IOException {
  677. return super.mergeFrom(input, extensionRegistry);
  678. }
  679. @Override
  680. public boolean mergeDelimitedFrom(final InputStream input)
  681. throws IOException {
  682. return super.mergeDelimitedFrom(input);
  683. }
  684. @Override
  685. public boolean mergeDelimitedFrom(
  686. final InputStream input,
  687. final ExtensionRegistryLite extensionRegistry)
  688. throws IOException {
  689. return super.mergeDelimitedFrom(input, extensionRegistry);
  690. }
  691. }
  692. }