• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2008 Google Inc.  All rights reserved.
3 //
4 // Use of this source code is governed by a BSD-style
5 // license that can be found in the LICENSE file or at
6 // https://developers.google.com/open-source/licenses/bsd
7 
8 package com.google.protobuf;
9 
10 import com.google.protobuf.AbstractMessageLite.Builder.LimitedInputStream;
11 import java.io.IOException;
12 import java.io.InputStream;
13 import java.nio.ByteBuffer;
14 
15 /**
16  * A partial implementation of the {@link Parser} interface which implements as many methods of that
17  * interface as possible in terms of other methods.
18  *
19  * <p>Note: This class implements all the convenience methods in the {@link Parser} interface. See
20  * {@link Parser} for related javadocs. Subclasses need to implement {@link
21  * Parser#parsePartialFrom(CodedInputStream, ExtensionRegistryLite)}
22  *
23  * @author liujisi@google.com (Pherl Liu)
24  */
25 public abstract class AbstractParser<MessageType extends MessageLite>
26     implements Parser<MessageType> {
27   /** Creates an UninitializedMessageException for MessageType. */
newUninitializedMessageException(MessageType message)28   private UninitializedMessageException newUninitializedMessageException(MessageType message) {
29     if (message instanceof AbstractMessageLite) {
30       return ((AbstractMessageLite) message).newUninitializedMessageException();
31     }
32     return new UninitializedMessageException(message);
33   }
34 
35   /**
36    * Helper method to check if message is initialized.
37    *
38    * @throws InvalidProtocolBufferException if it is not initialized.
39    * @return The message to check.
40    */
checkMessageInitialized(MessageType message)41   private MessageType checkMessageInitialized(MessageType message)
42       throws InvalidProtocolBufferException {
43     if (message != null && !message.isInitialized()) {
44       throw newUninitializedMessageException(message)
45           .asInvalidProtocolBufferException()
46           .setUnfinishedMessage(message);
47     }
48     return message;
49   }
50 
51   private static final ExtensionRegistryLite EMPTY_REGISTRY =
52       ExtensionRegistryLite.getEmptyRegistry();
53 
54   @Override
parsePartialFrom(CodedInputStream input)55   public MessageType parsePartialFrom(CodedInputStream input)
56       throws InvalidProtocolBufferException {
57     return parsePartialFrom(input, EMPTY_REGISTRY);
58   }
59 
60   @Override
parseFrom(CodedInputStream input, ExtensionRegistryLite extensionRegistry)61   public MessageType parseFrom(CodedInputStream input, ExtensionRegistryLite extensionRegistry)
62       throws InvalidProtocolBufferException {
63     return checkMessageInitialized(parsePartialFrom(input, extensionRegistry));
64   }
65 
66   @Override
parseFrom(CodedInputStream input)67   public MessageType parseFrom(CodedInputStream input) throws InvalidProtocolBufferException {
68     return parseFrom(input, EMPTY_REGISTRY);
69   }
70 
71   @Override
parsePartialFrom(ByteString data, ExtensionRegistryLite extensionRegistry)72   public MessageType parsePartialFrom(ByteString data, ExtensionRegistryLite extensionRegistry)
73       throws InvalidProtocolBufferException {
74     MessageType message;
75     try {
76       CodedInputStream input = data.newCodedInput();
77       message = parsePartialFrom(input, extensionRegistry);
78       try {
79         input.checkLastTagWas(0);
80       } catch (InvalidProtocolBufferException e) {
81         throw e.setUnfinishedMessage(message);
82       }
83       return message;
84     } catch (InvalidProtocolBufferException e) {
85       throw e;
86     }
87   }
88 
89   @Override
parsePartialFrom(ByteString data)90   public MessageType parsePartialFrom(ByteString data) throws InvalidProtocolBufferException {
91     return parsePartialFrom(data, EMPTY_REGISTRY);
92   }
93 
94   @Override
parseFrom(ByteString data, ExtensionRegistryLite extensionRegistry)95   public MessageType parseFrom(ByteString data, ExtensionRegistryLite extensionRegistry)
96       throws InvalidProtocolBufferException {
97     return checkMessageInitialized(parsePartialFrom(data, extensionRegistry));
98   }
99 
100   @Override
parseFrom(ByteString data)101   public MessageType parseFrom(ByteString data) throws InvalidProtocolBufferException {
102     return parseFrom(data, EMPTY_REGISTRY);
103   }
104 
105   @Override
parseFrom(ByteBuffer data, ExtensionRegistryLite extensionRegistry)106   public MessageType parseFrom(ByteBuffer data, ExtensionRegistryLite extensionRegistry)
107       throws InvalidProtocolBufferException {
108     MessageType message;
109     try {
110       CodedInputStream input = CodedInputStream.newInstance(data);
111       message = parsePartialFrom(input, extensionRegistry);
112       try {
113         input.checkLastTagWas(0);
114       } catch (InvalidProtocolBufferException e) {
115         throw e.setUnfinishedMessage(message);
116       }
117     } catch (InvalidProtocolBufferException e) {
118       throw e;
119     }
120 
121     return checkMessageInitialized(message);
122   }
123 
124   @Override
parseFrom(ByteBuffer data)125   public MessageType parseFrom(ByteBuffer data) throws InvalidProtocolBufferException {
126     return parseFrom(data, EMPTY_REGISTRY);
127   }
128 
129   @Override
parsePartialFrom( byte[] data, int off, int len, ExtensionRegistryLite extensionRegistry)130   public MessageType parsePartialFrom(
131       byte[] data, int off, int len, ExtensionRegistryLite extensionRegistry)
132       throws InvalidProtocolBufferException {
133     try {
134       CodedInputStream input = CodedInputStream.newInstance(data, off, len);
135       MessageType message = parsePartialFrom(input, extensionRegistry);
136       try {
137         input.checkLastTagWas(0);
138       } catch (InvalidProtocolBufferException e) {
139         throw e.setUnfinishedMessage(message);
140       }
141       return message;
142     } catch (InvalidProtocolBufferException e) {
143       throw e;
144     }
145   }
146 
147   @Override
parsePartialFrom(byte[] data, int off, int len)148   public MessageType parsePartialFrom(byte[] data, int off, int len)
149       throws InvalidProtocolBufferException {
150     return parsePartialFrom(data, off, len, EMPTY_REGISTRY);
151   }
152 
153   @Override
parsePartialFrom(byte[] data, ExtensionRegistryLite extensionRegistry)154   public MessageType parsePartialFrom(byte[] data, ExtensionRegistryLite extensionRegistry)
155       throws InvalidProtocolBufferException {
156     return parsePartialFrom(data, 0, data.length, extensionRegistry);
157   }
158 
159   @Override
parsePartialFrom(byte[] data)160   public MessageType parsePartialFrom(byte[] data) throws InvalidProtocolBufferException {
161     return parsePartialFrom(data, 0, data.length, EMPTY_REGISTRY);
162   }
163 
164   @Override
parseFrom( byte[] data, int off, int len, ExtensionRegistryLite extensionRegistry)165   public MessageType parseFrom(
166       byte[] data, int off, int len, ExtensionRegistryLite extensionRegistry)
167       throws InvalidProtocolBufferException {
168     return checkMessageInitialized(parsePartialFrom(data, off, len, extensionRegistry));
169   }
170 
171   @Override
parseFrom(byte[] data, int off, int len)172   public MessageType parseFrom(byte[] data, int off, int len)
173       throws InvalidProtocolBufferException {
174     return parseFrom(data, off, len, EMPTY_REGISTRY);
175   }
176 
177   @Override
parseFrom(byte[] data, ExtensionRegistryLite extensionRegistry)178   public MessageType parseFrom(byte[] data, ExtensionRegistryLite extensionRegistry)
179       throws InvalidProtocolBufferException {
180     return parseFrom(data, 0, data.length, extensionRegistry);
181   }
182 
183   @Override
parseFrom(byte[] data)184   public MessageType parseFrom(byte[] data) throws InvalidProtocolBufferException {
185     return parseFrom(data, EMPTY_REGISTRY);
186   }
187 
188   @Override
parsePartialFrom(InputStream input, ExtensionRegistryLite extensionRegistry)189   public MessageType parsePartialFrom(InputStream input, ExtensionRegistryLite extensionRegistry)
190       throws InvalidProtocolBufferException {
191     CodedInputStream codedInput = CodedInputStream.newInstance(input);
192     MessageType message = parsePartialFrom(codedInput, extensionRegistry);
193     try {
194       codedInput.checkLastTagWas(0);
195     } catch (InvalidProtocolBufferException e) {
196       throw e.setUnfinishedMessage(message);
197     }
198     return message;
199   }
200 
201   @Override
parsePartialFrom(InputStream input)202   public MessageType parsePartialFrom(InputStream input) throws InvalidProtocolBufferException {
203     return parsePartialFrom(input, EMPTY_REGISTRY);
204   }
205 
206   @Override
parseFrom(InputStream input, ExtensionRegistryLite extensionRegistry)207   public MessageType parseFrom(InputStream input, ExtensionRegistryLite extensionRegistry)
208       throws InvalidProtocolBufferException {
209     return checkMessageInitialized(parsePartialFrom(input, extensionRegistry));
210   }
211 
212   @Override
parseFrom(InputStream input)213   public MessageType parseFrom(InputStream input) throws InvalidProtocolBufferException {
214     return parseFrom(input, EMPTY_REGISTRY);
215   }
216 
217   @Override
parsePartialDelimitedFrom( InputStream input, ExtensionRegistryLite extensionRegistry)218   public MessageType parsePartialDelimitedFrom(
219       InputStream input, ExtensionRegistryLite extensionRegistry)
220       throws InvalidProtocolBufferException {
221     int size;
222     try {
223       int firstByte = input.read();
224       if (firstByte == -1) {
225         return null;
226       }
227       size = CodedInputStream.readRawVarint32(firstByte, input);
228     } catch (IOException e) {
229       throw new InvalidProtocolBufferException(e);
230     }
231     InputStream limitedInput = new LimitedInputStream(input, size);
232     return parsePartialFrom(limitedInput, extensionRegistry);
233   }
234 
235   @Override
parsePartialDelimitedFrom(InputStream input)236   public MessageType parsePartialDelimitedFrom(InputStream input)
237       throws InvalidProtocolBufferException {
238     return parsePartialDelimitedFrom(input, EMPTY_REGISTRY);
239   }
240 
241   @Override
parseDelimitedFrom(InputStream input, ExtensionRegistryLite extensionRegistry)242   public MessageType parseDelimitedFrom(InputStream input, ExtensionRegistryLite extensionRegistry)
243       throws InvalidProtocolBufferException {
244     return checkMessageInitialized(parsePartialDelimitedFrom(input, extensionRegistry));
245   }
246 
247   @Override
parseDelimitedFrom(InputStream input)248   public MessageType parseDelimitedFrom(InputStream input) throws InvalidProtocolBufferException {
249     return parseDelimitedFrom(input, EMPTY_REGISTRY);
250   }
251 }
252