package org.multibit.mbm.core.model;
import com.google.common.collect.Lists;
import com.xeiam.xchange.currency.MoneyUtils;
import org.joda.money.BigMoney;
import java.util.List;
/**
* <p>Builder to provide the following to {@link Item}:</p>
* <ul>
* <li>Provide a fluent interface to facilitate building the entity</li>
* </ul>
*
* @since 0.0.1
*
*/
public class ItemBuilder {
private List<PrimaryFieldDetail> primaryFieldDetails = Lists.newArrayList();
private List<SecondaryFieldDetail> secondaryFieldDetails = Lists.newArrayList();
private boolean isBuilt = false;
private String sku = null;
private String gtin = null;
private BigMoney localPrice = MoneyUtils.parseBitcoin("BTC 0.0000");
/**
* @return A new instance of the builder
*/
public static ItemBuilder newInstance() {
return new ItemBuilder();
}
/**
* Handles the building process. No further configuration is possible after this.
*
* @return The item instance
*/
public Item build() {
validateState();
// Item is a DTO so requires a public default constructor
Item item = new Item();
item.setSKU(sku);
item.setGTIN(gtin);
item.setLocalPrice(localPrice);
for (PrimaryFieldDetail primaryFieldDetail : primaryFieldDetails) {
primaryFieldDetail.applyTo(item);
}
for (SecondaryFieldDetail secondaryFieldDetail : secondaryFieldDetails) {
secondaryFieldDetail.applyTo(item);
}
isBuilt = true;
return item;
}
private void validateState() {
if (isBuilt) {
throw new IllegalStateException("Build process is complete - no further changes can be made");
}
}
/**
*
* @param itemField The item field (e.g. SUMMARY)
* @param content The locale specific content (e.g. "Hello", "Bonjour" etc)
*
* @param localeKey The locale key (e.g. "en")
* @return The builder
*/
public ItemBuilder withPrimaryFieldDetail(ItemField itemField, String content, String localeKey) {
validateState();
primaryFieldDetails.add(new PrimaryFieldDetail(itemField, localeKey, content));
return this;
}
/**
*
* @param itemField The item field (e.g. SUMMARY)
* @param content The locale specific content (e.g. "Hello", "Bonjour" etc)
*
* @param localeKey The locale key (e.g. "en")
* @return The builder
*/
public ItemBuilder withSecondaryFieldDetail(ItemField itemField, String content, String localeKey) {
validateState();
secondaryFieldDetails.add(new SecondaryFieldDetail(itemField, localeKey, content));
return this;
}
/**
* @param sku The Stock Keeping Unit
* @return The Builder
*/
public ItemBuilder withSKU(String sku) {
this.sku = sku;
return this;
}
/**
* @param gtin The Global Trade Item Number
* @return The Builder
*/
public ItemBuilder withGTIN(String gtin) {
this.gtin = gtin;
return this;
}
/**
* @param localPrice The price in the local currency
* @return The Builder
*/
public ItemBuilder withLocalPrice(BigMoney localPrice) {
this.localPrice = localPrice;
return this;
}
/**
* Storage of parameters until ready for application
*/
private class PrimaryFieldDetail {
private final ItemField itemField;
private final String localeKey;
private final String content;
PrimaryFieldDetail(ItemField itemField, String localeKey, String content) {
this.itemField = itemField;
this.localeKey = localeKey;
this.content = content;
}
/**
* Applies the parameters to the given Item
*
* @param item The Item
*/
void applyTo(Item item) {
LocalisedText localisedText = new LocalisedText();
localisedText.setLocaleKey(localeKey);
localisedText.setContent(content);
ItemFieldDetail itemFieldDetail = item.getItemFieldDetail(itemField);
if (itemFieldDetail == null) {
itemFieldDetail = new ItemFieldDetail();
}
itemFieldDetail.setPrimaryDetail(localisedText);
item.setItemFieldDetail(itemField, itemFieldDetail);
itemFieldDetail.setItemField(itemField);
}
}
/**
* Storage of parameters until ready for application
*/
private class SecondaryFieldDetail {
private final ItemField itemField;
private final String localeKey;
private final String content;
SecondaryFieldDetail(ItemField itemField, String localeKey, String content) {
this.itemField = itemField;
this.localeKey = localeKey;
this.content = content;
}
/**
* Applies the parameters to the given Item
*
* @param item The item
*/
void applyTo(Item item) {
LocalisedText localisedText = new LocalisedText();
localisedText.setLocaleKey(localeKey);
localisedText.setContent(content);
ItemFieldDetail itemFieldDetail = item.getItemFieldDetail(itemField);
if (itemFieldDetail == null) {
itemFieldDetail = new ItemFieldDetail();
}
itemFieldDetail.getSecondaryDetails().add(localisedText);
item.setItemFieldDetail(itemField, itemFieldDetail);
itemFieldDetail.setItemField(itemField);
}
}
}