001
002package com.commercetools.ml.models.common;
003
004import java.time.*;
005import java.util.*;
006import java.util.function.Function;
007
008import javax.annotation.Nullable;
009import javax.validation.constraints.NotNull;
010
011import com.fasterxml.jackson.annotation.*;
012import com.fasterxml.jackson.databind.annotation.*;
013
014import io.vrap.rmf.base.client.utils.Generated;
015
016/**
017 * Reference
018 *
019 * <hr>
020 * Example to create a subtype instance using the builder pattern
021 * <div class=code-example>
022 * <pre><code class='java'>
023 *     Reference reference = Reference.categoryBuilder()
024 *             id("{id}")
025 *             .build()
026 * </code></pre>
027 * </div>
028 */
029@JsonSubTypes({
030        @JsonSubTypes.Type(value = com.commercetools.ml.models.common.CategoryReferenceImpl.class, name = CategoryReference.CATEGORY),
031        @JsonSubTypes.Type(value = com.commercetools.ml.models.common.ProductReferenceImpl.class, name = ProductReference.PRODUCT),
032        @JsonSubTypes.Type(value = com.commercetools.ml.models.common.ProductTypeReferenceImpl.class, name = ProductTypeReference.PRODUCT_TYPE) })
033@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "typeId", defaultImpl = ReferenceImpl.class, visible = true)
034@JsonDeserialize(as = ReferenceImpl.class)
035@Generated(value = "io.vrap.rmf.codegen.rendering.CoreCodeGenerator", comments = "https://github.com/commercetools/rmf-codegen")
036public interface Reference {
037
038    /**
039     *
040     * @return typeId
041     */
042    @NotNull
043    @JsonProperty("typeId")
044    public ReferenceTypeId getTypeId();
045
046    /**
047     *
048     * @return id
049     */
050    @NotNull
051    @JsonProperty("id")
052    public String getId();
053
054    /**
055     * set id
056     * @param id value to be set
057     */
058
059    public void setId(final String id);
060
061    /**
062     * factory method to create a deep copy of Reference
063     * @param template instance to be copied
064     * @return copy instance
065     */
066    @Nullable
067    public static Reference deepCopy(@Nullable final Reference template) {
068        if (template == null) {
069            return null;
070        }
071        if (template instanceof com.commercetools.ml.models.common.CategoryReference) {
072            return com.commercetools.ml.models.common.CategoryReference
073                    .deepCopy((com.commercetools.ml.models.common.CategoryReference) template);
074        }
075        if (template instanceof com.commercetools.ml.models.common.ProductReference) {
076            return com.commercetools.ml.models.common.ProductReference
077                    .deepCopy((com.commercetools.ml.models.common.ProductReference) template);
078        }
079        if (template instanceof com.commercetools.ml.models.common.ProductTypeReference) {
080            return com.commercetools.ml.models.common.ProductTypeReference
081                    .deepCopy((com.commercetools.ml.models.common.ProductTypeReference) template);
082        }
083        ReferenceImpl instance = new ReferenceImpl();
084        instance.setId(template.getId());
085        return instance;
086    }
087
088    /**
089     * builder for category subtype
090     * @return builder
091     */
092    public static com.commercetools.ml.models.common.CategoryReferenceBuilder categoryBuilder() {
093        return com.commercetools.ml.models.common.CategoryReferenceBuilder.of();
094    }
095
096    /**
097     * builder for product subtype
098     * @return builder
099     */
100    public static com.commercetools.ml.models.common.ProductReferenceBuilder productBuilder() {
101        return com.commercetools.ml.models.common.ProductReferenceBuilder.of();
102    }
103
104    /**
105     * builder for productType subtype
106     * @return builder
107     */
108    public static com.commercetools.ml.models.common.ProductTypeReferenceBuilder productTypeBuilder() {
109        return com.commercetools.ml.models.common.ProductTypeReferenceBuilder.of();
110    }
111
112    /**
113     * accessor map function
114     * @param <T> mapped type
115     * @param helper function to map the object
116     * @return mapped value
117     */
118    default <T> T withReference(Function<Reference, T> helper) {
119        return helper.apply(this);
120    }
121
122    /**
123     * gives a TypeReference for usage with Jackson DataBind
124     * @return TypeReference
125     */
126    public static com.fasterxml.jackson.core.type.TypeReference<Reference> typeReference() {
127        return new com.fasterxml.jackson.core.type.TypeReference<Reference>() {
128            @Override
129            public String toString() {
130                return "TypeReference<Reference>";
131            }
132        };
133    }
134}