in activemq-protobuf/src/main/java/org/apache/activemq/protobuf/compiler/AltJavaGenerator.java [1091:1274]
private void generateMethodMergeFromStream(MessageDescriptor m, String className) {
p("public "+className+" mergeUnframed(java.io.InputStream input) throws java.io.IOException {");
indent();
p("return mergeUnframed(new org.apache.activemq.protobuf.CodedInputStream(input));");
unindent();
p("}");
p();
p("public "+className+" mergeUnframed(org.apache.activemq.protobuf.CodedInputStream input) throws java.io.IOException {");
indent();
{
p("copyCheck();");
p("while (true) {");
indent();
{
p("int tag = input.readTag();");
p("if ((tag & 0x07) == 4) {");
p(" return this;");
p("}");
p("switch (tag) {");
p("case 0:");
p(" return this;");
p("default: {");
p(" break;");
p("}");
for (FieldDescriptor field : m.getFields().values()) {
String uname = uCamel(field.getName());
String setter = "set" + uname;
boolean repeated = field.getRule() == FieldDescriptor.REPEATED_RULE;
if (repeated) {
setter = "create" + 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();
String override = getOption(field.getOptions(), "java_override_type", null);
if( "AsciiBuffer".equals(override) ) {
p(setter + "(new org.apache.activemq.protobuf.AsciiBuffer(input.readBytes()));");
} else if( "UTF8Buffer".equals(override) ) {
p(setter + "(new org.apache.activemq.protobuf.UTF8Buffer(input.readBytes()));");
} else {
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) {
errors.add("This code generator does not support group fields.");
// p("case "+ makeTag(field.getTag(), WIRETYPE_START_GROUP)+ ":");
// indent();
// String type = javaType(field);
// if (repeated) {
// p(setter + "(readGroup(input, " + field.getTag()+ ", new " + type + "()));");
// } else {
// p("if (has" + uname + "()) {");
// indent();
// p("readGroup(input, " + field.getTag() + ", get"
// + uname + "());");
// unindent();
// p("} else {");
// indent();
// p(setter + "(readGroup(input, " + 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 + "("+javaRelatedType(type, "Buffer")+".parseFramed(input));");
} else {
p("if (has" + uname + "()) {");
indent();
p("set" + uname + "(get" + uname + "().copy().mergeFrom("+javaRelatedType(type, "Buffer")+".parseFramed(input)));");
unindent();
p("} else {");
indent();
p(setter + "("+javaRelatedType(type, "Buffer")+".parseFramed(input));");
unindent();
p("}");
}
}
p("break;");
unindent();
}
p("}");
}
unindent();
p("}");
}
unindent();
p("}");
}