diff --git a/lang/java/protobuf/pom.xml b/lang/java/protobuf/pom.xml
index 5ec2a27b265..4936147b784 100644
--- a/lang/java/protobuf/pom.xml
+++ b/lang/java/protobuf/pom.xml
@@ -65,6 +65,10 @@
+
+
+
+
diff --git a/lang/java/protobuf/src/main/java/org/apache/avro/protobuf/ProtobufData.java b/lang/java/protobuf/src/main/java/org/apache/avro/protobuf/ProtobufData.java
index ca4d78b6026..f75a7cc3597 100644
--- a/lang/java/protobuf/src/main/java/org/apache/avro/protobuf/ProtobufData.java
+++ b/lang/java/protobuf/src/main/java/org/apache/avro/protobuf/ProtobufData.java
@@ -301,7 +301,8 @@ private Schema getNonRepeatedSchema(FieldDescriptor f) {
case SFIXED64:
return Schema.create(Schema.Type.LONG);
case ENUM:
- return getSchema(f.getEnumType());
+ return f.hasDefaultValue() ? getSchema(f.getEnumType(), ((EnumValueDescriptor) f.getDefaultValue()).getName())
+ : getSchema(f.getEnumType());
case MESSAGE:
result = getSchema(f.getMessageType());
if (f.isOptional())
@@ -315,11 +316,22 @@ private Schema getNonRepeatedSchema(FieldDescriptor f) {
}
public Schema getSchema(EnumDescriptor d) {
+ List symbols = getEnumSymbols(d);
+ String enumDefault = symbols.isEmpty() ? null : symbols.get(0);
+ return Schema.createEnum(d.getName(), null, getNamespace(d.getFile(), d.getContainingType()), symbols, enumDefault);
+ }
+
+ public Schema getSchema(EnumDescriptor d, String enumDefault) {
+ List symbols = getEnumSymbols(d);
+ return Schema.createEnum(d.getName(), null, getNamespace(d.getFile(), d.getContainingType()), symbols, enumDefault);
+ }
+
+ private List getEnumSymbols(EnumDescriptor d) {
List symbols = new ArrayList<>(d.getValues().size());
for (EnumValueDescriptor e : d.getValues()) {
symbols.add(e.getName());
}
- return Schema.createEnum(d.getName(), null, getNamespace(d.getFile(), d.getContainingType()), symbols);
+ return symbols;
}
private static final JsonFactory FACTORY = new JsonFactory();
diff --git a/lang/java/protobuf/src/test/java/org/apache/avro/protobuf/TestProtobuf.java b/lang/java/protobuf/src/test/java/org/apache/avro/protobuf/TestProtobuf.java
index 5ac34fdae65..c45f85ce836 100644
--- a/lang/java/protobuf/src/test/java/org/apache/avro/protobuf/TestProtobuf.java
+++ b/lang/java/protobuf/src/test/java/org/apache/avro/protobuf/TestProtobuf.java
@@ -24,6 +24,7 @@
import org.apache.avro.io.DecoderFactory;
import org.apache.avro.io.Encoder;
import org.apache.avro.io.EncoderFactory;
+import org.apache.avro.protobuf.noopt.TestProto3;
import org.apache.avro.specific.SpecificData;
import org.apache.commons.compress.utils.Lists;
import org.junit.jupiter.api.Test;
@@ -146,4 +147,17 @@ void getNonRepeatedSchemaWithLogicalType() throws Exception {
Schema s2 = instance2.getSchema(com.google.protobuf.Timestamp.class);
assertEquals(conversion.getRecommendedSchema(), s2);
}
+
+ @Test
+ void enumDefault() {
+ Schema fooSchema = ProtobufData.get().getSchema(Foo.class);
+ assertEquals("Z", fooSchema.getField("enum").schema().getEnumDefault());
+
+ Schema nSchema = ProtobufData.get().getSchema(N.class);
+ assertEquals("A", nSchema.getEnumDefault());
+
+ Schema proto3Schema = ProtobufData.get().getSchema(TestProto3.User.class);
+ assertEquals("STATUS_UNKNOWN", proto3Schema.getField("status").defaultVal());
+ assertEquals("STATUS_UNKNOWN", proto3Schema.getField("status").schema().getEnumDefault());
+ }
}
diff --git a/lang/java/protobuf/src/test/java/org/apache/avro/protobuf/noopt/TestProto3.java b/lang/java/protobuf/src/test/java/org/apache/avro/protobuf/noopt/TestProto3.java
new file mode 100644
index 00000000000..9255cc50f50
--- /dev/null
+++ b/lang/java/protobuf/src/test/java/org/apache/avro/protobuf/noopt/TestProto3.java
@@ -0,0 +1,883 @@
+// Generated by the protocol buffer compiler. DO NOT EDIT!
+// NO CHECKED-IN PROTOBUF GENCODE
+// source: src/test/protobuf/test_proto3.proto
+// Protobuf Java Version: 4.29.3
+
+package org.apache.avro.protobuf.noopt;
+
+public final class TestProto3 {
+ private TestProto3() {
+ }
+
+ static {
+ com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion(
+ com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC, /* major= */ 4, /* minor= */ 29, /* patch= */ 3,
+ /* suffix= */ "", TestProto3.class.getName());
+ }
+
+ public static void registerAllExtensions(com.google.protobuf.ExtensionRegistryLite registry) {
+ }
+
+ public static void registerAllExtensions(com.google.protobuf.ExtensionRegistry registry) {
+ registerAllExtensions((com.google.protobuf.ExtensionRegistryLite) registry);
+ }
+
+ /**
+ * Protobuf enum {@code org.apache.avro.protobuf.noopt.Status}
+ */
+ public enum Status implements com.google.protobuf.ProtocolMessageEnum {
+ /**
+ * STATUS_UNKNOWN = 0;
+ */
+ STATUS_UNKNOWN(0),
+ /**
+ * STATUS_ACTIVE = 1;
+ */
+ STATUS_ACTIVE(1),
+ /**
+ * STATUS_INACTIVE = 2;
+ */
+ STATUS_INACTIVE(2), UNRECOGNIZED(-1),;
+
+ static {
+ com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion(
+ com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC, /* major= */ 4, /* minor= */ 29, /* patch= */ 3,
+ /* suffix= */ "", Status.class.getName());
+ }
+ /**
+ * STATUS_UNKNOWN = 0;
+ */
+ public static final int STATUS_UNKNOWN_VALUE = 0;
+ /**
+ * STATUS_ACTIVE = 1;
+ */
+ public static final int STATUS_ACTIVE_VALUE = 1;
+ /**
+ * STATUS_INACTIVE = 2;
+ */
+ public static final int STATUS_INACTIVE_VALUE = 2;
+
+ public final int getNumber() {
+ if (this == UNRECOGNIZED) {
+ throw new java.lang.IllegalArgumentException("Can't get the number of an unknown enum value.");
+ }
+ return value;
+ }
+
+ /**
+ * @param value The numeric wire value of the corresponding enum entry.
+ * @return The enum associated with the given numeric wire value.
+ * @deprecated Use {@link #forNumber(int)} instead.
+ */
+ @java.lang.Deprecated
+ public static Status valueOf(int value) {
+ return forNumber(value);
+ }
+
+ /**
+ * @param value The numeric wire value of the corresponding enum entry.
+ * @return The enum associated with the given numeric wire value.
+ */
+ public static Status forNumber(int value) {
+ switch (value) {
+ case 0:
+ return STATUS_UNKNOWN;
+ case 1:
+ return STATUS_ACTIVE;
+ case 2:
+ return STATUS_INACTIVE;
+ default:
+ return null;
+ }
+ }
+
+ public static com.google.protobuf.Internal.EnumLiteMap internalGetValueMap() {
+ return internalValueMap;
+ }
+
+ private static final com.google.protobuf.Internal.EnumLiteMap internalValueMap = new com.google.protobuf.Internal.EnumLiteMap() {
+ public Status findValueByNumber(int number) {
+ return Status.forNumber(number);
+ }
+ };
+
+ public final com.google.protobuf.Descriptors.EnumValueDescriptor getValueDescriptor() {
+ if (this == UNRECOGNIZED) {
+ throw new java.lang.IllegalStateException("Can't get the descriptor of an unrecognized enum value.");
+ }
+ return getDescriptor().getValues().get(ordinal());
+ }
+
+ public final com.google.protobuf.Descriptors.EnumDescriptor getDescriptorForType() {
+ return getDescriptor();
+ }
+
+ public static final com.google.protobuf.Descriptors.EnumDescriptor getDescriptor() {
+ return org.apache.avro.protobuf.noopt.TestProto3.getDescriptor().getEnumTypes().get(0);
+ }
+
+ private static final Status[] VALUES = values();
+
+ public static Status valueOf(com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
+ if (desc.getType() != getDescriptor()) {
+ throw new java.lang.IllegalArgumentException("EnumValueDescriptor is not for this type.");
+ }
+ if (desc.getIndex() == -1) {
+ return UNRECOGNIZED;
+ }
+ return VALUES[desc.getIndex()];
+ }
+
+ private final int value;
+
+ private Status(int value) {
+ this.value = value;
+ }
+
+ // @@protoc_insertion_point(enum_scope:org.apache.avro.protobuf.noopt.Status)
+ }
+
+ public interface UserOrBuilder extends
+ // @@protoc_insertion_point(interface_extends:org.apache.avro.protobuf.noopt.User)
+ com.google.protobuf.MessageOrBuilder {
+
+ /**
+ * string name = 1;
+ *
+ * @return The name.
+ */
+ java.lang.String getName();
+
+ /**
+ * string name = 1;
+ *
+ * @return The bytes for name.
+ */
+ com.google.protobuf.ByteString getNameBytes();
+
+ /**
+ * int32 id = 2;
+ *
+ * @return The id.
+ */
+ int getId();
+
+ /**
+ * .org.apache.avro.protobuf.noopt.Status status = 3;
+ *
+ * @return The enum numeric value on the wire for status.
+ */
+ int getStatusValue();
+
+ /**
+ * .org.apache.avro.protobuf.noopt.Status status = 3;
+ *
+ * @return The status.
+ */
+ org.apache.avro.protobuf.noopt.TestProto3.Status getStatus();
+ }
+
+ /**
+ * Protobuf type {@code org.apache.avro.protobuf.noopt.User}
+ */
+ public static final class User extends com.google.protobuf.GeneratedMessage implements
+ // @@protoc_insertion_point(message_implements:org.apache.avro.protobuf.noopt.User)
+ UserOrBuilder {
+ private static final long serialVersionUID = 0L;
+ static {
+ com.google.protobuf.RuntimeVersion.validateProtobufGencodeVersion(
+ com.google.protobuf.RuntimeVersion.RuntimeDomain.PUBLIC, /* major= */ 4, /* minor= */ 29, /* patch= */ 3,
+ /* suffix= */ "", User.class.getName());
+ }
+
+ // Use User.newBuilder() to construct.
+ private User(com.google.protobuf.GeneratedMessage.Builder> builder) {
+ super(builder);
+ }
+
+ private User() {
+ name_ = "";
+ status_ = 0;
+ }
+
+ public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+ return org.apache.avro.protobuf.noopt.TestProto3.internal_static_org_apache_avro_protobuf_noopt_User_descriptor;
+ }
+
+ @java.lang.Override
+ protected com.google.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() {
+ return org.apache.avro.protobuf.noopt.TestProto3.internal_static_org_apache_avro_protobuf_noopt_User_fieldAccessorTable
+ .ensureFieldAccessorsInitialized(org.apache.avro.protobuf.noopt.TestProto3.User.class,
+ org.apache.avro.protobuf.noopt.TestProto3.User.Builder.class);
+ }
+
+ public static final int NAME_FIELD_NUMBER = 1;
+ @SuppressWarnings("serial")
+ private volatile java.lang.Object name_ = "";
+
+ /**
+ * string name = 1;
+ *
+ * @return The name.
+ */
+ @java.lang.Override
+ public java.lang.String getName() {
+ java.lang.Object ref = name_;
+ if (ref instanceof java.lang.String) {
+ return (java.lang.String) ref;
+ } else {
+ com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+ java.lang.String s = bs.toStringUtf8();
+ name_ = s;
+ return s;
+ }
+ }
+
+ /**
+ * string name = 1;
+ *
+ * @return The bytes for name.
+ */
+ @java.lang.Override
+ public com.google.protobuf.ByteString getNameBytes() {
+ java.lang.Object ref = name_;
+ if (ref instanceof java.lang.String) {
+ com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+ name_ = b;
+ return b;
+ } else {
+ return (com.google.protobuf.ByteString) ref;
+ }
+ }
+
+ public static final int ID_FIELD_NUMBER = 2;
+ private int id_ = 0;
+
+ /**
+ * int32 id = 2;
+ *
+ * @return The id.
+ */
+ @java.lang.Override
+ public int getId() {
+ return id_;
+ }
+
+ public static final int STATUS_FIELD_NUMBER = 3;
+ private int status_ = 0;
+
+ /**
+ * .org.apache.avro.protobuf.noopt.Status status = 3;
+ *
+ * @return The enum numeric value on the wire for status.
+ */
+ @java.lang.Override
+ public int getStatusValue() {
+ return status_;
+ }
+
+ /**
+ * .org.apache.avro.protobuf.noopt.Status status = 3;
+ *
+ * @return The status.
+ */
+ @java.lang.Override
+ public org.apache.avro.protobuf.noopt.TestProto3.Status getStatus() {
+ org.apache.avro.protobuf.noopt.TestProto3.Status result = org.apache.avro.protobuf.noopt.TestProto3.Status
+ .forNumber(status_);
+ return result == null ? org.apache.avro.protobuf.noopt.TestProto3.Status.UNRECOGNIZED : result;
+ }
+
+ private byte memoizedIsInitialized = -1;
+
+ @java.lang.Override
+ public final boolean isInitialized() {
+ byte isInitialized = memoizedIsInitialized;
+ if (isInitialized == 1)
+ return true;
+ if (isInitialized == 0)
+ return false;
+
+ memoizedIsInitialized = 1;
+ return true;
+ }
+
+ @java.lang.Override
+ public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException {
+ if (!com.google.protobuf.GeneratedMessage.isStringEmpty(name_)) {
+ com.google.protobuf.GeneratedMessage.writeString(output, 1, name_);
+ }
+ if (id_ != 0) {
+ output.writeInt32(2, id_);
+ }
+ if (status_ != org.apache.avro.protobuf.noopt.TestProto3.Status.STATUS_UNKNOWN.getNumber()) {
+ output.writeEnum(3, status_);
+ }
+ getUnknownFields().writeTo(output);
+ }
+
+ @java.lang.Override
+ public int getSerializedSize() {
+ int size = memoizedSize;
+ if (size != -1)
+ return size;
+
+ size = 0;
+ if (!com.google.protobuf.GeneratedMessage.isStringEmpty(name_)) {
+ size += com.google.protobuf.GeneratedMessage.computeStringSize(1, name_);
+ }
+ if (id_ != 0) {
+ size += com.google.protobuf.CodedOutputStream.computeInt32Size(2, id_);
+ }
+ if (status_ != org.apache.avro.protobuf.noopt.TestProto3.Status.STATUS_UNKNOWN.getNumber()) {
+ size += com.google.protobuf.CodedOutputStream.computeEnumSize(3, status_);
+ }
+ size += getUnknownFields().getSerializedSize();
+ memoizedSize = size;
+ return size;
+ }
+
+ @java.lang.Override
+ public boolean equals(final java.lang.Object obj) {
+ if (obj == this) {
+ return true;
+ }
+ if (!(obj instanceof org.apache.avro.protobuf.noopt.TestProto3.User)) {
+ return super.equals(obj);
+ }
+ org.apache.avro.protobuf.noopt.TestProto3.User other = (org.apache.avro.protobuf.noopt.TestProto3.User) obj;
+
+ if (!getName().equals(other.getName()))
+ return false;
+ if (getId() != other.getId())
+ return false;
+ if (status_ != other.status_)
+ return false;
+ if (!getUnknownFields().equals(other.getUnknownFields()))
+ return false;
+ return true;
+ }
+
+ @java.lang.Override
+ public int hashCode() {
+ if (memoizedHashCode != 0) {
+ return memoizedHashCode;
+ }
+ int hash = 41;
+ hash = (19 * hash) + getDescriptor().hashCode();
+ hash = (37 * hash) + NAME_FIELD_NUMBER;
+ hash = (53 * hash) + getName().hashCode();
+ hash = (37 * hash) + ID_FIELD_NUMBER;
+ hash = (53 * hash) + getId();
+ hash = (37 * hash) + STATUS_FIELD_NUMBER;
+ hash = (53 * hash) + status_;
+ hash = (29 * hash) + getUnknownFields().hashCode();
+ memoizedHashCode = hash;
+ return hash;
+ }
+
+ public static org.apache.avro.protobuf.noopt.TestProto3.User parseFrom(java.nio.ByteBuffer data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+
+ public static org.apache.avro.protobuf.noopt.TestProto3.User parseFrom(java.nio.ByteBuffer data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+
+ public static org.apache.avro.protobuf.noopt.TestProto3.User parseFrom(com.google.protobuf.ByteString data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+
+ public static org.apache.avro.protobuf.noopt.TestProto3.User parseFrom(com.google.protobuf.ByteString data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+
+ public static org.apache.avro.protobuf.noopt.TestProto3.User parseFrom(byte[] data)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data);
+ }
+
+ public static org.apache.avro.protobuf.noopt.TestProto3.User parseFrom(byte[] data,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ return PARSER.parseFrom(data, extensionRegistry);
+ }
+
+ public static org.apache.avro.protobuf.noopt.TestProto3.User parseFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessage.parseWithIOException(PARSER, input);
+ }
+
+ public static org.apache.avro.protobuf.noopt.TestProto3.User parseFrom(java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessage.parseWithIOException(PARSER, input, extensionRegistry);
+ }
+
+ public static org.apache.avro.protobuf.noopt.TestProto3.User parseDelimitedFrom(java.io.InputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessage.parseDelimitedWithIOException(PARSER, input);
+ }
+
+ public static org.apache.avro.protobuf.noopt.TestProto3.User parseDelimitedFrom(java.io.InputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessage.parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+ }
+
+ public static org.apache.avro.protobuf.noopt.TestProto3.User parseFrom(com.google.protobuf.CodedInputStream input)
+ throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessage.parseWithIOException(PARSER, input);
+ }
+
+ public static org.apache.avro.protobuf.noopt.TestProto3.User parseFrom(com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
+ return com.google.protobuf.GeneratedMessage.parseWithIOException(PARSER, input, extensionRegistry);
+ }
+
+ @java.lang.Override
+ public Builder newBuilderForType() {
+ return newBuilder();
+ }
+
+ public static Builder newBuilder() {
+ return DEFAULT_INSTANCE.toBuilder();
+ }
+
+ public static Builder newBuilder(org.apache.avro.protobuf.noopt.TestProto3.User prototype) {
+ return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+ }
+
+ @java.lang.Override
+ public Builder toBuilder() {
+ return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this);
+ }
+
+ @java.lang.Override
+ protected Builder newBuilderForType(com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+ Builder builder = new Builder(parent);
+ return builder;
+ }
+
+ /**
+ * Protobuf type {@code org.apache.avro.protobuf.noopt.User}
+ */
+ public static final class Builder extends com.google.protobuf.GeneratedMessage.Builder implements
+ // @@protoc_insertion_point(builder_implements:org.apache.avro.protobuf.noopt.User)
+ org.apache.avro.protobuf.noopt.TestProto3.UserOrBuilder {
+ public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() {
+ return org.apache.avro.protobuf.noopt.TestProto3.internal_static_org_apache_avro_protobuf_noopt_User_descriptor;
+ }
+
+ @java.lang.Override
+ protected com.google.protobuf.GeneratedMessage.FieldAccessorTable internalGetFieldAccessorTable() {
+ return org.apache.avro.protobuf.noopt.TestProto3.internal_static_org_apache_avro_protobuf_noopt_User_fieldAccessorTable
+ .ensureFieldAccessorsInitialized(org.apache.avro.protobuf.noopt.TestProto3.User.class,
+ org.apache.avro.protobuf.noopt.TestProto3.User.Builder.class);
+ }
+
+ // Construct using org.apache.avro.protobuf.noopt.TestProto3.User.newBuilder()
+ private Builder() {
+
+ }
+
+ private Builder(com.google.protobuf.GeneratedMessage.BuilderParent parent) {
+ super(parent);
+
+ }
+
+ @java.lang.Override
+ public Builder clear() {
+ super.clear();
+ bitField0_ = 0;
+ name_ = "";
+ id_ = 0;
+ status_ = 0;
+ return this;
+ }
+
+ @java.lang.Override
+ public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() {
+ return org.apache.avro.protobuf.noopt.TestProto3.internal_static_org_apache_avro_protobuf_noopt_User_descriptor;
+ }
+
+ @java.lang.Override
+ public org.apache.avro.protobuf.noopt.TestProto3.User getDefaultInstanceForType() {
+ return org.apache.avro.protobuf.noopt.TestProto3.User.getDefaultInstance();
+ }
+
+ @java.lang.Override
+ public org.apache.avro.protobuf.noopt.TestProto3.User build() {
+ org.apache.avro.protobuf.noopt.TestProto3.User result = buildPartial();
+ if (!result.isInitialized()) {
+ throw newUninitializedMessageException(result);
+ }
+ return result;
+ }
+
+ @java.lang.Override
+ public org.apache.avro.protobuf.noopt.TestProto3.User buildPartial() {
+ org.apache.avro.protobuf.noopt.TestProto3.User result = new org.apache.avro.protobuf.noopt.TestProto3.User(
+ this);
+ if (bitField0_ != 0) {
+ buildPartial0(result);
+ }
+ onBuilt();
+ return result;
+ }
+
+ private void buildPartial0(org.apache.avro.protobuf.noopt.TestProto3.User result) {
+ int from_bitField0_ = bitField0_;
+ if (((from_bitField0_ & 0x00000001) != 0)) {
+ result.name_ = name_;
+ }
+ if (((from_bitField0_ & 0x00000002) != 0)) {
+ result.id_ = id_;
+ }
+ if (((from_bitField0_ & 0x00000004) != 0)) {
+ result.status_ = status_;
+ }
+ }
+
+ @java.lang.Override
+ public Builder mergeFrom(com.google.protobuf.Message other) {
+ if (other instanceof org.apache.avro.protobuf.noopt.TestProto3.User) {
+ return mergeFrom((org.apache.avro.protobuf.noopt.TestProto3.User) other);
+ } else {
+ super.mergeFrom(other);
+ return this;
+ }
+ }
+
+ public Builder mergeFrom(org.apache.avro.protobuf.noopt.TestProto3.User other) {
+ if (other == org.apache.avro.protobuf.noopt.TestProto3.User.getDefaultInstance())
+ return this;
+ if (!other.getName().isEmpty()) {
+ name_ = other.name_;
+ bitField0_ |= 0x00000001;
+ onChanged();
+ }
+ if (other.getId() != 0) {
+ setId(other.getId());
+ }
+ if (other.status_ != 0) {
+ setStatusValue(other.getStatusValue());
+ }
+ this.mergeUnknownFields(other.getUnknownFields());
+ onChanged();
+ return this;
+ }
+
+ @java.lang.Override
+ public final boolean isInitialized() {
+ return true;
+ }
+
+ @java.lang.Override
+ public Builder mergeFrom(com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws java.io.IOException {
+ if (extensionRegistry == null) {
+ throw new java.lang.NullPointerException();
+ }
+ try {
+ boolean done = false;
+ while (!done) {
+ int tag = input.readTag();
+ switch (tag) {
+ case 0:
+ done = true;
+ break;
+ case 10: {
+ name_ = input.readStringRequireUtf8();
+ bitField0_ |= 0x00000001;
+ break;
+ } // case 10
+ case 16: {
+ id_ = input.readInt32();
+ bitField0_ |= 0x00000002;
+ break;
+ } // case 16
+ case 24: {
+ status_ = input.readEnum();
+ bitField0_ |= 0x00000004;
+ break;
+ } // case 24
+ default: {
+ if (!super.parseUnknownField(input, extensionRegistry, tag)) {
+ done = true; // was an endgroup tag
+ }
+ break;
+ } // default:
+ } // switch (tag)
+ } // while (!done)
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ throw e.unwrapIOException();
+ } finally {
+ onChanged();
+ } // finally
+ return this;
+ }
+
+ private int bitField0_;
+
+ private java.lang.Object name_ = "";
+
+ /**
+ * string name = 1;
+ *
+ * @return The name.
+ */
+ public java.lang.String getName() {
+ java.lang.Object ref = name_;
+ if (!(ref instanceof java.lang.String)) {
+ com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref;
+ java.lang.String s = bs.toStringUtf8();
+ name_ = s;
+ return s;
+ } else {
+ return (java.lang.String) ref;
+ }
+ }
+
+ /**
+ * string name = 1;
+ *
+ * @return The bytes for name.
+ */
+ public com.google.protobuf.ByteString getNameBytes() {
+ java.lang.Object ref = name_;
+ if (ref instanceof String) {
+ com.google.protobuf.ByteString b = com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref);
+ name_ = b;
+ return b;
+ } else {
+ return (com.google.protobuf.ByteString) ref;
+ }
+ }
+
+ /**
+ * string name = 1;
+ *
+ * @param value The name to set.
+ * @return This builder for chaining.
+ */
+ public Builder setName(java.lang.String value) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+ name_ = value;
+ bitField0_ |= 0x00000001;
+ onChanged();
+ return this;
+ }
+
+ /**
+ * string name = 1;
+ *
+ * @return This builder for chaining.
+ */
+ public Builder clearName() {
+ name_ = getDefaultInstance().getName();
+ bitField0_ = (bitField0_ & ~0x00000001);
+ onChanged();
+ return this;
+ }
+
+ /**
+ * string name = 1;
+ *
+ * @param value The bytes for name to set.
+ * @return This builder for chaining.
+ */
+ public Builder setNameBytes(com.google.protobuf.ByteString value) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+ checkByteStringIsUtf8(value);
+ name_ = value;
+ bitField0_ |= 0x00000001;
+ onChanged();
+ return this;
+ }
+
+ private int id_;
+
+ /**
+ * int32 id = 2;
+ *
+ * @return The id.
+ */
+ @java.lang.Override
+ public int getId() {
+ return id_;
+ }
+
+ /**
+ * int32 id = 2;
+ *
+ * @param value The id to set.
+ * @return This builder for chaining.
+ */
+ public Builder setId(int value) {
+
+ id_ = value;
+ bitField0_ |= 0x00000002;
+ onChanged();
+ return this;
+ }
+
+ /**
+ * int32 id = 2;
+ *
+ * @return This builder for chaining.
+ */
+ public Builder clearId() {
+ bitField0_ = (bitField0_ & ~0x00000002);
+ id_ = 0;
+ onChanged();
+ return this;
+ }
+
+ private int status_ = 0;
+
+ /**
+ * .org.apache.avro.protobuf.noopt.Status status = 3;
+ *
+ * @return The enum numeric value on the wire for status.
+ */
+ @java.lang.Override
+ public int getStatusValue() {
+ return status_;
+ }
+
+ /**
+ * .org.apache.avro.protobuf.noopt.Status status = 3;
+ *
+ * @param value The enum numeric value on the wire for status to set.
+ * @return This builder for chaining.
+ */
+ public Builder setStatusValue(int value) {
+ status_ = value;
+ bitField0_ |= 0x00000004;
+ onChanged();
+ return this;
+ }
+
+ /**
+ * .org.apache.avro.protobuf.noopt.Status status = 3;
+ *
+ * @return The status.
+ */
+ @java.lang.Override
+ public org.apache.avro.protobuf.noopt.TestProto3.Status getStatus() {
+ org.apache.avro.protobuf.noopt.TestProto3.Status result = org.apache.avro.protobuf.noopt.TestProto3.Status
+ .forNumber(status_);
+ return result == null ? org.apache.avro.protobuf.noopt.TestProto3.Status.UNRECOGNIZED : result;
+ }
+
+ /**
+ * .org.apache.avro.protobuf.noopt.Status status = 3;
+ *
+ * @param value The status to set.
+ * @return This builder for chaining.
+ */
+ public Builder setStatus(org.apache.avro.protobuf.noopt.TestProto3.Status value) {
+ if (value == null) {
+ throw new NullPointerException();
+ }
+ bitField0_ |= 0x00000004;
+ status_ = value.getNumber();
+ onChanged();
+ return this;
+ }
+
+ /**
+ * .org.apache.avro.protobuf.noopt.Status status = 3;
+ *
+ * @return This builder for chaining.
+ */
+ public Builder clearStatus() {
+ bitField0_ = (bitField0_ & ~0x00000004);
+ status_ = 0;
+ onChanged();
+ return this;
+ }
+
+ // @@protoc_insertion_point(builder_scope:org.apache.avro.protobuf.noopt.User)
+ }
+
+ // @@protoc_insertion_point(class_scope:org.apache.avro.protobuf.noopt.User)
+ private static final org.apache.avro.protobuf.noopt.TestProto3.User DEFAULT_INSTANCE;
+ static {
+ DEFAULT_INSTANCE = new org.apache.avro.protobuf.noopt.TestProto3.User();
+ }
+
+ public static org.apache.avro.protobuf.noopt.TestProto3.User getDefaultInstance() {
+ return DEFAULT_INSTANCE;
+ }
+
+ private static final com.google.protobuf.Parser PARSER = new com.google.protobuf.AbstractParser() {
+ @java.lang.Override
+ public User parsePartialFrom(com.google.protobuf.CodedInputStream input,
+ com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+ throws com.google.protobuf.InvalidProtocolBufferException {
+ Builder builder = newBuilder();
+ try {
+ builder.mergeFrom(input, extensionRegistry);
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ throw e.setUnfinishedMessage(builder.buildPartial());
+ } catch (com.google.protobuf.UninitializedMessageException e) {
+ throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial());
+ } catch (java.io.IOException e) {
+ throw new com.google.protobuf.InvalidProtocolBufferException(e).setUnfinishedMessage(builder.buildPartial());
+ }
+ return builder.buildPartial();
+ }
+ };
+
+ public static com.google.protobuf.Parser parser() {
+ return PARSER;
+ }
+
+ @java.lang.Override
+ public com.google.protobuf.Parser getParserForType() {
+ return PARSER;
+ }
+
+ @java.lang.Override
+ public org.apache.avro.protobuf.noopt.TestProto3.User getDefaultInstanceForType() {
+ return DEFAULT_INSTANCE;
+ }
+
+ }
+
+ private static final com.google.protobuf.Descriptors.Descriptor internal_static_org_apache_avro_protobuf_noopt_User_descriptor;
+ private static final com.google.protobuf.GeneratedMessage.FieldAccessorTable internal_static_org_apache_avro_protobuf_noopt_User_fieldAccessorTable;
+
+ public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() {
+ return descriptor;
+ }
+
+ private static com.google.protobuf.Descriptors.FileDescriptor descriptor;
+ static {
+ java.lang.String[] descriptorData = {
+ "\n#src/test/protobuf/test_proto3.proto\022\036o" + "rg.apache.avro.protobuf.noopt\"X\n\004User\022\014\n"
+ + "\004name\030\001 \001(\t\022\n\n\002id\030\002 \001(\005\0226\n\006status\030\003 \001(\0162"
+ + "&.org.apache.avro.protobuf.noopt.Status*"
+ + "D\n\006Status\022\022\n\016STATUS_UNKNOWN\020\000\022\021\n\rSTATUS_"
+ + "ACTIVE\020\001\022\023\n\017STATUS_INACTIVE\020\002b\006proto3" };
+ descriptor = com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom(descriptorData,
+ new com.google.protobuf.Descriptors.FileDescriptor[] {});
+ internal_static_org_apache_avro_protobuf_noopt_User_descriptor = getDescriptor().getMessageTypes().get(0);
+ internal_static_org_apache_avro_protobuf_noopt_User_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable(
+ internal_static_org_apache_avro_protobuf_noopt_User_descriptor,
+ new java.lang.String[] { "Name", "Id", "Status", });
+ descriptor.resolveAllFeaturesImmutable();
+ }
+
+ // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/lang/java/protobuf/src/test/protobuf/test.proto b/lang/java/protobuf/src/test/protobuf/test.proto
index 12fa5635a79..80d800ffc18 100644
--- a/lang/java/protobuf/src/test/protobuf/test.proto
+++ b/lang/java/protobuf/src/test/protobuf/test.proto
@@ -16,6 +16,8 @@
* limitations under the License.
*/
+syntax = "proto2";
+
package org.apache.avro.protobuf.noopt;
import "google/protobuf/timestamp.proto";
diff --git a/lang/java/protobuf/src/test/protobuf/test_proto3.proto b/lang/java/protobuf/src/test/protobuf/test_proto3.proto
new file mode 100644
index 00000000000..8244ed77acc
--- /dev/null
+++ b/lang/java/protobuf/src/test/protobuf/test_proto3.proto
@@ -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
+ *
+ * https://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.
+ */
+
+syntax = "proto3";
+
+package org.apache.avro.protobuf.noopt;
+
+enum Status {
+ STATUS_UNKNOWN = 0;
+ STATUS_ACTIVE = 1;
+ STATUS_INACTIVE = 2;
+}
+
+message User {
+ string name = 1;
+ int32 id = 2;
+ Status status = 3;
+}
diff --git a/pom.xml b/pom.xml
index e1d60c3d138..fb61c10da77 100644
--- a/pom.xml
+++ b/pom.xml
@@ -477,6 +477,7 @@
lang/java/mapred/src/test/resources/org/apache/avro/mapreduce/mapreduce-test-input.txt
lang/java/mapred/src/test/resources/org/apache/avro/mapreduce/mapreduce-test-input.avro/*
lang/java/protobuf/src/test/java/org/apache/avro/protobuf/noopt/Test.java
+ lang/java/protobuf/src/test/java/org/apache/avro/protobuf/noopt/TestProto3.java
lang/java/protobuf/src/test/java/org/apache/avro/protobuf/multiplefiles/A.java
lang/java/protobuf/src/test/java/org/apache/avro/protobuf/multiplefiles/Foo.java
lang/java/protobuf/src/test/java/org/apache/avro/protobuf/multiplefiles/FooOrBuilder.java