package com.trywildcard.pair.model.product; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import java.util.Collections; import java.util.Date; import java.util.List; @JsonDeserialize(builder = OfferBuilder.class) /** * Structures a product offer. Must be constructed using <code>OfferBuilder</code> */ public final class Offer { // required fields private final Price price; // optional fields private final Price originalPrice; private final Price shippingCost; private final String description; private final Availability availability; private final Integer quantity; private final Date saleStartDate; private final Date saleEndDate; private final Date expirationDate; private final List<String> geographicAvailability; private final Float weight; private final String weightUnits; /** * Construct an offer using an <code>OfferBuilder</code>, which is responsible for validations. * @param builder the builder for this offer. */ public Offer(OfferBuilder builder){ this.price = builder.price; this.originalPrice = builder.originalPrice; this.shippingCost = builder.shippingCost; this.description = builder.description; this.availability = builder.availability; this.quantity = builder.quantity; this.saleStartDate = builder.saleStartDate; this.saleEndDate = builder.saleEndDate; this.expirationDate = builder.expirationDate; this.geographicAvailability = Collections.unmodifiableList(builder.geographicAvailability); this.weight = builder.weight; this.weightUnits = builder.weightUnits; } public String getWeightUnits(){ return weightUnits; } public Float getWeight() { return weight; } public Price getShippingCost() { return shippingCost; } public List<String> getGeographicAvailability(){ return geographicAvailability; } public Integer getQuantity(){ return quantity; } public Availability getAvailability(){ return availability; } public String getDescription(){ return description; } public Price getOriginalPrice(){ return originalPrice; } public Price getPrice(){ return price; } public Date getSaleStartDate() { if (saleStartDate == null){ return null; } return new Date(saleStartDate.getTime()); } public Date getSaleEndDate() { if (saleEndDate == null){ return null; } return new Date(saleEndDate.getTime()); } public Date getExpirationDate() { if (expirationDate == null){ return null; } return new Date(expirationDate.getTime()); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Offer offer = (Offer) o; if (availability != offer.availability) return false; if (description != null ? !description.equals(offer.description) : offer.description != null) return false; if (expirationDate != null ? !expirationDate.equals(offer.expirationDate) : offer.expirationDate != null) return false; if (geographicAvailability != null ? !geographicAvailability.equals(offer.geographicAvailability) : offer.geographicAvailability != null) return false; if (originalPrice != null ? !originalPrice.equals(offer.originalPrice) : offer.originalPrice != null) return false; if (price != null ? !price.equals(offer.price) : offer.price != null) return false; if (quantity != null ? !quantity.equals(offer.quantity) : offer.quantity != null) return false; if (saleEndDate != null ? !saleEndDate.equals(offer.saleEndDate) : offer.saleEndDate != null) return false; if (saleStartDate != null ? !saleStartDate.equals(offer.saleStartDate) : offer.saleStartDate != null) return false; if (shippingCost != null ? !shippingCost.equals(offer.shippingCost) : offer.shippingCost != null) return false; if (weight != null ? !weight.equals(offer.weight) : offer.weight != null) return false; if (weightUnits != null ? !weightUnits.equals(offer.weightUnits) : offer.weightUnits != null) return false; return true; } @Override public int hashCode() { int result = price != null ? price.hashCode() : 0; result = 31 * result + (originalPrice != null ? originalPrice.hashCode() : 0); result = 31 * result + (shippingCost != null ? shippingCost.hashCode() : 0); result = 31 * result + (description != null ? description.hashCode() : 0); result = 31 * result + (availability != null ? availability.hashCode() : 0); result = 31 * result + (quantity != null ? quantity.hashCode() : 0); result = 31 * result + (saleStartDate != null ? saleStartDate.hashCode() : 0); result = 31 * result + (saleEndDate != null ? saleEndDate.hashCode() : 0); result = 31 * result + (expirationDate != null ? expirationDate.hashCode() : 0); result = 31 * result + (geographicAvailability != null ? geographicAvailability.hashCode() : 0); result = 31 * result + (weight != null ? weight.hashCode() : 0); result = 31 * result + (weightUnits != null ? weightUnits.hashCode() : 0); return result; } }