package org.atlasapi.persistence.media.entity; import java.util.Currency; import com.google.common.base.Function; import com.google.common.collect.Iterables; import com.mongodb.BasicDBList; import com.mongodb.BasicDBObject; import org.atlasapi.media.entity.Policy; import org.atlasapi.media.entity.Policy.Network; import org.atlasapi.media.entity.Policy.Platform; import org.atlasapi.media.entity.Policy.RevenueContract; import org.atlasapi.media.entity.simple.Pricing; import org.atlasapi.persistence.ModelTranslator; import com.metabroadcast.common.currency.Price; import com.metabroadcast.common.intl.Countries; import com.metabroadcast.common.persistence.translator.TranslatorUtils; import com.mongodb.DBObject; import org.atlasapi.persistence.PricingTranslator; public class PolicyTranslator implements ModelTranslator<Policy> { private static final String PLAYER_KEY = "player"; private static final String SERVICE_KEY = "service"; private static final String TERMS_OF_USE_KEY = "termsOfUse"; private static final String PRICING_KEY = "pricing"; private static final String SUBSCRIPTION_PACKAGES = "subscriptionPackages"; private final PricingTranslator pricingTranslator = new PricingTranslator(); @Override public Policy fromDBObject(DBObject dbObject, Policy entity) { if (entity == null) { entity = new Policy(); } entity.setActualAvailabilityStart(TranslatorUtils.toDateTime(dbObject, "actualAvailabilityStart")); entity.setAvailabilityStart(TranslatorUtils.toDateTime(dbObject, "availabilityStart")); entity.setAvailabilityEnd(TranslatorUtils.toDateTime(dbObject, "availabilityEnd")); entity.setDrmPlayableFrom(TranslatorUtils.toDateTime(dbObject, "drmPlayableFrom")); String revenueContract = TranslatorUtils.toString(dbObject, "revenueContract"); if (revenueContract != null) { entity.setRevenueContract(RevenueContract.fromKey(revenueContract)); } if (dbObject.containsField("currency") && dbObject.containsField("price")) { entity.setPrice(new Price(Currency.getInstance(TranslatorUtils.toString(dbObject, "currency")), TranslatorUtils.toInteger(dbObject, "price"))); } if (dbObject.containsField("availableCountries")) { TranslatorUtils.toList(dbObject, "availableCountries"); entity.setAvailableCountries(Countries.fromCodes(TranslatorUtils.toList(dbObject, "availableCountries"))); } if(dbObject.containsField("platform")) { entity.setPlatform(Platform.fromKey(TranslatorUtils.toString(dbObject, "platform"))); } if (dbObject.containsField("network")) { entity.setNetwork(Network.fromKey(TranslatorUtils.toString(dbObject, "network"))); } if (dbObject.containsField(SUBSCRIPTION_PACKAGES)) { entity.setSubscriptionPackages(TranslatorUtils.toSet(dbObject, SUBSCRIPTION_PACKAGES)); } entity.setService(TranslatorUtils.toLong(dbObject, SERVICE_KEY)); entity.setPlayer(TranslatorUtils.toLong(dbObject, PLAYER_KEY)); entity.setTermsOfUse(TranslatorUtils.toString(dbObject, TERMS_OF_USE_KEY)); if (dbObject.containsField(PRICING_KEY)) { entity.setPricing(Iterables.transform((Iterable<DBObject>) dbObject.get(PRICING_KEY), new Function<DBObject, Pricing>() { @Override public Pricing apply(DBObject input) { return pricingTranslator.fromDBObject(input, null); } })); } return entity; } @Override public DBObject toDBObject(DBObject dbObject, Policy entity) { TranslatorUtils.fromDateTime(dbObject, "actualAvailabilityStart", entity.getActualAvailabilityStart()); TranslatorUtils.fromDateTime(dbObject, "availabilityStart", entity.getAvailabilityStart()); TranslatorUtils.fromDateTime(dbObject, "availabilityEnd", entity.getAvailabilityEnd()); TranslatorUtils.fromDateTime(dbObject, "drmPlayableFrom", entity.getDrmPlayableFrom()); if (entity.getRevenueContract() != null) { TranslatorUtils.from(dbObject, "revenueContract", entity.getRevenueContract().key()); } if (entity.getPrice() != null) { TranslatorUtils.from(dbObject, "currency", entity.getPrice().getCurrency().getCurrencyCode()); TranslatorUtils.from(dbObject, "price", entity.getPrice().getAmount()); } if (entity.getAvailableCountries() != null) { TranslatorUtils.fromList(dbObject, Countries.toCodes(entity.getAvailableCountries()), "availableCountries"); } if(entity.getPlatform() != null) { TranslatorUtils.from(dbObject, "platform", entity.getPlatform().key()); } if (entity.getNetwork() != null) { TranslatorUtils.from(dbObject, "network", entity.getNetwork().key()); } if (entity.getService() != null) { TranslatorUtils.from(dbObject, SERVICE_KEY, entity.getService()); } if (entity.getPlayer() != null) { TranslatorUtils.from(dbObject, PLAYER_KEY, entity.getPlayer()); } if(entity.getTermsOfUse() != null) { TranslatorUtils.from(dbObject, TERMS_OF_USE_KEY, entity.getTermsOfUse()); } BasicDBList pricingDbObject = new BasicDBList(); for (Pricing pricing : entity.getPricing()) { pricingDbObject.add(pricingTranslator.toDBObject(new BasicDBObject(), pricing)); } TranslatorUtils.fromIterable(dbObject, entity.getSubscriptionPackages(), SUBSCRIPTION_PACKAGES); dbObject.put(PRICING_KEY, pricingDbObject); return dbObject; } }