001
002package com.commercetools.api.models.product;
003
004import java.time.LocalDate;
005import java.time.LocalTime;
006import java.time.ZonedDateTime;
007import java.util.List;
008import java.util.Map;
009import java.util.Objects;
010import java.util.stream.Collectors;
011
012import javax.annotation.Nullable;
013
014import com.commercetools.api.models.MapAccessor;
015import com.commercetools.api.models.common.LocalizedString;
016import com.commercetools.api.models.common.Reference;
017import com.commercetools.api.models.common.TypedMoney;
018import com.commercetools.api.models.product_type.AttributeLocalizedEnumValue;
019import com.commercetools.api.models.product_type.AttributePlainEnumValue;
020
021/**
022 * Accessor to retrieve attribute values type safe
023 */
024public class AttributesAccessor extends MapAccessor<Attribute> {
025
026    public AttributesAccessor(Map<String, Attribute> attributes) {
027        super(attributes);
028    }
029
030    public static AttributesAccessor of(ProductVariant variant) {
031        return new AttributesAccessor(AttributeAccessor.asMap(variant));
032    }
033
034    public static AttributesAccessor of(List<Attribute> attributes) {
035        return new AttributesAccessor(AttributeAccessor.asMap(attributes));
036    }
037
038    public static AttributesAccessor of(Map<String, Attribute> attributes) {
039        return new AttributesAccessor(attributes);
040    }
041
042    @Nullable
043    public LocalDate asDate(final String key) {
044        return get(key, AttributeAccessor::asDate);
045    }
046
047    @Nullable
048    public LocalTime asTime(final String key) {
049        return get(key, AttributeAccessor::asTime);
050    }
051
052    @Nullable
053    public ZonedDateTime asDateTime(final String key) {
054        return get(key, AttributeAccessor::asDateTime);
055    }
056
057    @Nullable
058    public List<LocalDate> asSetDate(final String key) {
059        return get(key, AttributeAccessor::asSetDate);
060    }
061
062    @Nullable
063    public List<LocalTime> asSetTime(final String key) {
064        return get(key, AttributeAccessor::asSetTime);
065    }
066
067    @Nullable
068    public List<ZonedDateTime> asSetDateTime(final String key) {
069        return get(key, AttributeAccessor::asSetDateTime);
070    }
071
072    @Nullable
073    public String asString(final String key) {
074        return get(key, AttributeAccessor::asString);
075    }
076
077    @Nullable
078    public Boolean asBoolean(final String key) {
079        return get(key, AttributeAccessor::asBoolean);
080    }
081
082    @Nullable
083    public Double asDouble(final String key) {
084        return get(key, AttributeAccessor::asDouble);
085    }
086
087    @Nullable
088    public LocalizedString asLocalizedString(final String key) {
089        return get(key, AttributeAccessor::asLocalizedString);
090    }
091
092    @Nullable
093    public AttributePlainEnumValue asEnum(final String key) {
094        return get(key, AttributeAccessor::asEnum);
095    }
096
097    @Nullable
098    public AttributeLocalizedEnumValue asLocalizedEnum(final String key) {
099        return get(key, AttributeAccessor::asLocalizedEnum);
100    }
101
102    @Nullable
103    public Long asLong(final String key) {
104        return get(key, AttributeAccessor::asLong);
105    }
106
107    @Nullable
108    public Reference asReference(final String key) {
109        return get(key, AttributeAccessor::asReference);
110    }
111
112    @Nullable
113    public TypedMoney asMoney(final String key) {
114        return get(key, AttributeAccessor::asMoney);
115    }
116
117    @Nullable
118    public List<String> asSetString(final String key) {
119        return get(key, AttributeAccessor::asSetString);
120    }
121
122    @Nullable
123    public List<Boolean> asSetBoolean(final String key) {
124        return get(key, AttributeAccessor::asSetBoolean);
125    }
126
127    @Nullable
128    public List<Double> asSetDouble(final String key) {
129        return get(key, AttributeAccessor::asSetDouble);
130    }
131
132    @Nullable
133    public List<LocalizedString> asSetLocalizedString(final String key) {
134        return get(key, AttributeAccessor::asSetLocalizedString);
135    }
136
137    @Nullable
138    public List<AttributePlainEnumValue> asSetEnum(final String key) {
139        return get(key, AttributeAccessor::asSetEnum);
140    }
141
142    @Nullable
143    public List<AttributeLocalizedEnumValue> asSetLocalizedEnum(final String key) {
144        return get(key, AttributeAccessor::asSetLocalizedEnum);
145    }
146
147    @Nullable
148    public List<Long> asSetLong(final String key) {
149        return get(key, AttributeAccessor::asSetLong);
150    }
151
152    @Nullable
153    public List<Reference> asSetReference(final String key) {
154        return get(key, AttributeAccessor::asSetReference);
155    }
156
157    @Nullable
158    public List<TypedMoney> asSetMoney(final String key) {
159        return get(key, AttributeAccessor::asSetMoney);
160    }
161
162    @Nullable
163    public AttributesAccessor asNested(final String key) {
164        return AttributesAccessor.of(get(key, AttributeAccessor::asNested));
165    }
166
167    @Nullable
168    public List<AttributesAccessor> asSetNested(final String key) {
169        return Objects.requireNonNull(get(key, AttributeAccessor::asSetNested))
170                .stream()
171                .map(AttributesAccessor::of)
172                .collect(Collectors.toList());
173    }
174}