github.com/phrase/openapi@v0.0.0-20240514140800-49e8a106740e/openapi-generator/templates/java/pojo.mustache (about)

     1  /**
     2   * {{description}}{{^description}}{{classname}}{{/description}}{{#isDeprecated}}
     3   * @deprecated{{/isDeprecated}}
     4   */{{#isDeprecated}}
     5  @Deprecated{{/isDeprecated}}
     6  {{#swagger1AnnotationLibrary}}
     7  {{#description}}
     8  @ApiModel(description = "{{{.}}}")
     9  {{/description}}
    10  {{/swagger1AnnotationLibrary}}
    11  {{#swagger2AnnotationLibrary}}
    12  {{#description}}
    13  @Schema(description = "{{{.}}}")
    14  {{/description}}
    15  {{/swagger2AnnotationLibrary}}
    16  {{#jackson}}
    17  @JsonPropertyOrder({
    18  {{#vars}}
    19    {{classname}}.JSON_PROPERTY_{{nameInSnakeCase}}{{^-last}},{{/-last}}
    20  {{/vars}}
    21  })
    22  {{#isClassnameSanitized}}
    23  {{^hasDiscriminatorWithNonEmptyMapping}}
    24  @JsonTypeName("{{name}}")
    25  {{/hasDiscriminatorWithNonEmptyMapping}}
    26  {{/isClassnameSanitized}}
    27  {{/jackson}}
    28  {{>additionalModelTypeAnnotations}}{{>generatedAnnotation}}{{#discriminator}}{{>typeInfoAnnotation}}{{/discriminator}}{{>xmlAnnotation}}
    29  {{#vendorExtensions.x-class-extra-annotation}}
    30  {{{vendorExtensions.x-class-extra-annotation}}}
    31  {{/vendorExtensions.x-class-extra-annotation}}
    32  public class {{classname}} {{#parent}}extends {{{.}}} {{/parent}}{{#vendorExtensions.x-implements}}{{#-first}}implements {{{.}}}{{/-first}}{{^-first}}, {{{.}}}{{/-first}}{{#-last}} {{/-last}}{{/vendorExtensions.x-implements}}{
    33  {{#serializableModel}}
    34    private static final long serialVersionUID = 1L;
    35  
    36  {{/serializableModel}}
    37    {{#vars}}
    38      {{#isEnum}}
    39      {{^isContainer}}
    40  {{>modelInnerEnum}}
    41      {{/isContainer}}
    42      {{#isContainer}}
    43      {{#mostInnerItems}}
    44  {{>modelInnerEnum}}
    45      {{/mostInnerItems}}
    46      {{/isContainer}}
    47      {{/isEnum}}
    48    {{#gson}}
    49    public static final String SERIALIZED_NAME_{{nameInSnakeCase}} = "{{baseName}}";
    50    {{/gson}}
    51    {{#jackson}}
    52    public static final String JSON_PROPERTY_{{nameInSnakeCase}} = "{{baseName}}";
    53    {{/jackson}}
    54    {{#withXml}}
    55    {{#isXmlAttribute}}
    56    @XmlAttribute(name = "{{xmlName}}{{^xmlName}}{{baseName}}{{/xmlName}}")
    57    {{/isXmlAttribute}}
    58    {{^isXmlAttribute}}
    59      {{^isContainer}}
    60    @XmlElement({{#xmlNamespace}}namespace="{{.}}", {{/xmlNamespace}}name = "{{xmlName}}{{^xmlName}}{{baseName}}{{/xmlName}}")
    61      {{/isContainer}}
    62      {{#isContainer}}
    63    // Is a container wrapped={{isXmlWrapped}}
    64        {{#items}}
    65    // items.name={{name}} items.baseName={{baseName}} items.xmlName={{xmlName}} items.xmlNamespace={{xmlNamespace}}
    66    // items.example={{example}} items.type={{dataType}}
    67    @XmlElement({{#xmlNamespace}}namespace="{{.}}", {{/xmlNamespace}}name = "{{xmlName}}{{^xmlName}}{{baseName}}{{/xmlName}}")
    68        {{/items}}
    69        {{#isXmlWrapped}}
    70    @XmlElementWrapper({{#xmlNamespace}}namespace="{{.}}", {{/xmlNamespace}}name = "{{xmlName}}{{^xmlName}}{{baseName}}{{/xmlName}}")
    71        {{/isXmlWrapped}}
    72      {{/isContainer}}
    73    {{#isDateTime}}
    74    @XmlJavaTypeAdapter(OffsetDateTimeXmlAdapter.class)
    75    {{/isDateTime}}
    76    {{/isXmlAttribute}}
    77    {{/withXml}}
    78    {{#gson}}
    79    @SerializedName(SERIALIZED_NAME_{{nameInSnakeCase}})
    80    {{/gson}}
    81    {{#vendorExtensions.x-field-extra-annotation}}
    82    {{{vendorExtensions.x-field-extra-annotation}}}
    83    {{/vendorExtensions.x-field-extra-annotation}}
    84    {{#vendorExtensions.x-is-jackson-optional-nullable}}
    85    {{#isContainer}}
    86    private JsonNullable<{{{datatypeWithEnum}}}> {{name}} = JsonNullable.<{{{datatypeWithEnum}}}>undefined();
    87    {{/isContainer}}
    88    {{^isContainer}}
    89    private JsonNullable<{{{datatypeWithEnum}}}> {{name}} = JsonNullable.<{{{datatypeWithEnum}}}>{{#defaultValue}}of({{{.}}}){{/defaultValue}}{{^defaultValue}}undefined(){{/defaultValue}};
    90    {{/isContainer}}
    91    {{/vendorExtensions.x-is-jackson-optional-nullable}}
    92    {{^vendorExtensions.x-is-jackson-optional-nullable}}
    93    {{#isContainer}}
    94    private {{{datatypeWithEnum}}} {{name}}{{#defaultValue}} = {{{.}}}{{/defaultValue}};
    95    {{/isContainer}}
    96    {{^isContainer}}
    97    {{#isDiscriminator}}protected{{/isDiscriminator}}{{^isDiscriminator}}private{{/isDiscriminator}} {{{datatypeWithEnum}}} {{name}}{{#defaultValue}} = {{{.}}}{{/defaultValue}};
    98    {{/isContainer}}
    99    {{/vendorExtensions.x-is-jackson-optional-nullable}}
   100  
   101    {{/vars}}
   102    public {{classname}}() {
   103      {{#parent}}
   104      {{#parcelableModel}}
   105      super();{{/parcelableModel}}
   106      {{/parent}}
   107      {{#gson}}
   108      {{#discriminator}}
   109      {{#discriminator.isEnum}}
   110      this.{{{discriminatorName}}} = this.getClass().getSimpleName();
   111      {{/discriminator.isEnum}}
   112      {{/discriminator}}
   113      {{/gson}}
   114    }
   115    {{#vendorExtensions.x-has-readonly-properties}}
   116    {{^withXml}}
   117  
   118    {{#jsonb}}@JsonbCreator{{/jsonb}}{{#jackson}}@JsonCreator{{/jackson}}
   119    public {{classname}}(
   120    {{#readOnlyVars}}
   121      {{#jsonb}}@JsonbProperty(value = "{{baseName}}"{{^required}}, nullable = true{{/required}}){{/jsonb}}{{#jackson}}@JsonProperty(JSON_PROPERTY_{{nameInSnakeCase}}){{/jackson}} {{{datatypeWithEnum}}} {{name}}{{^-last}}, {{/-last}}
   122    {{/readOnlyVars}}
   123    ) {
   124      this();
   125    {{#readOnlyVars}}
   126      this.{{name}} = {{#vendorExtensions.x-is-jackson-optional-nullable}}{{name}} == null ? JsonNullable.<{{{datatypeWithEnum}}}>undefined() : JsonNullable.of({{name}}){{/vendorExtensions.x-is-jackson-optional-nullable}}{{^vendorExtensions.x-is-jackson-optional-nullable}}{{name}}{{/vendorExtensions.x-is-jackson-optional-nullable}};
   127    {{/readOnlyVars}}
   128    }
   129    {{/withXml}}
   130    {{/vendorExtensions.x-has-readonly-properties}}
   131    {{#vars}}
   132  
   133    {{^isReadOnly}}
   134    public {{classname}} {{name}}({{{datatypeWithEnum}}} {{name}}) {
   135      {{#vendorExtensions.x-is-jackson-optional-nullable}}this.{{name}} = JsonNullable.<{{{datatypeWithEnum}}}>of({{name}});{{/vendorExtensions.x-is-jackson-optional-nullable}}
   136      {{^vendorExtensions.x-is-jackson-optional-nullable}}this.{{name}} = {{name}};{{/vendorExtensions.x-is-jackson-optional-nullable}}
   137      return this;
   138    }
   139    {{#isArray}}
   140  
   141    public {{classname}} add{{nameInCamelCase}}Item({{{items.datatypeWithEnum}}} {{name}}Item) {
   142      {{#vendorExtensions.x-is-jackson-optional-nullable}}
   143      if (this.{{name}} == null || !this.{{name}}.isPresent()) {
   144        this.{{name}} = JsonNullable.<{{{datatypeWithEnum}}}>of({{{defaultValue}}}{{^defaultValue}}new {{#uniqueItems}}LinkedHashSet{{/uniqueItems}}{{^uniqueItems}}ArrayList{{/uniqueItems}}<>(){{/defaultValue}});
   145      }
   146      try {
   147        this.{{name}}.get().add({{name}}Item);
   148      } catch (java.util.NoSuchElementException e) {
   149        // this can never happen, as we make sure above that the value is present
   150      }
   151      return this;
   152      {{/vendorExtensions.x-is-jackson-optional-nullable}}
   153      {{^vendorExtensions.x-is-jackson-optional-nullable}}
   154      if (this.{{name}} == null) {
   155        this.{{name}} = {{{defaultValue}}}{{^defaultValue}}new {{#uniqueItems}}LinkedHashSet{{/uniqueItems}}{{^uniqueItems}}ArrayList{{/uniqueItems}}<>(){{/defaultValue}};
   156      }
   157      this.{{name}}.add({{name}}Item);
   158      return this;
   159      {{/vendorExtensions.x-is-jackson-optional-nullable}}
   160    }
   161    {{/isArray}}
   162    {{#isMap}}
   163  
   164    public {{classname}} put{{nameInCamelCase}}Item(String key, {{{items.datatypeWithEnum}}} {{name}}Item) {
   165      {{#vendorExtensions.x-is-jackson-optional-nullable}}
   166      if (this.{{name}} == null || !this.{{name}}.isPresent()) {
   167        this.{{name}} = JsonNullable.<{{{datatypeWithEnum}}}>of({{{defaultValue}}}{{^defaultValue}}new HashMap<>(){{/defaultValue}});
   168      }
   169      try {
   170        this.{{name}}.get().put(key, {{name}}Item);
   171      } catch (java.util.NoSuchElementException e) {
   172        // this can never happen, as we make sure above that the value is present
   173      }
   174      return this;
   175      {{/vendorExtensions.x-is-jackson-optional-nullable}}
   176      {{^vendorExtensions.x-is-jackson-optional-nullable}}
   177      {{^required}}
   178      if (this.{{name}} == null) {
   179        this.{{name}} = {{{defaultValue}}}{{^defaultValue}}new HashMap<>(){{/defaultValue}};
   180      }
   181      {{/required}}
   182      this.{{name}}.put(key, {{name}}Item);
   183      return this;
   184      {{/vendorExtensions.x-is-jackson-optional-nullable}}
   185    }
   186    {{/isMap}}
   187  
   188    {{/isReadOnly}}
   189     /**
   190    {{#description}}
   191     * {{.}}
   192    {{/description}}
   193    {{^description}}
   194     * Get {{name}}
   195    {{/description}}
   196    {{#minimum}}
   197     * minimum: {{.}}
   198    {{/minimum}}
   199    {{#maximum}}
   200     * maximum: {{.}}
   201    {{/maximum}}
   202     * @return {{name}}
   203     {{#deprecated}}
   204     * @deprecated
   205     {{/deprecated}}
   206    **/
   207  {{#deprecated}}
   208    @Deprecated
   209  {{/deprecated}}
   210  {{#required}}
   211  {{#isNullable}}
   212    @{{javaxPackage}}.annotation.Nullable
   213  {{/isNullable}}
   214  {{^isNullable}}
   215    @{{javaxPackage}}.annotation.Nonnull
   216  {{/isNullable}}
   217  {{/required}}
   218  {{^required}}
   219    @{{javaxPackage}}.annotation.Nullable
   220  {{/required}}
   221  {{#jsonb}}
   222    @JsonbProperty("{{baseName}}")
   223  {{/jsonb}}
   224  {{#useBeanValidation}}
   225  {{>beanValidation}}
   226  {{/useBeanValidation}}
   227  {{#swagger1AnnotationLibrary}}
   228    @ApiModelProperty({{#example}}example = "{{{.}}}", {{/example}}{{#required}}required = {{required}}, {{/required}}value = "{{{description}}}")
   229  {{/swagger1AnnotationLibrary}}
   230  {{#swagger2AnnotationLibrary}}
   231    @Schema({{#example}}example = "{{{.}}}", {{/example}}requiredMode = {{#required}}Schema.RequiredMode.REQUIRED{{/required}}{{^required}}Schema.RequiredMode.NOT_REQUIRED{{/required}}, description = "{{{description}}}")
   232  {{/swagger2AnnotationLibrary}}
   233  {{#vendorExtensions.x-extra-annotation}}
   234    {{{vendorExtensions.x-extra-annotation}}}
   235  {{/vendorExtensions.x-extra-annotation}}
   236  {{#vendorExtensions.x-is-jackson-optional-nullable}}
   237    {{!unannotated, Jackson would pick this up automatically and add it *in addition* to the _JsonNullable getter field}}
   238    @JsonIgnore
   239  {{/vendorExtensions.x-is-jackson-optional-nullable}}
   240  {{^vendorExtensions.x-is-jackson-optional-nullable}}{{#jackson}}{{> jackson_annotations}}{{/jackson}}{{/vendorExtensions.x-is-jackson-optional-nullable}}
   241    public {{{datatypeWithEnum}}} {{getter}}() {
   242      {{#vendorExtensions.x-is-jackson-optional-nullable}}
   243      {{#isReadOnly}}{{! A readonly attribute doesn't have setter => jackson will set null directly if explicitly returned by API, so make sure we have an empty JsonNullable}}
   244      if ({{name}} == null) {
   245        {{name}} = JsonNullable.<{{{datatypeWithEnum}}}>{{#defaultValue}}of({{{.}}}){{/defaultValue}}{{^defaultValue}}undefined(){{/defaultValue}};
   246      }
   247      {{/isReadOnly}}
   248      return {{name}}.orElse(null);
   249      {{/vendorExtensions.x-is-jackson-optional-nullable}}
   250      {{^vendorExtensions.x-is-jackson-optional-nullable}}
   251      return {{name}};
   252      {{/vendorExtensions.x-is-jackson-optional-nullable}}
   253    }
   254  
   255    {{#vendorExtensions.x-is-jackson-optional-nullable}}
   256  {{> jackson_annotations}}
   257    public JsonNullable<{{{datatypeWithEnum}}}> {{getter}}_JsonNullable() {
   258      return {{name}};
   259    }
   260    {{/vendorExtensions.x-is-jackson-optional-nullable}}{{#vendorExtensions.x-is-jackson-optional-nullable}}
   261    @JsonProperty(JSON_PROPERTY_{{nameInSnakeCase}})
   262    {{#isReadOnly}}private{{/isReadOnly}}{{^isReadOnly}}public{{/isReadOnly}} void {{setter}}_JsonNullable(JsonNullable<{{{datatypeWithEnum}}}> {{name}}) {
   263      {{! For getters/setters that have name differing from attribute name, we must include setter (albeit private) for jackson to be able to set the attribute}}
   264      this.{{name}} = {{name}};
   265    }
   266    {{/vendorExtensions.x-is-jackson-optional-nullable}}
   267  
   268    {{^isReadOnly}}
   269  {{#vendorExtensions.x-setter-extra-annotation}}  {{{vendorExtensions.x-setter-extra-annotation}}}
   270  {{/vendorExtensions.x-setter-extra-annotation}}{{#jackson}}{{^vendorExtensions.x-is-jackson-optional-nullable}}{{> jackson_annotations}}{{/vendorExtensions.x-is-jackson-optional-nullable}}{{/jackson}}  public void {{setter}}({{{datatypeWithEnum}}} {{name}}) {
   271      {{#vendorExtensions.x-is-jackson-optional-nullable}}
   272      this.{{name}} = JsonNullable.<{{{datatypeWithEnum}}}>of({{name}});
   273      {{/vendorExtensions.x-is-jackson-optional-nullable}}
   274      {{^vendorExtensions.x-is-jackson-optional-nullable}}
   275      this.{{name}} = {{name}};
   276      {{/vendorExtensions.x-is-jackson-optional-nullable}}
   277    }
   278    {{/isReadOnly}}
   279  
   280    {{/vars}}
   281    {{#parent}}
   282    {{#allVars}}
   283    {{#isOverridden}}
   284    @Override
   285    public {{classname}} {{name}}({{{datatypeWithEnum}}} {{name}}) {
   286      {{#vendorExtensions.x-is-jackson-optional-nullable}}
   287      this.{{setter}}(JsonNullable.<{{{datatypeWithEnum}}}>of({{name}}));
   288      {{/vendorExtensions.x-is-jackson-optional-nullable}}
   289      {{^vendorExtensions.x-is-jackson-optional-nullable}}
   290      this.{{setter}}({{name}});
   291      {{/vendorExtensions.x-is-jackson-optional-nullable}}
   292      return this;
   293    }
   294  
   295    {{/isOverridden}}
   296    {{/allVars}}
   297    {{/parent}}
   298    @Override
   299    public boolean equals(Object o) {
   300    {{#useReflectionEqualsHashCode}}
   301      return EqualsBuilder.reflectionEquals(this, o, false, null, true);
   302    {{/useReflectionEqualsHashCode}}
   303    {{^useReflectionEqualsHashCode}}
   304      if (this == o) {
   305        return true;
   306      }
   307      if (o == null || getClass() != o.getClass()) {
   308        return false;
   309      }{{#hasVars}}
   310      {{classname}} {{classVarName}} = ({{classname}}) o;
   311      return {{#vars}}{{#vendorExtensions.x-is-jackson-optional-nullable}}equalsNullable(this.{{name}}, {{classVarName}}.{{name}}){{/vendorExtensions.x-is-jackson-optional-nullable}}{{^vendorExtensions.x-is-jackson-optional-nullable}}{{#isByteArray}}Arrays{{/isByteArray}}{{^isByteArray}}Objects{{/isByteArray}}.equals(this.{{name}}, {{classVarName}}.{{name}}){{/vendorExtensions.x-is-jackson-optional-nullable}}{{^-last}} &&
   312          {{/-last}}{{/vars}}{{#parent}} &&
   313          super.equals(o){{/parent}};{{/hasVars}}{{^hasVars}}
   314      return {{#parent}}super.equals(o){{/parent}}{{^parent}}true{{/parent}};{{/hasVars}}
   315    {{/useReflectionEqualsHashCode}}
   316    }{{#vendorExtensions.x-jackson-optional-nullable-helpers}}
   317  
   318    private static <T> boolean equalsNullable(JsonNullable<T> a, JsonNullable<T> b) {
   319      return a == b || (a != null && b != null && a.isPresent() && b.isPresent() && Objects.deepEquals(a.get(), b.get()));
   320    }{{/vendorExtensions.x-jackson-optional-nullable-helpers}}
   321  
   322    @Override
   323    public int hashCode() {
   324    {{#useReflectionEqualsHashCode}}
   325      return HashCodeBuilder.reflectionHashCode(this);
   326    {{/useReflectionEqualsHashCode}}
   327    {{^useReflectionEqualsHashCode}}
   328      return Objects.hash({{#vars}}{{#vendorExtensions.x-is-jackson-optional-nullable}}hashCodeNullable({{name}}){{/vendorExtensions.x-is-jackson-optional-nullable}}{{^vendorExtensions.x-is-jackson-optional-nullable}}{{^isByteArray}}{{name}}{{/isByteArray}}{{#isByteArray}}Arrays.hashCode({{name}}){{/isByteArray}}{{/vendorExtensions.x-is-jackson-optional-nullable}}{{^-last}}, {{/-last}}{{/vars}}{{#parent}}{{#hasVars}}, {{/hasVars}}super.hashCode(){{/parent}});
   329    {{/useReflectionEqualsHashCode}}
   330    }{{#vendorExtensions.x-jackson-optional-nullable-helpers}}
   331  
   332    private static <T> int hashCodeNullable(JsonNullable<T> a) {
   333      if (a == null) {
   334        return 1;
   335      }
   336      return a.isPresent() ? Arrays.deepHashCode(new Object[]{a.get()}) : 31;
   337    }{{/vendorExtensions.x-jackson-optional-nullable-helpers}}
   338  
   339    @Override
   340    public String toString() {
   341      StringBuilder sb = new StringBuilder();
   342      sb.append("class {{classname}} {\n");
   343      {{#parent}}
   344      sb.append("    ").append(toIndentedString(super.toString())).append("\n");
   345      {{/parent}}
   346      {{#vars}}
   347      sb.append("    {{name}}: ").append(toIndentedString({{name}})).append("\n");
   348      {{/vars}}
   349      sb.append("}");
   350      return sb.toString();
   351    }
   352  
   353    /**
   354     * Convert the given object to string with each line indented by 4 spaces
   355     * (except the first line).
   356     */
   357    private{{#jsonb}} static{{/jsonb}} String toIndentedString(Object o) {
   358      if (o == null) {
   359        return "null";
   360      }
   361      return o.toString().replace("\n", "\n    ");
   362    }
   363  {{#supportUrlQuery}}
   364  
   365    /**
   366     * Convert the instance into URL query string.
   367     *
   368     * @return URL query string
   369     */
   370    public String toUrlQueryString() {
   371      return toUrlQueryString(null);
   372    }
   373  
   374    /**
   375     * Convert the instance into URL query string.
   376     *
   377     * @param prefix prefix of the query string
   378     * @return URL query string
   379     */
   380    public String toUrlQueryString(String prefix) {
   381      String suffix = "";
   382      String containerSuffix = "";
   383      String containerPrefix = "";
   384      if (prefix == null) {
   385        // style=form, explode=true, e.g. /pet?name=cat&type=manx
   386        prefix = "";
   387      } else {
   388        // deepObject style e.g. /pet?id[name]=cat&id[type]=manx
   389        prefix = prefix + "[";
   390        suffix = "]";
   391        containerSuffix = "]";
   392        containerPrefix = "[";
   393      }
   394  
   395      StringJoiner joiner = new StringJoiner("&");
   396  
   397      {{#allVars}}
   398      // add `{{baseName}}` to the URL query string
   399      {{#isArray}}
   400      {{#items.isPrimitiveType}}
   401      {{#uniqueItems}}
   402      if ({{getter}}() != null) {
   403        int i = 0;
   404        for ({{{items.dataType}}} _item : {{getter}}()) {
   405          try {
   406            joiner.add(String.format("%s{{baseName}}%s%s=%s", prefix, suffix,
   407                "".equals(suffix) ? "" : String.format("%s%d%s", containerPrefix, i, containerSuffix),
   408                URLEncoder.encode(String.valueOf(_item), "UTF-8").replaceAll("\\+", "%20")));
   409          } catch (UnsupportedEncodingException e) {
   410            // Should never happen, UTF-8 is always supported
   411            throw new RuntimeException(e);
   412          }
   413        }
   414        i++;
   415      }
   416      {{/uniqueItems}}
   417      {{^uniqueItems}}
   418      if ({{getter}}() != null) {
   419        for (int i = 0; i < {{getter}}().size(); i++) {
   420          try {
   421            joiner.add(String.format("%s{{baseName}}%s%s=%s", prefix, suffix,
   422                "".equals(suffix) ? "" : String.format("%s%d%s", containerPrefix, i, containerSuffix),
   423                URLEncoder.encode(String.valueOf({{getter}}().get(i)), "UTF-8").replaceAll("\\+", "%20")));
   424          } catch (UnsupportedEncodingException e) {
   425            // Should never happen, UTF-8 is always supported
   426            throw new RuntimeException(e);
   427          }
   428        }
   429      }
   430      {{/uniqueItems}}
   431      {{/items.isPrimitiveType}}
   432      {{^items.isPrimitiveType}}
   433      {{#items.isModel}}
   434      {{#uniqueItems}}
   435      if ({{getter}}() != null) {
   436        int i = 0;
   437        for ({{{items.dataType}}} _item : {{getter}}()) {
   438          if (_item != null) {
   439            joiner.add(_item.toUrlQueryString(String.format("%s{{baseName}}%s%s", prefix, suffix,
   440                "".equals(suffix) ? "" : String.format("%s%d%s", containerPrefix, i, containerSuffix))));
   441          }
   442        }
   443        i++;
   444      }
   445      {{/uniqueItems}}
   446      {{^uniqueItems}}
   447      if ({{getter}}() != null) {
   448        for (int i = 0; i < {{getter}}().size(); i++) {
   449          if ({{getter}}().get(i) != null) {
   450            joiner.add({{getter}}().get(i).toUrlQueryString(String.format("%s{{baseName}}%s%s", prefix, suffix,
   451                "".equals(suffix) ? "" : String.format("%s%d%s", containerPrefix, i, containerSuffix))));
   452          }
   453        }
   454      }
   455      {{/uniqueItems}}
   456      {{/items.isModel}}
   457      {{^items.isModel}}
   458      {{#uniqueItems}}
   459      if ({{getter}}() != null) {
   460        int i = 0;
   461        for ({{{items.dataType}}} _item : {{getter}}()) {
   462          if (_item != null) {
   463            try {
   464              joiner.add(String.format("%s{{baseName}}%s%s=%s", prefix, suffix,
   465                  "".equals(suffix) ? "" : String.format("%s%d%s", containerPrefix, i, containerSuffix),
   466                  URLEncoder.encode(String.valueOf(_item), "UTF-8").replaceAll("\\+", "%20")));
   467            } catch (UnsupportedEncodingException e) {
   468              // Should never happen, UTF-8 is always supported
   469              throw new RuntimeException(e);
   470            }
   471          }
   472          i++;
   473        }
   474      }
   475      {{/uniqueItems}}
   476      {{^uniqueItems}}
   477      if ({{getter}}() != null) {
   478        for (int i = 0; i < {{getter}}().size(); i++) {
   479          if ({{getter}}().get(i) != null) {
   480            try {
   481              joiner.add(String.format("%s{{baseName}}%s%s=%s", prefix, suffix,
   482                  "".equals(suffix) ? "" : String.format("%s%d%s", containerPrefix, i, containerSuffix),
   483                  URLEncoder.encode(String.valueOf({{getter}}().get(i)), "UTF-8").replaceAll("\\+", "%20")));
   484            } catch (UnsupportedEncodingException e) {
   485              // Should never happen, UTF-8 is always supported
   486              throw new RuntimeException(e);
   487            }
   488          }
   489        }
   490      }
   491      {{/uniqueItems}}
   492      {{/items.isModel}}
   493      {{/items.isPrimitiveType}}
   494      {{/isArray}}
   495      {{^isArray}}
   496      {{#isMap}}
   497      {{^items.isModel}}
   498      if ({{getter}}() != null) {
   499        for (String _key : {{getter}}().keySet()) {
   500          try {
   501            joiner.add(String.format("%s{{baseName}}%s%s=%s", prefix, suffix,
   502                "".equals(suffix) ? "" : String.format("%s%d%s", containerPrefix, _key, containerSuffix),
   503                {{getter}}().get(_key), URLEncoder.encode(String.valueOf({{getter}}().get(_key)), "UTF-8").replaceAll("\\+", "%20")));
   504          } catch (UnsupportedEncodingException e) {
   505            // Should never happen, UTF-8 is always supported
   506            throw new RuntimeException(e);
   507          }
   508        }
   509      }
   510      {{/items.isModel}}
   511      {{#items.isModel}}
   512      if ({{getter}}() != null) {
   513        for (String _key : {{getter}}().keySet()) {
   514          if ({{getter}}().get(_key) != null) {
   515            joiner.add({{getter}}().get(_key).toUrlQueryString(String.format("%s{{baseName}}%s%s", prefix, suffix,
   516                "".equals(suffix) ? "" : String.format("%s%d%s", containerPrefix, _key, containerSuffix))));
   517          }
   518        }
   519      }
   520      {{/items.isModel}}
   521      {{/isMap}}
   522      {{^isMap}}
   523      {{#isPrimitiveType}}
   524      if ({{getter}}() != null) {
   525        try {
   526          joiner.add(String.format("%s{{{baseName}}}%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf({{{getter}}}()), "UTF-8").replaceAll("\\+", "%20")));
   527        } catch (UnsupportedEncodingException e) {
   528          // Should never happen, UTF-8 is always supported
   529          throw new RuntimeException(e);
   530        }
   531      }
   532      {{/isPrimitiveType}}
   533      {{^isPrimitiveType}}
   534      {{#isModel}}
   535      if ({{getter}}() != null) {
   536        joiner.add({{getter}}().toUrlQueryString(prefix + "{{{baseName}}}" + suffix));
   537      }
   538      {{/isModel}}
   539      {{^isModel}}
   540      if ({{getter}}() != null) {
   541        try {
   542          joiner.add(String.format("%s{{{baseName}}}%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf({{{getter}}}()), "UTF-8").replaceAll("\\+", "%20")));
   543        } catch (UnsupportedEncodingException e) {
   544          // Should never happen, UTF-8 is always supported
   545          throw new RuntimeException(e);
   546        }
   547      }
   548      {{/isModel}}
   549      {{/isPrimitiveType}}
   550      {{/isMap}}
   551      {{/isArray}}
   552  
   553      {{/allVars}}
   554      return joiner.toString();
   555    }
   556  {{/supportUrlQuery}}
   557  {{#parcelableModel}}
   558  
   559    public void writeToParcel(Parcel out, int flags) {
   560  {{#model}}
   561  {{#isArray}}
   562      out.writeList(this);
   563  {{/isArray}}
   564  {{^isArray}}
   565  {{#parent}}
   566      super.writeToParcel(out, flags);
   567  {{/parent}}
   568  {{#vars}}
   569      out.writeValue({{name}});
   570  {{/vars}}
   571  {{/isArray}}
   572  {{/model}}
   573    }
   574  
   575    {{classname}}(Parcel in) {
   576  {{#isArray}}
   577      in.readTypedList(this, {{arrayModelType}}.CREATOR);
   578  {{/isArray}}
   579  {{^isArray}}
   580  {{#parent}}
   581      super(in);
   582  {{/parent}}
   583  {{#vars}}
   584  {{#isPrimitiveType}}
   585      {{name}} = ({{{datatypeWithEnum}}})in.readValue(null);
   586  {{/isPrimitiveType}}
   587  {{^isPrimitiveType}}
   588      {{name}} = ({{{datatypeWithEnum}}})in.readValue({{complexType}}.class.getClassLoader());
   589  {{/isPrimitiveType}}
   590  {{/vars}}
   591  {{/isArray}}
   592    }
   593  
   594    public int describeContents() {
   595      return 0;
   596    }
   597  
   598    public static final Parcelable.Creator<{{classname}}> CREATOR = new Parcelable.Creator<{{classname}}>() {
   599      public {{classname}} createFromParcel(Parcel in) {
   600  {{#model}}
   601  {{#isArray}}
   602        {{classname}} result = new {{classname}}();
   603        result.addAll(in.readArrayList({{arrayModelType}}.class.getClassLoader()));
   604        return result;
   605  {{/isArray}}
   606  {{^isArray}}
   607        return new {{classname}}(in);
   608  {{/isArray}}
   609  {{/model}}
   610      }
   611      public {{classname}}[] newArray(int size) {
   612        return new {{classname}}[size];
   613      }
   614    };
   615  {{/parcelableModel}}
   616  
   617  }