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