You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by ch...@apache.org on 2008/08/31 06:06:50 UTC
svn commit: r690632 - in
/activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf:
./ compiler/
Author: chirino
Date: Sat Aug 30 21:06:49 2008
New Revision: 690632
URL: http://svn.apache.org/viewvc?rev=690632&view=rev
Log:
Generated most of the marshalling/unmarshalling bits.
Added:
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/WireInfo.java
Modified:
activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/compiler/EnumDescriptor.java
activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/compiler/JavaGenerator.java
activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/compiler/MessageDescriptor.java
activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/compiler/TypeDescriptor.java
Added: 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=690632&view=auto
==============================================================================
--- activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/Message.java (added)
+++ activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/Message.java Sat Aug 30 21:06:49 2008
@@ -0,0 +1,86 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.activemq.protobuf;
+
+import com.google.protobuf.CodedInputStream;
+import com.google.protobuf.CodedOutputStream;
+import com.google.protobuf.ExtensionRegistry;
+
+import static org.apache.activemq.protobuf.WireInfo.*;
+
+import java.io.IOException;
+
+abstract public class Message<T> {
+
+ protected int memoizedSerializedSize = -1;
+
+ static protected void writeGroup(CodedOutputStream output, int tag, Message message) throws IOException {
+ output.writeTag(tag, WIRETYPE_START_GROUP);
+ message.writeTo(output);
+ output.writeTag(tag, WIRETYPE_END_GROUP);
+ }
+
+ static protected void writeMessage(CodedOutputStream output, int tag, Message message) throws IOException {
+ output.writeTag(tag, WIRETYPE_LENGTH_DELIMITED);
+ output.writeRawVarint32(message.serializedSize());
+ message.writeTo(output);
+ }
+
+ static protected <T extends Message> 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 extends Message> 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, Message message) {
+ return CodedOutputStream.computeTagSize(tag) * 2 + message.serializedSize();
+ }
+
+ static protected int computeMessageSize(int tag, Message message) {
+ int t = message.serializedSize();
+ return CodedOutputStream.computeTagSize(tag) +
+ CodedOutputStream.computeRawVarint32Size(t)+t;
+ }
+
+
+ abstract public T mergeFrom(T other);
+
+ public T mergeFrom(CodedInputStream input) throws IOException {
+ return mergeFrom(input, ExtensionRegistry.getEmptyRegistry());
+ }
+
+ abstract public T mergeFrom(CodedInputStream input, ExtensionRegistry extensionRegistry) throws IOException;
+
+ abstract public void writeTo(CodedOutputStream output) throws java.io.IOException;
+
+ abstract public T clone();
+
+ abstract public int serializedSize();
+
+ abstract public void clear();
+
+ abstract public boolean isInitialized();
+}
Added: activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/WireInfo.java
URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/WireInfo.java?rev=690632&view=auto
==============================================================================
--- activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/WireInfo.java (added)
+++ activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/WireInfo.java Sat Aug 30 21:06:49 2008
@@ -0,0 +1,33 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.activemq.protobuf;
+
+public class WireInfo {
+
+ public static final int WIRETYPE_VARINT = 0;
+ public static final int WIRETYPE_FIXED64 = 1;
+ public static final int WIRETYPE_LENGTH_DELIMITED = 2;
+ public static final int WIRETYPE_START_GROUP = 3;
+ public static final int WIRETYPE_END_GROUP = 4;
+ public static final int WIRETYPE_FIXED32 = 5;
+
+ public static final int TAG_TYPE_BITS = 3;
+
+ public static int makeTag(int fieldNumber, int wireType) {
+ return (fieldNumber << TAG_TYPE_BITS) | wireType;
+ }
+}
Modified: activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/compiler/EnumDescriptor.java
URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/compiler/EnumDescriptor.java?rev=690632&r1=690631&r2=690632&view=diff
==============================================================================
--- activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/compiler/EnumDescriptor.java (original)
+++ activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/compiler/EnumDescriptor.java Sat Aug 30 21:06:49 2008
@@ -68,5 +68,9 @@
}
}
+ public boolean isEnum() {
+ return true;
+ }
+
}
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=690632&r1=690631&r2=690632&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 Sat Aug 30 21:06:49 2008
@@ -16,10 +16,14 @@
*/
package org.apache.activemq.protobuf.compiler;
+import com.google.protobuf.Message;
+import com.google.protobuf.WireFormat;
+
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
+import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashSet;
@@ -29,6 +33,8 @@
import org.apache.activemq.protobuf.compiler.parser.ParseException;
import org.apache.activemq.protobuf.compiler.parser.ProtoParser;
+import static org.apache.activemq.protobuf.WireInfo.*;
+
public class JavaGenerator {
private File out = new File(".");
@@ -204,9 +210,7 @@
String className = uCamel(m.getName());
p();
- p("public static final class " + className + " {");
- p();
- p("private int memoizedSerializedSize = -1;");
+ p("public static final class " + className + " extends org.apache.activemq.protobuf.Message<" + className + "> {");
p();
indent();
@@ -232,54 +236,32 @@
generateFieldAccessor(className, field);
}
+ generateMethodIsInitialized(m);
- p("public final boolean isInitialized() {");
- indent();
- for (FieldDescriptor field : m.getFields().values()) {
- String uname = uCamel(field.getName());
- if( field.isRequired() ) {
- p("if( !has" + uname + "() ) {");
- p(" return false;");
- p("}");
- }
- }
- p("return true;");
- unindent();
- p("}");
- p();
+ generateMethodClear(m);
-
- p("public final void clear() {");
- indent();
- p("memoizedSerializedSize=-1;");
- for (FieldDescriptor field : m.getFields().values()) {
- String uname = uCamel(field.getName());
- p("clear" + uname + "();");
- }
- unindent();
+ p("public "+className+" clone() {");
+ p(" return new "+className+"().mergeFrom(this);");
p("}");
p();
- p("public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {");
- indent();
- for (FieldDescriptor field : m.getFields().values()) {
- String uname = uCamel(field.getName());
- p("if (has"+uname+"()) {");
- indent();
- if( field.isStringType() ) {
- p("output.writeString("+field.getTag()+", get"+uname+"());");
- } else if(field.isInteger32Type()) {
- }
- //TODO: finish this up.
- unindent();
- p("}");
- }
- // TODO: handle unknown fields
- // getUnknownFields().writeTo(output);
+ generateMethodMergeFromBean(m, className);
+
+ generateMethodSerializedSize(m);
+
+ generateMethodMergeFromStream(m, className);
+
+ generateMethodWriteTo(m);
+
unindent();
p("}");
p();
-
+ }
+
+ /**
+ * @param m
+ */
+ private void generateMethodSerializedSize(MessageDescriptor m) {
p("public int serializedSize() {");
indent();
p("if (memoizedSerializedSize != -1)");
@@ -287,16 +269,64 @@
p();
p("int size = 0;");
for (FieldDescriptor field : m.getFields().values()) {
+
String uname = uCamel(field.getName());
+ String getter="get"+uname+"()";
+ String type = javaType(field);
p("if (has"+uname+"()) {");
indent();
- if( field.isStringType() ) {
- p("size += com.google.protobuf.CodedOutputStream.computeStringSize("+field.getTag()+", get"+uname+"());");;
- } else if(field.isInteger32Type()) {
+
+ if( field.getRule() == FieldDescriptor.REPEATED_RULE ) {
+ p("for ("+type+" i : get"+uname+"List()) {");
+ indent();
+ getter = "i";
+ }
+
+ if( field.getType()==FieldDescriptor.STRING_TYPE ) {
+ p("size += com.google.protobuf.CodedOutputStream.computeStringSize("+field.getTag()+", "+getter+");");
+ } else if( field.getType()==FieldDescriptor.BYTES_TYPE ) {
+ p("size += com.google.protobuf.CodedOutputStream.computeBytesSize("+field.getTag()+", "+getter+");");
+ } else if( field.getType()==FieldDescriptor.BOOL_TYPE ) {
+ p("size += com.google.protobuf.CodedOutputStream.computeBoolSize("+field.getTag()+", "+getter+");");
+ } else if( field.getType()==FieldDescriptor.DOUBLE_TYPE ) {
+ p("size += com.google.protobuf.CodedOutputStream.computeDoubleSize("+field.getTag()+", "+getter+");");
+ } else if( field.getType()==FieldDescriptor.FLOAT_TYPE ) {
+ p("size += com.google.protobuf.CodedOutputStream.computeFloatSize("+field.getTag()+", "+getter+");");
+ } else if( field.getType()==FieldDescriptor.INT32_TYPE ) {
+ p("size += com.google.protobuf.CodedOutputStream.computeInt32Size("+field.getTag()+", "+getter+");");
+ } else if( field.getType()==FieldDescriptor.INT64_TYPE ) {
+ p("size += com.google.protobuf.CodedOutputStream.computeInt64Size("+field.getTag()+", "+getter+");");
+ } else if( field.getType()==FieldDescriptor.SINT32_TYPE ) {
+ p("size += com.google.protobuf.CodedOutputStream.computeSInt32Size("+field.getTag()+", "+getter+");");
+ } else if( field.getType()==FieldDescriptor.SINT64_TYPE ) {
+ p("size += com.google.protobuf.CodedOutputStream.computeSInt64Size("+field.getTag()+", "+getter+");");
+ } else if( field.getType()==FieldDescriptor.UINT32_TYPE ) {
+ p("size += com.google.protobuf.CodedOutputStream.computeUInt32Size("+field.getTag()+", "+getter+");");
+ } else if( field.getType()==FieldDescriptor.UINT64_TYPE ) {
+ p("size += com.google.protobuf.CodedOutputStream.computeUInt64Size("+field.getTag()+", "+getter+");");
+ } else if( field.getType()==FieldDescriptor.FIXED32_TYPE ) {
+ p("size += com.google.protobuf.CodedOutputStream.computeFixed32Size("+field.getTag()+", "+getter+");");
+ } else if( field.getType()==FieldDescriptor.FIXED64_TYPE ) {
+ p("size += com.google.protobuf.CodedOutputStream.computeFixed64Size("+field.getTag()+", "+getter+");");
+ } else if( field.getType()==FieldDescriptor.SFIXED32_TYPE ) {
+ p("size += com.google.protobuf.CodedOutputStream.computeSFixed32Size("+field.getTag()+", "+getter+");");
+ } else if( field.getType()==FieldDescriptor.SFIXED64_TYPE ) {
+ p("size += com.google.protobuf.CodedOutputStream.computeSFixed64Size("+field.getTag()+", "+getter+");");
+ } else if( field.getTypeDescriptor().isEnum() ) {
+ p("size += com.google.protobuf.CodedOutputStream.computeEnumSize("+field.getTag()+", "+getter+".getNumber());");
+ } else if ( field.getGroup()!=null ) {
+ p("size += computeGroupSize("+field.getTag()+", "+getter+");");
+ } else {
+ p("size += computeMessageSize("+field.getTag()+", "+getter+");");
+ }
+ if( field.getRule() == FieldDescriptor.REPEATED_RULE ) {
+ unindent();
+ p("}");
}
//TODO: finish this up.
unindent();
p("}");
+
}
// TODO: handle unknown fields
// size += getUnknownFields().getSerializedSize();");
@@ -305,31 +335,86 @@
unindent();
p("}");
p();
-
- p("public "+className+" clone() {");
- p(" return new "+className+"().mergeFrom(this);");
- p("}");
- p();
+ }
- p("public "+className+" mergeFrom("+className+" other) {");
+ /**
+ * @param m
+ */
+ private void generateMethodWriteTo(MessageDescriptor m) {
+ p("public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {");
indent();
for (FieldDescriptor field : m.getFields().values()) {
String uname = uCamel(field.getName());
+ String getter="get"+uname+"()";
+ String type = javaType(field);
p("if (has"+uname+"()) {");
indent();
- p("set"+uname+"(other.get"+uname+"());");
+
+ if( field.getRule() == FieldDescriptor.REPEATED_RULE ) {
+ p("for ("+type+" i : get"+uname+"List()) {");
+ indent();
+ getter = "i";
+ }
+
+ if( field.getType()==FieldDescriptor.STRING_TYPE ) {
+ p("output.writeString("+field.getTag()+", "+getter+");");
+ } else if( field.getType()==FieldDescriptor.BYTES_TYPE ) {
+ p("output.writeBytes("+field.getTag()+", "+getter+");");
+ } else if( field.getType()==FieldDescriptor.BOOL_TYPE ) {
+ p("output.writeBool("+field.getTag()+", "+getter+");");
+ } else if( field.getType()==FieldDescriptor.DOUBLE_TYPE ) {
+ p("output.writeDouble("+field.getTag()+", "+getter+");");
+ } else if( field.getType()==FieldDescriptor.FLOAT_TYPE ) {
+ p("output.writeFloat("+field.getTag()+", "+getter+");");
+ } else if( field.getType()==FieldDescriptor.INT32_TYPE ) {
+ p("output.writeInt32("+field.getTag()+", "+getter+");");
+ } else if( field.getType()==FieldDescriptor.INT64_TYPE ) {
+ p("output.writeInt64("+field.getTag()+", "+getter+");");
+ } else if( field.getType()==FieldDescriptor.SINT32_TYPE ) {
+ p("output.writeSInt32("+field.getTag()+", "+getter+");");
+ } else if( field.getType()==FieldDescriptor.SINT64_TYPE ) {
+ p("output.writeSInt64("+field.getTag()+", "+getter+");");
+ } else if( field.getType()==FieldDescriptor.UINT32_TYPE ) {
+ p("output.writeUInt32("+field.getTag()+", "+getter+");");
+ } else if( field.getType()==FieldDescriptor.UINT64_TYPE ) {
+ p("output.writeUInt64("+field.getTag()+", "+getter+");");
+ } else if( field.getType()==FieldDescriptor.FIXED32_TYPE ) {
+ p("output.writeFixed32("+field.getTag()+", "+getter+");");
+ } else if( field.getType()==FieldDescriptor.FIXED64_TYPE ) {
+ p("output.writeFixed64("+field.getTag()+", "+getter+");");
+ } else if( field.getType()==FieldDescriptor.SFIXED32_TYPE ) {
+ p("output.writeSFixed32("+field.getTag()+", "+getter+");");
+ } else if( field.getType()==FieldDescriptor.SFIXED64_TYPE ) {
+ p("output.writeSFixed64("+field.getTag()+", "+getter+");");
+ } else if( field.getTypeDescriptor().isEnum() ) {
+ p("output.writeEnum("+field.getTag()+", "+getter+".getNumber());");
+ } else if ( field.getGroup()!=null ) {
+ p("writeGroup(output, "+field.getTag()+", "+getter+");");
+ } else {
+ p("writeMessage(output, "+field.getTag()+", "+getter+");");
+ }
+
+ if( field.getRule() == FieldDescriptor.REPEATED_RULE ) {
+ unindent();
+ p("}");
+ }
+
+ //TODO: finish this up.
unindent();
p("}");
}
- p("return this;");
+ // TODO: handle unknown fields
+ // getUnknownFields().writeTo(output);
unindent();
p("}");
- p();
-
- p("public "+className+" mergeFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException {");
- p(" return mergeFrom(input, com.google.protobuf.ExtensionRegistry.getEmptyRegistry());");
- p("}");
+ p();
+ }
+ /**
+ * @param m
+ * @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 {");
indent(); {
//TODO: handle unknown fields
@@ -352,14 +437,132 @@
p(" break;");
p("}");
+
+
for (FieldDescriptor field : m.getFields().values()) {
String uname = uCamel(field.getName());
- p("case "+field.getTag()+":");
- indent();
- if( field.isStringType() ) {
- p("set"+uname+"(input.readString());");
+ String setter = "set"+uname;
+ boolean repeated = field.getRule() == FieldDescriptor.REPEATED_RULE;
+ if( repeated ) {
+ setter = "get"+uname+"List().add";
+ }
+
+
+
+ if( field.getType()==FieldDescriptor.STRING_TYPE ) {
+ p("case "+makeTag(field.getTag(), WIRETYPE_LENGTH_DELIMITED)+":");
+ indent();
+ p(setter+"(input.readString());");
+ } else if( field.getType()==FieldDescriptor.BYTES_TYPE ) {
+ p("case "+makeTag(field.getTag(), WIRETYPE_LENGTH_DELIMITED)+":");
+ indent();
+ p(setter+"(input.readBytes());");
+ } else if( field.getType()==FieldDescriptor.BOOL_TYPE ) {
+ p("case "+makeTag(field.getTag(), WIRETYPE_VARINT)+":");
+ indent();
+ p(setter+"(input.readBool());");
+ } else if( field.getType()==FieldDescriptor.DOUBLE_TYPE ) {
+ p("case "+makeTag(field.getTag(), WIRETYPE_FIXED64)+":");
+ indent();
+ p(setter+"(input.readDouble());");
+ } else if( field.getType()==FieldDescriptor.FLOAT_TYPE ) {
+ p("case "+makeTag(field.getTag(), WIRETYPE_FIXED32)+":");
+ indent();
+ p(setter+"(input.readFloat());");
+ } else if( field.getType()==FieldDescriptor.INT32_TYPE ) {
+ p("case "+makeTag(field.getTag(), WIRETYPE_VARINT)+":");
+ indent();
+ p(setter+"(input.readInt32());");
+ } else if( field.getType()==FieldDescriptor.INT64_TYPE ) {
+ p("case "+makeTag(field.getTag(), WIRETYPE_VARINT)+":");
+ indent();
+ p(setter+"(input.readInt64());");
+ } else if( field.getType()==FieldDescriptor.SINT32_TYPE ) {
+ p("case "+makeTag(field.getTag(), WIRETYPE_VARINT)+":");
+ indent();
+ p(setter+"(input.readSInt32());");
+ } else if( field.getType()==FieldDescriptor.SINT64_TYPE ) {
+ p("case "+makeTag(field.getTag(), WIRETYPE_VARINT)+":");
+ indent();
+ p(setter+"(input.readSInt64());");
+ } else if( field.getType()==FieldDescriptor.UINT32_TYPE ) {
+ p("case "+makeTag(field.getTag(), WIRETYPE_VARINT)+":");
+ indent();
+ p(setter+"(input.readUInt32());");
+ } else if( field.getType()==FieldDescriptor.UINT64_TYPE ) {
+ p("case "+makeTag(field.getTag(), WIRETYPE_VARINT)+":");
+ indent();
+ p(setter+"(input.readUInt64());");
+ } else if( field.getType()==FieldDescriptor.FIXED32_TYPE ) {
+ p("case "+makeTag(field.getTag(), WIRETYPE_FIXED32)+":");
+ indent();
+ p(setter+"(input.readFixed32());");
+ } else if( field.getType()==FieldDescriptor.FIXED64_TYPE ) {
+ p("case "+makeTag(field.getTag(), WIRETYPE_FIXED64)+":");
+ indent();
+ p(setter+"(input.readFixed64());");
+ } else if( field.getType()==FieldDescriptor.SFIXED32_TYPE ) {
+ p("case "+makeTag(field.getTag(), WIRETYPE_FIXED32)+":");
+ indent();
+ p(setter+"(input.readSFixed32());");
+ } else if( field.getType()==FieldDescriptor.SFIXED64_TYPE ) {
+ p("case "+makeTag(field.getTag(), WIRETYPE_FIXED64)+":");
+ indent();
+ p(setter+"(input.readSFixed64());");
+ } else if( field.getTypeDescriptor().isEnum() ) {
+ p("case "+makeTag(field.getTag(), WIRETYPE_VARINT)+":");
+ indent();
+ String type = javaType(field);
+ p("{");
+ indent();
+ p("int t = input.readEnum();");
+ p(""+type+" value = "+type+".valueOf(t);");
+ p("if( value !=null ) {");
+ indent();
+ p(setter+"(value);");
+ unindent();
+ p("}");
+ // TODO: else store it as an known
+
+ unindent();
+ p("}");
+
+ } else if ( field.getGroup()!=null ) {
+ p("case "+makeTag(field.getTag(), WIRETYPE_START_GROUP)+":");
+ indent();
+ String type = javaType(field);
+ if( repeated ) {
+ p(setter+"(readGroup(input, extensionRegistry, "+field.getTag()+", new "+type+"()));");
+ } else {
+ p("if (has"+uname+"()) {");
+ indent();
+ p("readGroup(input, extensionRegistry, "+field.getTag()+", get"+uname+"());");
+ unindent();
+ p("} else {");
+ indent();
+ p(setter+"(readGroup(input, extensionRegistry, "+field.getTag()+",new "+type+"()));");
+ unindent();
+ p("}");
+ }
+ p("");
+ } else {
+ p("case "+makeTag(field.getTag(), WIRETYPE_LENGTH_DELIMITED)+":");
+ indent();
+ String type = javaType(field);
+ if( repeated ) {
+ p(setter+"(readMessage(input, extensionRegistry, new "+type+"()));");
+ } else {
+ p("if (has"+uname+"()) {");
+ indent();
+ p("readMessage(input, extensionRegistry,get"+uname+"());");
+ unindent();
+ p("} else {");
+ indent();
+ p(setter+"(readMessage(input, extensionRegistry, new "+type+"()));");
+ unindent();
+ p("}");
+ }
}
- //TODO: do the rest of the types...
p("break;");
unindent();
}
@@ -368,8 +571,88 @@
p("}");
} unindent();
p("}");
+ }
+ /**
+ * @param m
+ * @param className
+ */
+ private void generateMethodMergeFromBean(MessageDescriptor m, String className) {
+ p("public "+className+" mergeFrom("+className+" other) {");
+ indent();
+ for (FieldDescriptor field : m.getFields().values()) {
+ String uname = uCamel(field.getName());
+ p("if (other.has"+uname+"()) {");
+ indent();
+ if( field.isScalarType() || field.getTypeDescriptor().isEnum() ) {
+ if( field.isRepeated() ) {
+ p("get"+uname+"List().addAll(other.get"+uname+"List());");
+ } else {
+ p("set"+uname+"(other.get"+uname+"());");
+ }
+ } else {
+
+ String type = javaType(field);
+ // It's complex type...
+ if( field.isRepeated() ) {
+ p("for("+type+" element: other.get"+uname+"List() ) {");
+ indent();
+ p("get"+uname+"List().add(element.clone());");
+ unindent();
+ p("}");
+ } else {
+ p("if (has"+uname+"()) {");
+ indent();
+ p("get"+uname+"().mergeFrom(other.get"+uname+"());");
+ unindent();
+ p("} else {");
+ indent();
+ p("set"+uname+"(other.get"+uname+"().clone());");
+ unindent();
+ p("}");
+ }
+ }
+ unindent();
+ p("}");
+ }
+ p("return this;");
+ unindent();
+ p("}");
+ p();
+ }
+
+ /**
+ * @param m
+ */
+ private void generateMethodClear(MessageDescriptor m) {
+ p("public final void clear() {");
+ indent();
+ p("memoizedSerializedSize=-1;");
+ for (FieldDescriptor field : m.getFields().values()) {
+ String uname = uCamel(field.getName());
+ p("clear" + uname + "();");
+ }
+ unindent();
+ p("}");
+ p();
+ }
+
+ /**
+ * @param m
+ */
+ private void generateMethodIsInitialized(MessageDescriptor m) {
+ p("public final boolean isInitialized() {");
+ indent();
+ for (FieldDescriptor field : m.getFields().values()) {
+ String uname = uCamel(field.getName());
+ if( field.isRequired() ) {
+ p("if( !has" + uname + "() ) {");
+ p(" return false;");
+ p("}");
+ }
+ }
+ p("return true;");
unindent();
p("}");
p();
@@ -380,57 +663,101 @@
* @param className
*/
private void generateFieldAccessor(String className, FieldDescriptor field) {
+
String lname = lCamel(field.getName());
String uname = uCamel(field.getName());
- String type = javaType(field);
+ String type = field.getRule()==FieldDescriptor.REPEATED_RULE ? javaCollectionType(field):javaType(field);
String typeDefault = javaTypeDefault(field);
boolean primitive = isPrimitive(field);
+ boolean repeated = field.getRule()==FieldDescriptor.REPEATED_RULE;
// Create the fields..
p("// " + field.getRule() + " " + field.getType() + " " + field.getName() + " = " + field.getTag() + ";");
- p("private " + type + " f_" + lname + ";");
- if (primitive) {
- p("private boolean b_" + lname + ";");
- }
- p();
+
+ if( repeated ) {
+ p("private java.util.List<" + type + "> f_" + lname + ";");
+ p();
+
+ // Create the field accessors
+ p("public boolean has" + uname + "() {");
+ indent();
+ p("return this.f_" + lname + "!=null && !this.f_" + lname + ".isEmpty();");
+ unindent();
+ p("}");
+ p();
+
+ p("public java.util.List<" + type + "> get" + uname + "List() {");
+ indent();
+ p("if( this.f_" + lname + " == null ) {");
+ indent();
+ p("this.f_" + lname + " = new java.util.ArrayList<" + type + ">();");
+ unindent();
+ p("}");
+ p("return this.f_" + lname + ";");
+ unindent();
+ p("}");
+ p();
+
+ p("public "+className+" set" + uname + "List(java.util.List<" + type + "> " + lname + ") {");
+ indent();
+ p("this.f_" + lname + " = " + lname + ";");
+ p("return this;");
+ unindent();
+ p("}");
+
+ p("public void clear" + uname + "() {");
+ indent();
+ p("this.f_" + lname + " = null;");
+ unindent();
+ p("}");
- // Create the field accessors
- p("public boolean has" + uname + "() {");
- indent();
- if (primitive) {
- p("return this.b_" + lname + ";");
} else {
- p("return this.f_" + lname + "!=null;");
- }
- unindent();
- p("}");
- p();
+
+ p("private " + type + " f_" + lname + "= "+typeDefault+";");
+ if (primitive) {
+ p("private boolean b_" + lname + ";");
+ }
+ p();
+
+ // Create the field accessors
+ p("public boolean has" + uname + "() {");
+ indent();
+ if (primitive) {
+ p("return this.b_" + lname + ";");
+ } else {
+ p("return this.f_" + lname + "!=null;");
+ }
+ unindent();
+ p("}");
+ p();
- p("public " + type + " get" + uname + "() {");
- indent();
- p("return this.f_" + lname + ";");
- unindent();
- p("}");
- p();
+ p("public " + type + " get" + uname + "() {");
+ indent();
+ p("return this.f_" + lname + ";");
+ unindent();
+ p("}");
+ p();
- p("public "+className+" set" + uname + "(" + type + " " + lname + ") {");
- indent();
- if (primitive) {
- p("this.b_" + lname + " = true;");
- }
- p("this.f_" + lname + " = " + lname + ";");
- p("return this;");
- unindent();
- p("}");
+ p("public "+className+" set" + uname + "(" + type + " " + lname + ") {");
+ indent();
+ if (primitive) {
+ p("this.b_" + lname + " = true;");
+ }
+ p("this.f_" + lname + " = " + lname + ";");
+ p("return this;");
+ unindent();
+ p("}");
- p("public void clear" + uname + "() {");
- indent();
- if (primitive) {
- p("this.b_" + lname + " = false;");
+ p("public void clear" + uname + "() {");
+ indent();
+ if (primitive) {
+ p("this.b_" + lname + " = false;");
+ }
+ p("this.f_" + lname + " = " + typeDefault + ";");
+ unindent();
+ p("}");
}
- p("this.f_" + lname + " = " + typeDefault + ";");
- unindent();
- p("}");
+
}
private String javaTypeDefault(FieldDescriptor field) {
@@ -502,6 +829,33 @@
private boolean isPrimitive(FieldDescriptor field) {
return field.isNumberType() || field.getType()==FieldDescriptor.BOOL_TYPE;
}
+
+ private String javaCollectionType(FieldDescriptor field) {
+ if( field.isInteger32Type() ) {
+ return "java.lang.Integer";
+ }
+ if( field.isInteger64Type() ) {
+ return "java.lang.Long";
+ }
+ if( field.getType() == FieldDescriptor.DOUBLE_TYPE ) {
+ return "java.lang.Double";
+ }
+ if( field.getType() == FieldDescriptor.FLOAT_TYPE ) {
+ return "java.lang.Float";
+ }
+ if( field.getType() == FieldDescriptor.STRING_TYPE ) {
+ return "java.lang.String";
+ }
+ if( field.getType() == FieldDescriptor.BYTES_TYPE ) {
+ return "com.google.protobuf.ByteString";
+ }
+ if( field.getType() == FieldDescriptor.BOOL_TYPE ) {
+ return "java.lang.Boolean";
+ }
+
+ TypeDescriptor descriptor = field.getTypeDescriptor();
+ return javaType(descriptor);
+ }
private String javaType(FieldDescriptor field) {
if( field.isInteger32Type() ) {
Modified: activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/compiler/MessageDescriptor.java
URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/compiler/MessageDescriptor.java?rev=690632&r1=690631&r2=690632&view=diff
==============================================================================
--- activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/compiler/MessageDescriptor.java (original)
+++ activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/compiler/MessageDescriptor.java Sat Aug 30 21:06:49 2008
@@ -139,4 +139,8 @@
return null;
}
+ public boolean isEnum() {
+ return false;
+ }
+
}
Modified: activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/compiler/TypeDescriptor.java
URL: http://svn.apache.org/viewvc/activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/compiler/TypeDescriptor.java?rev=690632&r1=690631&r2=690632&view=diff
==============================================================================
--- activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/compiler/TypeDescriptor.java (original)
+++ activemq/sandbox/activemq-protobuf/activemq-protobuf/src/main/java/org/apache/activemq/protobuf/compiler/TypeDescriptor.java Sat Aug 30 21:06:49 2008
@@ -23,4 +23,6 @@
public ProtoDescriptor getProtoDescriptor();
+ public boolean isEnum();
+
}