From commits-return-9327-apmail-activemq-commits-archive=activemq.apache.org@activemq.apache.org Tue Oct 07 20:19:01 2008 Return-Path: Delivered-To: apmail-activemq-commits-archive@www.apache.org Received: (qmail 58715 invoked from network); 7 Oct 2008 20:19:00 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 7 Oct 2008 20:19:00 -0000 Received: (qmail 47093 invoked by uid 500); 7 Oct 2008 20:18:59 -0000 Delivered-To: apmail-activemq-commits-archive@activemq.apache.org Received: (qmail 47039 invoked by uid 500); 7 Oct 2008 20:18:59 -0000 Mailing-List: contact commits-help@activemq.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@activemq.apache.org Delivered-To: mailing list commits@activemq.apache.org Received: (qmail 47030 invoked by uid 99); 7 Oct 2008 20:18:59 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 07 Oct 2008 13:18:59 -0700 X-ASF-Spam-Status: No, hits=-1999.9 required=10.0 tests=ALL_TRUSTED,DNS_FROM_SECURITYSAGE X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 07 Oct 2008 20:18:03 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id DF7AC238885D; Tue, 7 Oct 2008 13:18:39 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r702614 - in /activemq/sandbox/activemq-protobuf: activemq-protobuf-test/src/test/java/com/google/protobuf/ activemq-protobuf/src/main/java/org/apache/activemq/protobuf/ activemq-protobuf/src/main/java/org/apache/activemq/protobuf/compiler/ Date: Tue, 07 Oct 2008 20:18:39 -0000 To: commits@activemq.apache.org From: chirino@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20081007201839.DF7AC238885D@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: chirino Date: Tue Oct 7 13:18:39 2008 New Revision: 702614 URL: http://svn.apache.org/viewvc?rev=702614&view=rev Log: Cleaned up the Message interface so that it's obvious and easy to use Framed and Unframed encoding of the messages. Modified: activemq/sandbox/activemq-protobuf/activemq-protobuf-test/src/test/java/com/google/protobuf/GeneratedMessageTest.java activemq/sandbox/activemq-protobuf/activemq-protobuf-test/src/test/java/com/google/protobuf/WireFormatTest.java activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/BaseMessage.java activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/Message.java activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/compiler/JavaGenerator.java Modified: activemq/sandbox/activemq-protobuf/activemq-protobuf-test/src/test/java/com/google/protobuf/GeneratedMessageTest.java URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-protobuf/activemq-protobuf-test/src/test/java/com/google/protobuf/GeneratedMessageTest.java?rev=702614&r1=702613&r2=702614&view=diff ============================================================================== --- activemq/sandbox/activemq-protobuf/activemq-protobuf-test/src/test/java/com/google/protobuf/GeneratedMessageTest.java (original) +++ activemq/sandbox/activemq-protobuf/activemq-protobuf-test/src/test/java/com/google/protobuf/GeneratedMessageTest.java Tue Oct 7 13:18:39 2008 @@ -111,6 +111,6 @@ .setNestedEnum(MessageWithNoOuter.NestedEnum.BAZ) .setForeignEnum(EnumWithNoOuter.BAR) ; - assertEquals(message.toString(), MessageWithNoOuter.parseFrom(message.toByteArray()).toString()); + assertEquals(message.toString(), MessageWithNoOuter.parseUnframed(message.toUnframedByteArray()).toString()); } } Modified: activemq/sandbox/activemq-protobuf/activemq-protobuf-test/src/test/java/com/google/protobuf/WireFormatTest.java URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-protobuf/activemq-protobuf-test/src/test/java/com/google/protobuf/WireFormatTest.java?rev=702614&r1=702613&r2=702614&view=diff ============================================================================== --- activemq/sandbox/activemq-protobuf/activemq-protobuf-test/src/test/java/com/google/protobuf/WireFormatTest.java (original) +++ activemq/sandbox/activemq-protobuf/activemq-protobuf-test/src/test/java/com/google/protobuf/WireFormatTest.java Tue Oct 7 13:18:39 2008 @@ -28,10 +28,10 @@ public void testSerialization() throws Exception { TestAllTypes message = TestUtil.getAllSet(); - byte[] rawBytes = message.toByteArray(); - assertEquals(rawBytes.length, message.serializedSize()); + byte[] rawBytes = message.toUnframedByteArray(); + assertEquals(rawBytes.length, message.serializedSizeUnframed()); - TestAllTypes message2 = TestAllTypes.parseFrom(rawBytes); + TestAllTypes message2 = TestAllTypes.parseUnframed(rawBytes); TestUtil.assertAllFieldsSet(message2); } Modified: activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/BaseMessage.java URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/BaseMessage.java?rev=702614&r1=702613&r2=702614&view=diff ============================================================================== --- activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/BaseMessage.java (original) +++ activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/BaseMessage.java Tue Oct 7 13:18:39 2008 @@ -16,115 +16,98 @@ */ package org.apache.activemq.protobuf; -import com.google.protobuf.ByteString; -import com.google.protobuf.CodedInputStream; -import com.google.protobuf.CodedOutputStream; -import com.google.protobuf.ExtensionRegistry; -import com.google.protobuf.InvalidProtocolBufferException; - -import static org.apache.activemq.protobuf.WireInfo.*; +import static org.apache.activemq.protobuf.WireInfo.WIRETYPE_END_GROUP; +import static org.apache.activemq.protobuf.WireInfo.WIRETYPE_LENGTH_DELIMITED; +import static org.apache.activemq.protobuf.WireInfo.WIRETYPE_START_GROUP; +import static org.apache.activemq.protobuf.WireInfo.makeTag; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Collection; -import java.util.Iterator; import java.util.List; +import com.google.protobuf.ByteString; +import com.google.protobuf.CodedInputStream; +import com.google.protobuf.CodedOutputStream; +import com.google.protobuf.InvalidProtocolBufferException; + abstract public class BaseMessage implements Message { protected int memoizedSerializedSize = -1; - - static protected void addAll(Iterable values, Collection list) { - if (values instanceof Collection) { - @SuppressWarnings("unsafe") - Collection collection = (Collection)values; - list.addAll(collection); - } else { - for (T value : values) { - list.add(value); - } - } - } abstract public T clone() throws CloneNotSupportedException; - static protected void writeGroup(CodedOutputStream output, int tag, BaseMessage message) throws IOException { - output.writeTag(tag, WIRETYPE_START_GROUP); - message.writePartialTo(output); - output.writeTag(tag, WIRETYPE_END_GROUP); - } - - static protected void writeMessage(CodedOutputStream output, int tag, BaseMessage message) throws IOException { - output.writeTag(tag, WIRETYPE_LENGTH_DELIMITED); - output.writeRawVarint32(message.serializedSize()); - message.writePartialTo(output); - } - - static protected T readGroup(CodedInputStream input, ExtensionRegistry extensionRegistry, int tag, T group) throws IOException { - group.mergeFrom(input, extensionRegistry); - input.checkLastTagWas(makeTag(tag, WIRETYPE_END_GROUP)); - return group; - } - - static protected T readMessage(CodedInputStream input, ExtensionRegistry extensionRegistry, T message) throws IOException { - int length = input.readRawVarint32(); - int oldLimit = input.pushLimit(length); - message.mergeFrom(input, extensionRegistry); - input.checkLastTagWas(0); - input.popLimit(oldLimit); - return message; - } - - static protected int computeGroupSize(int tag, BaseMessage message) { - return CodedOutputStream.computeTagSize(tag) * 2 + message.serializedSize(); - } + /////////////////////////////////////////////////////////////////// + // Write related helpers. + /////////////////////////////////////////////////////////////////// - static protected int computeMessageSize(int tag, BaseMessage message) { - int t = message.serializedSize(); - return CodedOutputStream.computeTagSize(tag) + CodedOutputStream.computeRawVarint32Size(t) + t; - } - - public T mergeFrom(CodedInputStream input) throws IOException { - return mergeFrom(input, ExtensionRegistry.getEmptyRegistry()); + public void writeFramed(CodedOutputStream output) throws IOException { + output.writeRawVarint32(serializedSizeUnframed()); + writeUnframed(output); } - public byte[] toByteArray() { + public byte[] toUnframedByteArray() { try { - byte[] result = new byte[serializedSize()]; + byte[] result = new byte[serializedSizeUnframed()]; CodedOutputStream output = CodedOutputStream.newInstance(result); - writePartialTo(output); + writeUnframed(output); output.checkNoSpaceLeft(); return result; } catch (IOException e) { throw new RuntimeException("Serializing to a byte array threw an IOException " + "(should never happen).", e); } } - - protected List prefix(List missingFields, String prefix) { - ArrayList rc = new ArrayList(missingFields.size()); - for (String v : missingFields) { - rc.add(prefix+v); + + + public byte[] toFramedByteArray() { + try { + byte[] result = new byte[serializedSizeFramed()]; + CodedOutputStream output = CodedOutputStream.newInstance(result); + writeFramed(output); + output.checkNoSpaceLeft(); + return result; + } catch (IOException e) { + throw new RuntimeException("Serializing to a byte array threw an IOException " + "(should never happen).", e); } - return rc; - } + } + + public void writeFramed(OutputStream output) throws IOException { + CodedOutputStream codedOutput = CodedOutputStream.newInstance(output); + writeFramed(codedOutput); + codedOutput.flush(); + } - public void writeTo(OutputStream output) throws IOException { + public void writeUnframed(OutputStream output) throws IOException { CodedOutputStream codedOutput = CodedOutputStream.newInstance(output); - writeTo(codedOutput); + writeUnframed(codedOutput); codedOutput.flush(); } - public void writeTo(CodedOutputStream output) throws java.io.IOException { - writePartialTo(output); - output.writeTag(0, WIRETYPE_END_GROUP); + public int serializedSizeFramed() { + int t = serializedSizeUnframed(); + return CodedOutputStream.computeRawVarint32Size(t) + t; + + } + + /////////////////////////////////////////////////////////////////// + // Read related helpers. + /////////////////////////////////////////////////////////////////// + + public T mergeFramed(CodedInputStream input) throws IOException { + int length = input.readRawVarint32(); + int oldLimit = input.pushLimit(length); + T rc= mergeUnframed(input); + input.checkLastTagWas(0); + input.popLimit(oldLimit); + return rc; } - public T mergeFrom(ByteString data) throws InvalidProtocolBufferException { + public T mergeUnframed(ByteString data) throws InvalidProtocolBufferException { try { CodedInputStream input = data.newCodedInput(); - mergeFrom(input); + mergeUnframed(input); input.checkLastTagWas(0); return (T)this; } catch (InvalidProtocolBufferException e) { @@ -133,11 +116,11 @@ throw new RuntimeException("Reading from a ByteString threw an IOException (should " + "never happen).", e); } } - - public T mergeFrom(ByteString data, ExtensionRegistry extensionRegistry) throws InvalidProtocolBufferException { + + public T mergeFramed(ByteString data) throws InvalidProtocolBufferException { try { CodedInputStream input = data.newCodedInput(); - mergeFrom(input, extensionRegistry); + mergeFramed(input); input.checkLastTagWas(0); return (T)this; } catch (InvalidProtocolBufferException e) { @@ -147,10 +130,10 @@ } } - public T mergeFrom(byte[] data) throws InvalidProtocolBufferException { + public T mergeUnframed(byte[] data) throws InvalidProtocolBufferException { try { CodedInputStream input = CodedInputStream.newInstance(data); - mergeFrom(input); + mergeUnframed(input); input.checkLastTagWas(0); return (T)this; } catch (InvalidProtocolBufferException e) { @@ -159,11 +142,11 @@ throw new RuntimeException("Reading from a byte array threw an IOException (should " + "never happen).", e); } } - - public T mergeFrom(byte[] data, ExtensionRegistry extensionRegistry) throws InvalidProtocolBufferException { + + public T mergeFramed(byte[] data) throws InvalidProtocolBufferException { try { CodedInputStream input = CodedInputStream.newInstance(data); - mergeFrom(input, extensionRegistry); + mergeFramed(input); input.checkLastTagWas(0); return (T)this; } catch (InvalidProtocolBufferException e) { @@ -173,16 +156,122 @@ } } - public T mergeFrom(InputStream input) throws IOException { + public T mergeUnframed(InputStream input) throws IOException { CodedInputStream codedInput = CodedInputStream.newInstance(input); - mergeFrom(codedInput); + mergeUnframed(codedInput); return (T)this; } + + public T mergeFramed(InputStream input) throws IOException { + int length = readRawVarint32(input); + byte []data = new byte[length]; + int pos = 0; + while( pos < length ) { + int r = input.read(data, pos, length-pos); + if( r < 0 ) { + throw new InvalidProtocolBufferException("Input stream ended before a full message frame could be read."); + } + pos+=r; + } + return mergeUnframed(data); + } + + /////////////////////////////////////////////////////////////////// + // Internal implementation methods. + /////////////////////////////////////////////////////////////////// + static protected void addAll(Iterable values, Collection list) { + if (values instanceof Collection) { + @SuppressWarnings("unsafe") + Collection collection = (Collection)values; + list.addAll(collection); + } else { + for (T value : values) { + list.add(value); + } + } + } + + static protected void writeGroup(CodedOutputStream output, int tag, BaseMessage message) throws IOException { + output.writeTag(tag, WIRETYPE_START_GROUP); + message.writeUnframed(output); + output.writeTag(tag, WIRETYPE_END_GROUP); + } - public T mergeFrom(InputStream input, ExtensionRegistry extensionRegistry) throws IOException { - CodedInputStream codedInput = CodedInputStream.newInstance(input); - mergeFrom(codedInput, extensionRegistry); - return (T)this; + static protected T readGroup(CodedInputStream input, int tag, T group) throws IOException { + group.mergeUnframed(input); + input.checkLastTagWas(makeTag(tag, WIRETYPE_END_GROUP)); + return group; + } + + static protected int computeGroupSize(int tag, BaseMessage message) { + return CodedOutputStream.computeTagSize(tag) * 2 + message.serializedSizeUnframed(); } + + static protected void writeMessage(CodedOutputStream output, int tag, BaseMessage message) throws IOException { + output.writeTag(tag, WIRETYPE_LENGTH_DELIMITED); + message.writeFramed(output); + } + + static protected int computeMessageSize(int tag, BaseMessage message) { + return CodedOutputStream.computeTagSize(tag) + message.serializedSizeFramed(); + } + + protected List prefix(List missingFields, String prefix) { + ArrayList rc = new ArrayList(missingFields.size()); + for (String v : missingFields) { + rc.add(prefix+v); + } + return rc; + } + + + /** + * Read a raw Varint from the stream. If larger than 32 bits, discard the + * upper bits. + */ + static protected int readRawVarint32(InputStream is) throws IOException { + byte tmp = readRawByte(is); + if (tmp >= 0) { + return tmp; + } + int result = tmp & 0x7f; + if ((tmp = readRawByte(is)) >= 0) { + result |= tmp << 7; + } else { + result |= (tmp & 0x7f) << 7; + if ((tmp = readRawByte(is)) >= 0) { + result |= tmp << 14; + } else { + result |= (tmp & 0x7f) << 14; + if ((tmp = readRawByte(is)) >= 0) { + result |= tmp << 21; + } else { + result |= (tmp & 0x7f) << 21; + result |= (tmp = readRawByte(is)) << 28; + if (tmp < 0) { + // Discard upper 32 bits. + for (int i = 0; i < 5; i++) { + if (readRawByte(is) >= 0) return result; + } + throw new InvalidProtocolBufferException( + "CodedInputStream encountered a malformed varint."); + } + } + } + } + return result; + } + + static protected byte readRawByte(InputStream is) throws IOException { + int rc = is.read(); + if( rc == -1 ) { + throw new InvalidProtocolBufferException( + "While parsing a protocol message, the input ended unexpectedly " + + "in the middle of a field. This could mean either than the " + + "input has been truncated or that an embedded message " + + "misreported its own length."); + } + return (byte) rc; + } } Modified: activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/Message.java URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/Message.java?rev=702614&r1=702613&r2=702614&view=diff ============================================================================== --- activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/Message.java (original) +++ activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/Message.java Tue Oct 7 13:18:39 2008 @@ -16,56 +16,59 @@ */ package org.apache.activemq.protobuf; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + import com.google.protobuf.ByteString; import com.google.protobuf.CodedInputStream; import com.google.protobuf.CodedOutputStream; -import com.google.protobuf.ExtensionRegistry; import com.google.protobuf.InvalidProtocolBufferException; -import static org.apache.activemq.protobuf.WireInfo.*; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; - public interface Message { - public T mergeFrom(T other); - - public T mergeFrom(CodedInputStream input) throws IOException; - - public T mergeFrom(CodedInputStream input, ExtensionRegistry extensionRegistry) throws IOException; - - public void writeTo(CodedOutputStream output) throws java.io.IOException; - public T clone() throws CloneNotSupportedException; - public int serializedSize(); + public int serializedSizeUnframed(); + + public int serializedSizeFramed(); public void clear(); public T assertInitialized() throws com.google.protobuf.UninitializedMessageException; - public byte[] toByteArray(); + public T mergeFrom(T other); + - public void writePartialTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException; + public T mergeUnframed(byte[] data) throws InvalidProtocolBufferException; - public void writeTo(OutputStream output) throws IOException; - - public T mergeFrom(ByteString data) throws InvalidProtocolBufferException; + public T mergeFramed(byte[] data) throws InvalidProtocolBufferException; - public T mergeFrom(ByteString data, ExtensionRegistry extensionRegistry) throws InvalidProtocolBufferException; + public T mergeUnframed(CodedInputStream input) throws IOException; + + public T mergeFramed(CodedInputStream input) throws IOException; + + public T mergeUnframed(ByteString data) throws InvalidProtocolBufferException; - public T mergeFrom(byte[] data) throws InvalidProtocolBufferException; + public T mergeFramed(ByteString data) throws InvalidProtocolBufferException; + + public T mergeUnframed(InputStream input) throws IOException; + + public T mergeFramed(InputStream input) throws IOException; - public T mergeFrom(byte[] data, ExtensionRegistry extensionRegistry) throws InvalidProtocolBufferException; + - public T mergeFrom(InputStream input) throws IOException; + public byte[] toUnframedByteArray(); + + public byte[] toFramedByteArray(); + + public void writeUnframed(CodedOutputStream output) throws java.io.IOException; + + public void writeFramed(CodedOutputStream output) throws java.io.IOException; + + public void writeUnframed(OutputStream output) throws IOException; + + public void writeFramed(OutputStream output) throws java.io.IOException; - public T mergeFrom(InputStream input, ExtensionRegistry extensionRegistry) throws IOException; } Modified: activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/compiler/JavaGenerator.java URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/compiler/JavaGenerator.java?rev=702614&r1=702613&r2=702614&view=diff ============================================================================== --- activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/compiler/JavaGenerator.java (original) +++ activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/compiler/JavaGenerator.java Tue Oct 7 13:18:39 2008 @@ -23,8 +23,6 @@ import static org.apache.activemq.protobuf.WireInfo.WIRETYPE_VARINT; import static org.apache.activemq.protobuf.WireInfo.makeTag; -import com.google.protobuf.ByteString; - import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -53,6 +51,7 @@ private String optimizeFor; private ArrayList errors = new ArrayList(); private boolean multipleFiles; + private boolean defferedUnmarshall; public static void main(String[] args) { @@ -124,6 +123,7 @@ outerClassName = javaClassName(proto); optimizeFor = getOption(proto.getOptions(), "optimize_for", "SPEED"); multipleFiles = isMultipleFilesEnabled(proto); + defferedUnmarshall = Boolean.getBoolean(getOption(proto.getOptions(), "deferred_unmarshall", "false")); if( multipleFiles ) { generateProtoFile(); @@ -288,6 +288,9 @@ } } +// if( defferedUnmarshall ) { +// } + // Generate the field accessors.. for (FieldDescriptor field : m.getFields().values()) { generateFieldAccessor(className, field); @@ -317,7 +320,7 @@ generateMethodVisitor(m); generateMethodType(m, className); - + unindent(); p("}"); p(); @@ -408,54 +411,68 @@ } private void generateMethodParseFrom(MessageDescriptor m, String className) { - p("public static "+className+" parseFrom(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException {"); + p("public static "+className+" parseUnframed(com.google.protobuf.CodedInputStream data) throws com.google.protobuf.InvalidProtocolBufferException, java.io.IOException {"); indent(); - p("return new "+className+"().mergeFrom(data).checktInitialized();"); + p("return new "+className+"().mergeUnframed(data).checktInitialized();"); unindent(); p("}"); p(); - p("public static "+className+" parseFrom(com.google.protobuf.ByteString data, com.google.protobuf.ExtensionRegistry extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {"); + p("public static "+className+" parseUnframed(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException {"); indent(); - p("return new "+className+"().mergeFrom(data, extensionRegistry).checktInitialized();"); + p("return new "+className+"().mergeUnframed(data).checktInitialized();"); unindent(); p("}"); p(); - p("public static "+className+" parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException {"); + p("public static "+className+" parseUnframed(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException {"); indent(); - p("return new "+className+"().mergeFrom(data).checktInitialized();"); + p("return new "+className+"().mergeUnframed(data).checktInitialized();"); unindent(); p("}"); p(); - - p("public static "+className+" parseFrom(byte[] data, com.google.protobuf.ExtensionRegistry extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException {"); + + p("public static "+className+" parseUnframed(java.io.InputStream data) throws com.google.protobuf.InvalidProtocolBufferException, java.io.IOException {"); + indent(); + p("return new "+className+"().mergeUnframed(data).checktInitialized();"); + unindent(); + p("}"); + p(); + + p("public static "+className+" parseFramed(com.google.protobuf.CodedInputStream data) throws com.google.protobuf.InvalidProtocolBufferException, java.io.IOException {"); indent(); - p("return new "+className+"().mergeFrom(data,extensionRegistry).checktInitialized();"); + p("return new "+className+"().mergeFramed(data).checktInitialized();"); unindent(); p("}"); p(); - p("public static "+className+" parseFrom(java.io.InputStream data) throws com.google.protobuf.InvalidProtocolBufferException, java.io.IOException {"); + p("public static "+className+" parseFramed(com.google.protobuf.ByteString data) throws com.google.protobuf.InvalidProtocolBufferException {"); indent(); - p("return new "+className+"().mergeFrom(data).checktInitialized();"); + p("return new "+className+"().mergeFramed(data).checktInitialized();"); unindent(); p("}"); p(); - p("public static "+className+" parseFrom(java.io.InputStream data, com.google.protobuf.ExtensionRegistry extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException, java.io.IOException {"); + p("public static "+className+" parseFramed(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException {"); indent(); - p("return new "+className+"().mergeFrom(data,extensionRegistry).checktInitialized();"); + p("return new "+className+"().mergeFramed(data).checktInitialized();"); unindent(); p("}"); - p(); + p(); + + p("public static "+className+" parseFramed(java.io.InputStream data) throws com.google.protobuf.InvalidProtocolBufferException, java.io.IOException {"); + indent(); + p("return new "+className+"().mergeFramed(data).checktInitialized();"); + unindent(); + p("}"); + p(); } /** * @param m */ private void generateMethodSerializedSize(MessageDescriptor m) { - p("public int serializedSize() {"); + p("public int serializedSizeUnframed() {"); indent(); p("if (memoizedSerializedSize != -1)"); p(" return memoizedSerializedSize;"); @@ -534,7 +551,7 @@ * @param m */ private void generateMethodWriteTo(MessageDescriptor m) { - p("public void writePartialTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {"); + p("public void writeUnframed(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {"); indent(); for (FieldDescriptor field : m.getFields().values()) { String uname = uCamel(field.getName()); @@ -608,32 +625,20 @@ * @param className */ private void generateMethodMergeFromStream(MessageDescriptor m, String className) { - p("public "+className+" mergeFrom(com.google.protobuf.CodedInputStream input, com.google.protobuf.ExtensionRegistry extensionRegistry) throws java.io.IOException {"); + p("public "+className+" mergeUnframed(com.google.protobuf.CodedInputStream input) throws java.io.IOException {"); indent(); { - //TODO: handle unknown fields - // UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(this.unknownFields); - p("while (true) {"); indent(); { p("int tag = input.readTag();"); - // Is it an end group tag? p("if ((tag & 0x07) == 4) {"); p(" return this;"); p("}"); p("switch (tag) {"); - // The end of stream.. p("case 0:"); -// p(" this.setUnknownFields(unknownFields.build());"); p(" return this;"); p("default: {"); - - //TODO: handle unknown field types. -// p(" if (!parseUnknownField(input, unknownFields, extensionRegistry, tag)) {"); -// p(" this.setUnknownFields(unknownFields.build());"); -// p(" return this;"); -// p(" }"); - + p(" break;"); p("}"); @@ -645,9 +650,6 @@ if( repeated ) { setter = "get"+uname+"List().add"; } - - - if( field.getType()==FieldDescriptor.STRING_TYPE ) { p("case "+makeTag(field.getTag(), WIRETYPE_LENGTH_DELIMITED)+":"); indent(); @@ -731,15 +733,15 @@ indent(); String type = javaType(field); if( repeated ) { - p(setter+"(readGroup(input, extensionRegistry, "+field.getTag()+", new "+type+"()));"); + p(setter+"(readGroup(input, "+field.getTag()+", new "+type+"()));"); } else { p("if (has"+uname+"()) {"); indent(); - p("readGroup(input, extensionRegistry, "+field.getTag()+", get"+uname+"());"); + p("readGroup(input, "+field.getTag()+", get"+uname+"());"); unindent(); p("} else {"); indent(); - p(setter+"(readGroup(input, extensionRegistry, "+field.getTag()+",new "+type+"()));"); + p(setter+"(readGroup(input, "+field.getTag()+",new "+type+"()));"); unindent(); p("}"); } @@ -749,15 +751,15 @@ indent(); String type = javaType(field); if( repeated ) { - p(setter+"(readMessage(input, extensionRegistry, new "+type+"()));"); + p(setter+"(new "+type+"().mergeFramed(input));"); } else { p("if (has"+uname+"()) {"); indent(); - p("readMessage(input, extensionRegistry,get"+uname+"());"); + p("get"+uname+"().mergeFramed(input);"); unindent(); p("} else {"); indent(); - p(setter+"(readMessage(input, extensionRegistry, new "+type+"()));"); + p(setter+"(new "+type+"().mergeFramed(input));"); unindent(); p("}"); }