| ## |
| ## 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. |
| ## |
| #if ($schema.getNamespace()) |
| package $schema.getNamespace(); |
| #end |
| |
| import org.apache.avro.generic.GenericArray; |
| import org.apache.avro.specific.SpecificData; |
| import org.apache.avro.util.Utf8; |
| #if (!$schema.isError()) |
| import org.apache.avro.message.BinaryMessageEncoder; |
| import org.apache.avro.message.BinaryMessageDecoder; |
| import org.apache.avro.message.SchemaStore; |
| #end |
| #if (${this.gettersReturnOptional} || ${this.createOptionalGetters})import java.util.Optional;#end |
| |
| #if ($schema.getDoc()) |
| /** $schema.getDoc() */ |
| #end |
| #foreach ($annotation in $this.javaAnnotations($schema)) |
| @$annotation |
| #end |
| @org.apache.avro.specific.AvroGenerated |
| public class ${this.mangle($schema.getName())}#if ($schema.isError()) extends org.apache.avro.specific.SpecificExceptionBase#else extends org.apache.avro.specific.SpecificRecordBase#end implements org.apache.avro.specific.SpecificRecord { |
| private static final long serialVersionUID = ${this.fingerprint64($schema)}L; |
| public static final org.apache.avro.Schema SCHEMA$ = new org.apache.avro.Schema.Parser().parse(${this.javaSplit($schema.toString())}); |
| public static org.apache.avro.Schema getClassSchema() { return SCHEMA$; } |
| |
| private static SpecificData MODEL$ = new SpecificData(); |
| #set ($usedConversions = $this.getUsedConversionClasses($schema)) |
| #if (!$usedConversions.isEmpty()) |
| static { |
| #foreach ($conversion in $usedConversions) |
| MODEL$.addLogicalTypeConversion(new ${conversion}()); |
| #end |
| } |
| #end |
| |
| #if (!$schema.isError()) |
| private static final BinaryMessageEncoder<${this.mangle($schema.getName())}> ENCODER = |
| new BinaryMessageEncoder<${this.mangle($schema.getName())}>(MODEL$, SCHEMA$); |
| |
| private static final BinaryMessageDecoder<${this.mangle($schema.getName())}> DECODER = |
| new BinaryMessageDecoder<${this.mangle($schema.getName())}>(MODEL$, SCHEMA$); |
| |
| /** |
| * Return the BinaryMessageEncoder instance used by this class. |
| * @return the message encoder used by this class |
| */ |
| public static BinaryMessageEncoder<${this.mangle($schema.getName())}> getEncoder() { |
| return ENCODER; |
| } |
| |
| /** |
| * Return the BinaryMessageDecoder instance used by this class. |
| * @return the message decoder used by this class |
| */ |
| public static BinaryMessageDecoder<${this.mangle($schema.getName())}> getDecoder() { |
| return DECODER; |
| } |
| |
| /** |
| * Create a new BinaryMessageDecoder instance for this class that uses the specified {@link SchemaStore}. |
| * @param resolver a {@link SchemaStore} used to find schemas by fingerprint |
| * @return a BinaryMessageDecoder instance for this class backed by the given SchemaStore |
| */ |
| public static BinaryMessageDecoder<${this.mangle($schema.getName())}> createDecoder(SchemaStore resolver) { |
| return new BinaryMessageDecoder<${this.mangle($schema.getName())}>(MODEL$, SCHEMA$, resolver); |
| } |
| |
| /** |
| * Serializes this ${schema.getName()} to a ByteBuffer. |
| * @return a buffer holding the serialized data for this instance |
| * @throws java.io.IOException if this instance could not be serialized |
| */ |
| public java.nio.ByteBuffer toByteBuffer() throws java.io.IOException { |
| return ENCODER.encode(this); |
| } |
| |
| /** |
| * Deserializes a ${schema.getName()} from a ByteBuffer. |
| * @param b a byte buffer holding serialized data for an instance of this class |
| * @return a ${schema.getName()} instance decoded from the given buffer |
| * @throws java.io.IOException if the given bytes could not be deserialized into an instance of this class |
| */ |
| public static ${this.mangle($schema.getName())} fromByteBuffer( |
| java.nio.ByteBuffer b) throws java.io.IOException { |
| return DECODER.decode(b); |
| } |
| #end |
| |
| #foreach ($field in $schema.getFields()) |
| #if ($field.doc()) |
| /** $field.doc() */ |
| #end |
| #foreach ($annotation in $this.javaAnnotations($field)) |
| @$annotation |
| #end |
| #if (${this.deprecatedFields()})@Deprecated#end #if (${this.publicFields()})public#elseif (${this.privateFields()})private#end ${this.javaUnbox($field.schema())} ${this.mangle($field.name(), $schema.isError())}; |
| #end |
| #if ($schema.isError()) |
| |
| public ${this.mangle($schema.getName())}() { |
| super(); |
| } |
| |
| public ${this.mangle($schema.getName())}(Object value) { |
| super(value); |
| } |
| |
| public ${this.mangle($schema.getName())}(Throwable cause) { |
| super(cause); |
| } |
| |
| public ${this.mangle($schema.getName())}(Object value, Throwable cause) { |
| super(value, cause); |
| } |
| |
| #else |
| #if ($schema.getFields().size() > 0) |
| |
| /** |
| * Default constructor. Note that this does not initialize fields |
| * to their default values from the schema. If that is desired then |
| * one should use <code>newBuilder()</code>. |
| */ |
| public ${this.mangle($schema.getName())}() {} |
| #if ($this.isCreateAllArgsConstructor()) |
| |
| /** |
| * All-args constructor. |
| #foreach ($field in $schema.getFields()) |
| #if ($field.doc()) * @param ${this.mangle($field.name())} $field.doc() |
| #else * @param ${this.mangle($field.name())} The new value for ${field.name()} |
| #end |
| #end |
| */ |
| public ${this.mangle($schema.getName())}(#foreach($field in $schema.getFields())${this.javaType($field.schema())} ${this.mangle($field.name())}#if($foreach.count < $schema.getFields().size()), #end#end) { |
| #foreach ($field in $schema.getFields()) |
| ${this.generateSetterCode($field.schema(), ${this.mangle($field.name())}, ${this.mangle($field.name())})} |
| #end |
| } |
| #else |
| /** |
| * This schema contains more than 254 fields which exceeds the maximum number |
| * of permitted constructor parameters in the JVM. An all-args constructor |
| * will not be generated. Please use <code>newBuilder()</code> to instantiate |
| * objects instead. |
| */ |
| #end |
| #end |
| |
| #end |
| public org.apache.avro.specific.SpecificData getSpecificData() { return MODEL$; } |
| public org.apache.avro.Schema getSchema() { return SCHEMA$; } |
| // Used by DatumWriter. Applications should not call. |
| public java.lang.Object get(int field$) { |
| switch (field$) { |
| #set ($i = 0) |
| #foreach ($field in $schema.getFields()) |
| case $i: return ${this.mangle($field.name(), $schema.isError())}; |
| #set ($i = $i + 1) |
| #end |
| default: throw new org.apache.avro.AvroRuntimeException("Bad index"); |
| } |
| } |
| |
| #if ($this.hasLogicalTypeField($schema)) |
| private static final org.apache.avro.Conversion<?>[] conversions = |
| new org.apache.avro.Conversion<?>[] { |
| #foreach ($field in $schema.getFields()) |
| ${this.conversionInstance($field.schema())}, |
| #end |
| null |
| }; |
| |
| @Override |
| public org.apache.avro.Conversion<?> getConversion(int field) { |
| return conversions[field]; |
| } |
| |
| #end |
| // Used by DatumReader. Applications should not call. |
| @SuppressWarnings(value="unchecked") |
| public void put(int field$, java.lang.Object value$) { |
| switch (field$) { |
| #set ($i = 0) |
| #foreach ($field in $schema.getFields()) |
| case $i: ${this.mangle($field.name(), $schema.isError())} = #if(${this.javaType($field.schema())} != "java.lang.Object")(${this.javaType($field.schema())})#{end}value$; break; |
| #set ($i = $i + 1) |
| #end |
| default: throw new org.apache.avro.AvroRuntimeException("Bad index"); |
| } |
| } |
| |
| #foreach ($field in $schema.getFields()) |
| #if (${this.gettersReturnOptional}) |
| /** |
| * Gets the value of the '${this.mangle($field.name(), $schema.isError())}' field as an Optional<${this.javaType($field.schema())}>. |
| #if ($field.doc()) * $field.doc() |
| #end |
| * @return The value wrapped in an Optional<${this.javaType($field.schema())}>. |
| */ |
| public Optional<${this.javaType($field.schema())}> ${this.generateGetMethod($schema, $field)}() { |
| return Optional.<${this.javaType($field.schema())}>ofNullable(${this.mangle($field.name(), $schema.isError())}); |
| } |
| #else |
| /** |
| * Gets the value of the '${this.mangle($field.name(), $schema.isError())}' field. |
| #if ($field.doc()) * @return $field.doc() |
| #else * @return The value of the '${this.mangle($field.name(), $schema.isError())}' field. |
| #end |
| */ |
| public ${this.javaUnbox($field.schema())} ${this.generateGetMethod($schema, $field)}() { |
| return ${this.mangle($field.name(), $schema.isError())}; |
| } |
| #end |
| |
| #if (${this.createOptionalGetters}) |
| /** |
| * Gets the value of the '${this.mangle($field.name(), $schema.isError())}' field as an Optional<${this.javaType($field.schema())}>. |
| #if ($field.doc()) * $field.doc() |
| #end |
| * @return The value wrapped in an Optional<${this.javaType($field.schema())}>. |
| */ |
| public Optional<${this.javaType($field.schema())}> ${this.generateGetOptionalMethod($schema, $field)}() { |
| return Optional.<${this.javaType($field.schema())}>ofNullable(${this.mangle($field.name(), $schema.isError())}); |
| } |
| #end |
| |
| #if ($this.createSetters) |
| /** |
| * Sets the value of the '${this.mangle($field.name(), $schema.isError())}' field. |
| #if ($field.doc()) * $field.doc() |
| #end |
| * @param value the value to set. |
| */ |
| public void ${this.generateSetMethod($schema, $field)}(${this.javaUnbox($field.schema())} value) { |
| ${this.generateSetterCode($field.schema(), ${this.mangle($field.name(), $schema.isError())}, "value")} |
| } |
| #end |
| |
| #end |
| /** |
| * Creates a new ${this.mangle($schema.getName())} RecordBuilder. |
| * @return A new ${this.mangle($schema.getName())} RecordBuilder |
| */ |
| public static #if ($schema.getNamespace())$schema.getNamespace().#end${this.mangle($schema.getName())}.Builder newBuilder() { |
| return new #if ($schema.getNamespace())$schema.getNamespace().#end${this.mangle($schema.getName())}.Builder(); |
| } |
| |
| /** |
| * Creates a new ${this.mangle($schema.getName())} RecordBuilder by copying an existing Builder. |
| * @param other The existing builder to copy. |
| * @return A new ${this.mangle($schema.getName())} RecordBuilder |
| */ |
| public static #if ($schema.getNamespace())$schema.getNamespace().#end${this.mangle($schema.getName())}.Builder newBuilder(#if ($schema.getNamespace())$schema.getNamespace().#end${this.mangle($schema.getName())}.Builder other) { |
| if (other == null) { |
| return new #if ($schema.getNamespace())$schema.getNamespace().#end${this.mangle($schema.getName())}.Builder(); |
| } else { |
| return new #if ($schema.getNamespace())$schema.getNamespace().#end${this.mangle($schema.getName())}.Builder(other); |
| } |
| } |
| |
| /** |
| * Creates a new ${this.mangle($schema.getName())} RecordBuilder by copying an existing $this.mangle($schema.getName()) instance. |
| * @param other The existing instance to copy. |
| * @return A new ${this.mangle($schema.getName())} RecordBuilder |
| */ |
| public static #if ($schema.getNamespace())$schema.getNamespace().#end${this.mangle($schema.getName())}.Builder newBuilder(#if ($schema.getNamespace())$schema.getNamespace().#end${this.mangle($schema.getName())} other) { |
| if (other == null) { |
| return new #if ($schema.getNamespace())$schema.getNamespace().#end${this.mangle($schema.getName())}.Builder(); |
| } else { |
| return new #if ($schema.getNamespace())$schema.getNamespace().#end${this.mangle($schema.getName())}.Builder(other); |
| } |
| } |
| |
| /** |
| * RecordBuilder for ${this.mangle($schema.getName())} instances. |
| */ |
| public static class Builder extends#if ($schema.isError()) org.apache.avro.specific.SpecificErrorBuilderBase<${this.mangle($schema.getName())}>#else org.apache.avro.specific.SpecificRecordBuilderBase<${this.mangle($schema.getName())}>#end |
| |
| implements#if ($schema.isError()) org.apache.avro.data.ErrorBuilder<${this.mangle($schema.getName())}>#else org.apache.avro.data.RecordBuilder<${this.mangle($schema.getName())}>#end { |
| |
| #foreach ($field in $schema.getFields()) |
| #if ($field.doc()) |
| /** $field.doc() */ |
| #end |
| private ${this.javaUnbox($field.schema())} ${this.mangle($field.name(), $schema.isError())}; |
| #if (${this.hasBuilder($field.schema())}) |
| private ${this.javaUnbox($field.schema())}.Builder ${this.mangle($field.name(), $schema.isError())}Builder; |
| #end |
| #end |
| |
| /** Creates a new Builder */ |
| private Builder() { |
| super(SCHEMA$); |
| } |
| |
| /** |
| * Creates a Builder by copying an existing Builder. |
| * @param other The existing Builder to copy. |
| */ |
| private Builder(#if ($schema.getNamespace())$schema.getNamespace().#end${this.mangle($schema.getName())}.Builder other) { |
| super(other); |
| #foreach ($field in $schema.getFields()) |
| if (isValidValue(fields()[$field.pos()], other.${this.mangle($field.name(), $schema.isError())})) { |
| this.${this.mangle($field.name(), $schema.isError())} = data().deepCopy(fields()[$field.pos()].schema(), other.${this.mangle($field.name(), $schema.isError())}); |
| fieldSetFlags()[$field.pos()] = other.fieldSetFlags()[$field.pos()]; |
| } |
| #if (${this.hasBuilder($field.schema())}) |
| if (other.${this.generateHasBuilderMethod($schema, $field)}()) { |
| this.${this.mangle($field.name(), $schema.isError())}Builder = ${this.javaType($field.schema())}.newBuilder(other.${this.generateGetBuilderMethod($schema, $field)}()); |
| } |
| #end |
| #end |
| } |
| |
| /** |
| * Creates a Builder by copying an existing $this.mangle($schema.getName()) instance |
| * @param other The existing instance to copy. |
| */ |
| private Builder(#if ($schema.getNamespace())$schema.getNamespace().#end${this.mangle($schema.getName())} other) { |
| #if ($schema.isError()) super(other)#else |
| super(SCHEMA$)#end; |
| #foreach ($field in $schema.getFields()) |
| if (isValidValue(fields()[$field.pos()], other.${this.mangle($field.name(), $schema.isError())})) { |
| this.${this.mangle($field.name(), $schema.isError())} = data().deepCopy(fields()[$field.pos()].schema(), other.${this.mangle($field.name(), $schema.isError())}); |
| fieldSetFlags()[$field.pos()] = true; |
| } |
| #if (${this.hasBuilder($field.schema())}) |
| this.${this.mangle($field.name(), $schema.isError())}Builder = null; |
| #end |
| #end |
| } |
| #if ($schema.isError()) |
| |
| @Override |
| public #if ($schema.getNamespace())$schema.getNamespace().#end${this.mangle($schema.getName())}.Builder setValue(Object value) { |
| super.setValue(value); |
| return this; |
| } |
| |
| @Override |
| public #if ($schema.getNamespace())$schema.getNamespace().#end${this.mangle($schema.getName())}.Builder clearValue() { |
| super.clearValue(); |
| return this; |
| } |
| |
| @Override |
| public #if ($schema.getNamespace())$schema.getNamespace().#end${this.mangle($schema.getName())}.Builder setCause(Throwable cause) { |
| super.setCause(cause); |
| return this; |
| } |
| |
| @Override |
| public #if ($schema.getNamespace())$schema.getNamespace().#end${this.mangle($schema.getName())}.Builder clearCause() { |
| super.clearCause(); |
| return this; |
| } |
| #end |
| |
| #foreach ($field in $schema.getFields()) |
| /** |
| * Gets the value of the '${this.mangle($field.name(), $schema.isError())}' field. |
| #if ($field.doc()) * $field.doc() |
| #end |
| * @return The value. |
| */ |
| public ${this.javaUnbox($field.schema())} ${this.generateGetMethod($schema, $field)}() { |
| return ${this.mangle($field.name(), $schema.isError())}; |
| } |
| |
| #if (${this.createOptionalGetters}) |
| /** |
| * Gets the value of the '${this.mangle($field.name(), $schema.isError())}' field as an Optional<${this.javaType($field.schema())}>. |
| #if ($field.doc()) * $field.doc() |
| #end |
| * @return The Optional<value>. |
| */ |
| public Optional<${this.javaType($field.schema())}> ${this.generateGetOptionalMethod($schema, $field)}() { |
| return Optional.<${this.javaType($field.schema())}>ofNullable(${this.mangle($field.name(), $schema.isError())}); |
| } |
| #end |
| |
| /** |
| * Sets the value of the '${this.mangle($field.name(), $schema.isError())}' field. |
| #if ($field.doc()) * $field.doc() |
| #end |
| * @param value The value of '${this.mangle($field.name(), $schema.isError())}'. |
| * @return This builder. |
| */ |
| public #if ($schema.getNamespace())$schema.getNamespace().#end${this.mangle($schema.getName())}.Builder ${this.generateSetMethod($schema, $field)}(${this.javaUnbox($field.schema())} value) { |
| validate(fields()[$field.pos()], value); |
| #if (${this.hasBuilder($field.schema())}) |
| this.${this.mangle($field.name(), $schema.isError())}Builder = null; |
| #end |
| ${this.generateSetterCode($field.schema(), ${this.mangle($field.name(), $schema.isError())}, "value")} |
| fieldSetFlags()[$field.pos()] = true; |
| return this; |
| } |
| |
| /** |
| * Checks whether the '${this.mangle($field.name(), $schema.isError())}' field has been set. |
| #if ($field.doc()) * $field.doc() |
| #end |
| * @return True if the '${this.mangle($field.name(), $schema.isError())}' field has been set, false otherwise. |
| */ |
| public boolean ${this.generateHasMethod($schema, $field)}() { |
| return fieldSetFlags()[$field.pos()]; |
| } |
| |
| #if (${this.hasBuilder($field.schema())}) |
| /** |
| * Gets the Builder instance for the '${this.mangle($field.name(), $schema.isError())}' field and creates one if it doesn't exist yet. |
| #if ($field.doc()) * $field.doc() |
| #end |
| * @return This builder. |
| */ |
| public ${this.javaType($field.schema())}.Builder ${this.generateGetBuilderMethod($schema, $field)}() { |
| if (${this.mangle($field.name(), $schema.isError())}Builder == null) { |
| if (${this.generateHasMethod($schema, $field)}()) { |
| ${this.generateSetBuilderMethod($schema, $field)}(${this.javaType($field.schema())}.newBuilder(${this.mangle($field.name(), $schema.isError())})); |
| } else { |
| ${this.generateSetBuilderMethod($schema, $field)}(${this.javaType($field.schema())}.newBuilder()); |
| } |
| } |
| return ${this.mangle($field.name(), $schema.isError())}Builder; |
| } |
| |
| /** |
| * Sets the Builder instance for the '${this.mangle($field.name(), $schema.isError())}' field |
| #if ($field.doc()) * $field.doc() |
| #end |
| * @param value The builder instance that must be set. |
| * @return This builder. |
| */ |
| public #if ($schema.getNamespace())$schema.getNamespace().#end${this.mangle($schema.getName())}.Builder ${this.generateSetBuilderMethod($schema, $field)}(${this.javaUnbox($field.schema())}.Builder value) { |
| ${this.generateClearMethod($schema, $field)}(); |
| ${this.mangle($field.name(), $schema.isError())}Builder = value; |
| return this; |
| } |
| |
| /** |
| * Checks whether the '${this.mangle($field.name(), $schema.isError())}' field has an active Builder instance |
| #if ($field.doc()) * $field.doc() |
| #end |
| * @return True if the '${this.mangle($field.name(), $schema.isError())}' field has an active Builder instance |
| */ |
| public boolean ${this.generateHasBuilderMethod($schema, $field)}() { |
| return ${this.mangle($field.name(), $schema.isError())}Builder != null; |
| } |
| #end |
| |
| /** |
| * Clears the value of the '${this.mangle($field.name(), $schema.isError())}' field. |
| #if ($field.doc()) * $field.doc() |
| #end |
| * @return This builder. |
| */ |
| public #if ($schema.getNamespace())$schema.getNamespace().#end${this.mangle($schema.getName())}.Builder ${this.generateClearMethod($schema, $field)}() { |
| #if (${this.isUnboxedJavaTypeNullable($field.schema())}) |
| ${this.mangle($field.name(), $schema.isError())} = null; |
| #end |
| #if (${this.hasBuilder($field.schema())}) |
| ${this.mangle($field.name(), $schema.isError())}Builder = null; |
| #end |
| fieldSetFlags()[$field.pos()] = false; |
| return this; |
| } |
| |
| #end |
| @Override |
| @SuppressWarnings("unchecked") |
| public ${this.mangle($schema.getName())} build() { |
| try { |
| ${this.mangle($schema.getName())} record = new ${this.mangle($schema.getName())}(#if ($schema.isError())getValue(), getCause()#end); |
| #foreach ($field in $schema.getFields()) |
| #if (${this.hasBuilder($field.schema())}) |
| if (${this.mangle($field.name(), $schema.isError())}Builder != null) { |
| try { |
| record.${this.mangle($field.name(), $schema.isError())} = this.${this.mangle($field.name(), $schema.isError())}Builder.build(); |
| } catch (org.apache.avro.AvroMissingFieldException e) { |
| e.addParentField(record.getSchema().getField("${this.mangle($field.name(), $schema.isError())}")); |
| throw e; |
| } |
| } else { |
| record.${this.mangle($field.name(), $schema.isError())} = fieldSetFlags()[$field.pos()] ? this.${this.mangle($field.name(), $schema.isError())} : #if(${this.javaType($field.schema())} != "java.lang.Object")(${this.javaType($field.schema())})#{end} defaultValue(fields()[$field.pos()]); |
| } |
| #else |
| record.${this.mangle($field.name(), $schema.isError())} = fieldSetFlags()[$field.pos()] ? this.${this.mangle($field.name(), $schema.isError())} : #if(${this.javaType($field.schema())} != "java.lang.Object")(${this.javaType($field.schema())})#{end} defaultValue(fields()[$field.pos()]); |
| #end |
| #end |
| return record; |
| } catch (org.apache.avro.AvroMissingFieldException e) { |
| throw e; |
| } catch (java.lang.Exception e) { |
| throw new org.apache.avro.AvroRuntimeException(e); |
| } |
| } |
| } |
| |
| @SuppressWarnings("unchecked") |
| private static final org.apache.avro.io.DatumWriter<${this.mangle($schema.getName())}> |
| WRITER$ = (org.apache.avro.io.DatumWriter<${this.mangle($schema.getName())}>)MODEL$.createDatumWriter(SCHEMA$); |
| |
| @Override public void writeExternal(java.io.ObjectOutput out) |
| throws java.io.IOException { |
| WRITER$.write(this, SpecificData.getEncoder(out)); |
| } |
| |
| @SuppressWarnings("unchecked") |
| private static final org.apache.avro.io.DatumReader<${this.mangle($schema.getName())}> |
| READER$ = (org.apache.avro.io.DatumReader<${this.mangle($schema.getName())}>)MODEL$.createDatumReader(SCHEMA$); |
| |
| @Override public void readExternal(java.io.ObjectInput in) |
| throws java.io.IOException { |
| READER$.read(this, SpecificData.getDecoder(in)); |
| } |
| |
| #if ($this.isCustomCodable($schema)) |
| @Override protected boolean hasCustomCoders() { return true; } |
| |
| @Override public void customEncode(org.apache.avro.io.Encoder out) |
| throws java.io.IOException |
| { |
| #set ($nv = 0)## Counter to ensure unique var-names |
| #set ($maxnv = 0)## Holds high-water mark during recursion |
| #foreach ($field in $schema.getFields()) |
| #set ($n = $this.mangle($field.name(), $schema.isError())) |
| #set ($s = $field.schema()) |
| #encodeVar(0 "this.${n}" $s) |
| |
| #set ($nv = $maxnv) |
| #end |
| } |
| |
| @Override public void customDecode(org.apache.avro.io.ResolvingDecoder in) |
| throws java.io.IOException |
| { |
| org.apache.avro.Schema.Field[] fieldOrder = in.readFieldOrderIfDiff(); |
| if (fieldOrder == null) { |
| ## Common case: order of fields hasn't changed, so read them in a |
| ## fixed order according to reader's schema |
| #set ($nv = 0)## Counter to ensure unique var-names |
| #set ($maxnv = 0)## Holds high-water mark during recursion |
| #foreach ($field in $schema.getFields()) |
| #set ($n = $this.mangle($field.name(), $schema.isError())) |
| #set ($s = $field.schema()) |
| #set ($rs = "SCHEMA$.getField(""${n}"").schema()") |
| #decodeVar(2 "this.${n}" $s $rs) |
| |
| #set ($nv = $maxnv) |
| #end |
| } else { |
| for (int i = 0; i < $schema.getFields().size(); i++) { |
| switch (fieldOrder[i].pos()) { |
| #set ($fieldno = 0) |
| #set ($nv = 0)## Counter to ensure unique var-names |
| #set ($maxnv = 0)## Holds high-water mark during recursion |
| #foreach ($field in $schema.getFields()) |
| case $fieldno: |
| #set ($n = $this.mangle($field.name(), $schema.isError())) |
| #set ($s = $field.schema()) |
| #set ($rs = "SCHEMA$.getField(""${n}"").schema()") |
| #decodeVar(6 "this.${n}" $s $rs) |
| break; |
| |
| #set ($nv = $maxnv) |
| #set ($fieldno = $fieldno + 1) |
| #end |
| default: |
| throw new java.io.IOException("Corrupt ResolvingDecoder."); |
| } |
| } |
| } |
| } |
| #end |
| } |
| |
| #macro( encodeVar $indent $var $s ) |
| #set ($I = $this.indent($indent)) |
| ##### Compound types (array, map, and union) require calls |
| ##### that will recurse back into this encodeVar macro: |
| #if ($s.Type.Name.equals("array")) |
| #encodeArray($indent $var $s) |
| #elseif ($s.Type.Name.equals("map")) |
| #encodeMap($indent $var $s) |
| #elseif ($s.Type.Name.equals("union")) |
| #encodeUnion($indent $var $s) |
| ##### Use the generated "encode" method as fast way to write |
| ##### (specific) record types: |
| #elseif ($s.Type.Name.equals("record")) |
| $I ${var}.customEncode(out); |
| ##### For rest of cases, generate calls out.writeXYZ: |
| #elseif ($s.Type.Name.equals("null")) |
| $I out.writeNull(); |
| #elseif ($s.Type.Name.equals("boolean")) |
| $I out.writeBoolean(${var}); |
| #elseif ($s.Type.Name.equals("int")) |
| $I out.writeInt(${var}); |
| #elseif ($s.Type.Name.equals("long")) |
| $I out.writeLong(${var}); |
| #elseif ($s.Type.Name.equals("float")) |
| $I out.writeFloat(${var}); |
| #elseif ($s.Type.Name.equals("double")) |
| $I out.writeDouble(${var}); |
| #elseif ($s.Type.Name.equals("string")) |
| #if ($this.isStringable($s)) |
| $I out.writeString(${var}.toString()); |
| #else |
| $I out.writeString(${var}); |
| #end |
| #elseif ($s.Type.Name.equals("bytes")) |
| $I out.writeBytes(${var}); |
| #elseif ($s.Type.Name.equals("fixed")) |
| $I out.writeFixed(${var}.bytes(), 0, ${s.FixedSize}); |
| #elseif ($s.Type.Name.equals("enum")) |
| $I out.writeEnum(${var}.ordinal()); |
| #else |
| ## TODO -- singal a code-gen-time error |
| #end |
| #end |
| |
| #macro( encodeArray $indent $var $s ) |
| #set ($I = $this.indent($indent)) |
| #set ($et = $this.javaType($s.ElementType)) |
| $I long size${nv} = ${var}.size(); |
| $I out.writeArrayStart(); |
| $I out.setItemCount(size${nv}); |
| $I long actualSize${nv} = 0; |
| $I for ($et e${nv}: ${var}) { |
| $I actualSize${nv}++; |
| $I out.startItem(); |
| #set ($var = "e${nv}") |
| #set ($nv = $nv + 1) |
| #set ($maxnv = $nv) |
| #set ($indent = $indent + 2) |
| #encodeVar($indent $var $s.ElementType) |
| #set ($nv = $nv - 1) |
| #set ($indent = $indent - 2) |
| #set ($I = $this.indent($indent)) |
| $I } |
| $I out.writeArrayEnd(); |
| $I if (actualSize${nv} != size${nv}) |
| $I throw new java.util.ConcurrentModificationException("Array-size written was " + size${nv} + ", but element count was " + actualSize${nv} + "."); |
| #end |
| |
| #macro( encodeMap $indent $var $s ) |
| #set ($I = $this.indent($indent)) |
| #set ($kt = $this.getStringType($s)) |
| #set ($vt = $this.javaType($s.ValueType)) |
| $I long size${nv} = ${var}.size(); |
| $I out.writeMapStart(); |
| $I out.setItemCount(size${nv}); |
| $I long actualSize${nv} = 0; |
| $I for (java.util.Map.Entry<$kt, $vt> e${nv}: ${var}.entrySet()) { |
| $I actualSize${nv}++; |
| $I out.startItem(); |
| #if ($this.isStringable($s)) |
| $I out.writeString(e${nv}.getKey().toString()); |
| #else |
| $I out.writeString(e${nv}.getKey()); |
| #end |
| $I $vt v${nv} = e${nv}.getValue(); |
| #set ($var = "v${nv}") |
| #set ($nv = $nv + 1) |
| #set ($maxnv = $nv) |
| #set ($indent = $indent + 2) |
| #encodeVar($indent $var $s.ValueType) |
| #set ($nv = $nv - 1) |
| #set ($indent = $indent - 2) |
| #set ($I = $this.indent($indent)) |
| $I } |
| $I out.writeMapEnd(); |
| $I if (actualSize${nv} != size${nv}) |
| throw new java.util.ConcurrentModificationException("Map-size written was " + size${nv} + ", but element count was " + actualSize${nv} + "."); |
| #end |
| |
| #macro( encodeUnion $indent $var $s ) |
| #set ($I = $this.indent($indent)) |
| #set ($et = $this.javaType($s.Types.get($this.getNonNullIndex($s)))) |
| $I if (${var} == null) { |
| $I out.writeIndex(#if($this.getNonNullIndex($s)==0)1#{else}0#end); |
| $I out.writeNull(); |
| $I } else { |
| $I out.writeIndex(${this.getNonNullIndex($s)}); |
| #set ($indent = $indent + 2) |
| #encodeVar($indent $var $s.Types.get($this.getNonNullIndex($s))) |
| #set ($indent = $indent - 2) |
| #set ($I = $this.indent($indent)) |
| $I } |
| #end |
| |
| |
| #macro( decodeVar $indent $var $s $rs ) |
| #set ($I = $this.indent($indent)) |
| ##### Compound types (array, map, and union) require calls |
| ##### that will recurse back into this decodeVar macro: |
| #if ($s.Type.Name.equals("array")) |
| #decodeArray($indent $var $s $rs) |
| #elseif ($s.Type.Name.equals("map")) |
| #decodeMap($indent $var $s $rs) |
| #elseif ($s.Type.Name.equals("union")) |
| #decodeUnion($indent $var $s $rs) |
| ##### Use the generated "decode" method as fast way to write |
| ##### (specific) record types: |
| #elseif ($s.Type.Name.equals("record")) |
| $I if (${var} == null) { |
| $I ${var} = new ${this.javaType($s)}(); |
| $I } |
| $I ${var}.customDecode(in); |
| ##### For rest of cases, generate calls in.readXYZ: |
| #elseif ($s.Type.Name.equals("null")) |
| $I in.readNull(); |
| #elseif ($s.Type.Name.equals("boolean")) |
| $I $var = in.readBoolean(); |
| #elseif ($s.Type.Name.equals("int")) |
| $I $var = in.readInt(); |
| #elseif ($s.Type.Name.equals("long")) |
| $I $var = in.readLong(); |
| #elseif ($s.Type.Name.equals("float")) |
| $I $var = in.readFloat(); |
| #elseif ($s.Type.Name.equals("double")) |
| $I $var = in.readDouble(); |
| #elseif ($s.Type.Name.equals("string")) |
| #decodeString( "$I" $var $s ) |
| #elseif ($s.Type.Name.equals("bytes")) |
| $I $var = in.readBytes(${var}); |
| #elseif ($s.Type.Name.equals("fixed")) |
| $I if (${var} == null) { |
| $I ${var} = new ${this.javaType($s)}(); |
| $I } |
| $I in.readFixed(${var}.bytes(), 0, ${s.FixedSize}); |
| #elseif ($s.Type.Name.equals("enum")) |
| $I $var = ${this.javaType($s)}.values()[in.readEnum()]; |
| #else |
| ## TODO -- singal a code-gen-time error |
| #end |
| #end |
| |
| #macro( decodeString $II $var $s ) |
| #set ($st = ${this.getStringType($s)}) |
| #if ($this.isStringable($s)) |
| $II ${var} = new ${st}(in.readString()); |
| #elseif ($st.equals("java.lang.String")) |
| $II $var = in.readString(); |
| #elseif ($st.equals("org.apache.avro.util.Utf8")) |
| $II $var = in.readString(${var}); |
| #else |
| $II $var = in.readString(${var} instanceof Utf8 ? (Utf8)${var} : null); |
| #end |
| #end |
| |
| #macro( decodeArray $indent $var $s $rs ) |
| #set ($I = $this.indent($indent)) |
| #set ($t = $this.javaType($s)) |
| #set ($et = $this.javaType($s.ElementType)) |
| #set ($gat = "SpecificData.Array<${et}>") |
| $I long size${nv} = in.readArrayStart(); |
| ## Need fresh variable name due to limitation of macro system |
| $I $t a${nv} = ${var}; |
| $I if (a${nv} == null) { |
| $I a${nv} = new ${gat}((int)size${nv}, ${rs}); |
| $I $var = a${nv}; |
| $I } else a${nv}.clear(); |
| $I $gat ga${nv} = (a${nv} instanceof SpecificData.Array ? (${gat})a${nv} : null); |
| $I for ( ; 0 < size${nv}; size${nv} = in.arrayNext()) { |
| $I for ( ; size${nv} != 0; size${nv}--) { |
| $I $et e${nv} = (ga${nv} != null ? ga${nv}.peek() : null); |
| #set ($var = "e${nv}") |
| #set ($nv = $nv + 1) |
| #set ($maxnv = $nv) |
| #set ($indent = $indent + 4) |
| #decodeVar($indent $var $s.ElementType "${rs}.getElementType()") |
| #set ($nv = $nv - 1) |
| #set ($indent = $indent - 4) |
| #set ($I = $this.indent($indent)) |
| $I a${nv}.add(e${nv}); |
| $I } |
| $I } |
| #end |
| |
| #macro( decodeMap $indent $var $s $rs ) |
| #set ($I = $this.indent($indent)) |
| #set ($t = $this.javaType($s)) |
| #set ($kt = $this.getStringType($s)) |
| #set ($vt = $this.javaType($s.ValueType)) |
| $I long size${nv} = in.readMapStart(); |
| $I $t m${nv} = ${var}; // Need fresh name due to limitation of macro system |
| $I if (m${nv} == null) { |
| $I m${nv} = new java.util.HashMap<${kt},${vt}>((int)size${nv}); |
| $I $var = m${nv}; |
| $I } else m${nv}.clear(); |
| $I for ( ; 0 < size${nv}; size${nv} = in.mapNext()) { |
| $I for ( ; size${nv} != 0; size${nv}--) { |
| $I $kt k${nv} = null; |
| #decodeString( "$I " "k${nv}" $s ) |
| $I $vt v${nv} = null; |
| #set ($var = "v${nv}") |
| #set ($nv = $nv + 1) |
| #set ($maxnv = $nv) |
| #set ($indent = $indent + 4) |
| #decodeVar($indent $var $s.ValueType "${rs}.getValueType()") |
| #set ($nv = $nv - 1) |
| #set ($indent = $indent - 4) |
| #set ($I = $this.indent($indent)) |
| $I m${nv}.put(k${nv}, v${nv}); |
| $I } |
| $I } |
| #end |
| |
| #macro( decodeUnion $indent $var $s $rs ) |
| #set ($I = $this.indent($indent)) |
| #set ($et = $this.javaType($s.Types.get($this.getNonNullIndex($s)))) |
| #set ($si = $this.getNonNullIndex($s)) |
| $I if (in.readIndex() != ${si}) { |
| $I in.readNull(); |
| $I ${var} = null; |
| $I } else { |
| #set ($indent = $indent + 2) |
| #decodeVar($indent $var $s.Types.get($si) "${rs}.getTypes().get(${si})") |
| #set ($indent = $indent - 2) |
| #set ($I = $this.indent($indent)) |
| $I } |
| #end |