/** * <copyright> * </copyright> * * $Id$ */ package no.playtrd.v10.playtrd.impl; import java.util.Collection; import java.util.List; import javax.measure.Measurable; import javax.measure.Measure; import no.playtrd.properties.GameCurrency; import no.playtrd.v10.playtrd.Inventory; import no.playtrd.v10.playtrd.Item; import no.playtrd.v10.playtrd.Owner; import no.playtrd.v10.playtrd.PlaytrdPackage; import no.playtrd.v10.playtrd.Trade; import no.playtrd.v10.playtrd.Wallet; import no.playtrd.v10.playtrd.util.PlaytrdValidator; import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.InternalEObject; import org.eclipse.emf.ecore.impl.ENotificationImpl; import org.eclipse.emf.ecore.util.EObjectResolvingEList; import org.jscience.economics.money.Money; /** * <!-- begin-user-doc --> * An implementation of the model object '<em><b>Trade</b></em>'. * <!-- end-user-doc --> * <p> * The following features are implemented: * <ul> * <li>{@link no.playtrd.v10.playtrd.impl.TradeImpl#getSeller <em>Seller</em>}</li> * <li>{@link no.playtrd.v10.playtrd.impl.TradeImpl#getBuyer <em>Buyer</em>}</li> * <li>{@link no.playtrd.v10.playtrd.impl.TradeImpl#getSellerWallet <em>Seller Wallet</em>}</li> * <li>{@link no.playtrd.v10.playtrd.impl.TradeImpl#getSellerItems <em>Seller Items</em>}</li> * <li>{@link no.playtrd.v10.playtrd.impl.TradeImpl#getBuyerItems <em>Buyer Items</em>}</li> * <li>{@link no.playtrd.v10.playtrd.impl.TradeImpl#getBuyerWallet <em>Buyer Wallet</em>}</li> * </ul> * </p> * * @generated */ public class TradeImpl extends MoneyValuedImpl implements Trade { /** * The cached value of the '{@link #getSeller() <em>Seller</em>}' reference. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @see #getSeller() * @generated * @ordered */ protected Owner seller; /** * The cached value of the '{@link #getBuyer() <em>Buyer</em>}' reference. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @see #getBuyer() * @generated * @ordered */ protected Owner buyer; /** * The cached value of the '{@link #getSellerWallet() <em>Seller Wallet</em>}' reference. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @see #getSellerWallet() * @generated * @ordered */ protected Wallet sellerWallet; /** * The cached value of the '{@link #getSellerItems() <em>Seller Items</em>}' reference list. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @see #getSellerItems() * @generated * @ordered */ protected EList<Item> sellerItems; /** * The cached value of the '{@link #getBuyerItems() <em>Buyer Items</em>}' reference list. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @see #getBuyerItems() * @generated * @ordered */ protected EList<Item> buyerItems; /** * The cached value of the '{@link #getBuyerWallet() <em>Buyer Wallet</em>}' reference. * <!-- begin-user-doc --> * <!-- end-user-doc --> * @see #getBuyerWallet() * @generated * @ordered */ protected Wallet buyerWallet; /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ protected TradeImpl() { super(); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ @Override protected EClass eStaticClass() { return PlaytrdPackage.Literals.TRADE; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public Owner getSeller() { if (seller != null && seller.eIsProxy()) { InternalEObject oldSeller = (InternalEObject)seller; seller = (Owner)eResolveProxy(oldSeller); if (seller != oldSeller) { if (eNotificationRequired()) eNotify(new ENotificationImpl(this, Notification.RESOLVE, PlaytrdPackage.TRADE__SELLER, oldSeller, seller)); } } return seller; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public Owner basicGetSeller() { return seller; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public void setSeller(Owner newSeller) { Owner oldSeller = seller; seller = newSeller; if (eNotificationRequired()) eNotify(new ENotificationImpl(this, Notification.SET, PlaytrdPackage.TRADE__SELLER, oldSeller, seller)); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public Owner getBuyer() { if (buyer != null && buyer.eIsProxy()) { InternalEObject oldBuyer = (InternalEObject)buyer; buyer = (Owner)eResolveProxy(oldBuyer); if (buyer != oldBuyer) { if (eNotificationRequired()) eNotify(new ENotificationImpl(this, Notification.RESOLVE, PlaytrdPackage.TRADE__BUYER, oldBuyer, buyer)); } } return buyer; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public Owner basicGetBuyer() { return buyer; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public void setBuyer(Owner newBuyer) { Owner oldBuyer = buyer; buyer = newBuyer; if (eNotificationRequired()) eNotify(new ENotificationImpl(this, Notification.SET, PlaytrdPackage.TRADE__BUYER, oldBuyer, buyer)); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public Wallet getSellerWallet() { if (sellerWallet != null && sellerWallet.eIsProxy()) { InternalEObject oldSellerWallet = (InternalEObject)sellerWallet; sellerWallet = (Wallet)eResolveProxy(oldSellerWallet); if (sellerWallet != oldSellerWallet) { if (eNotificationRequired()) eNotify(new ENotificationImpl(this, Notification.RESOLVE, PlaytrdPackage.TRADE__SELLER_WALLET, oldSellerWallet, sellerWallet)); } } return sellerWallet; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public Wallet basicGetSellerWallet() { return sellerWallet; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public void setSellerWallet(Wallet newSellerWallet) { Wallet oldSellerWallet = sellerWallet; sellerWallet = newSellerWallet; if (eNotificationRequired()) eNotify(new ENotificationImpl(this, Notification.SET, PlaytrdPackage.TRADE__SELLER_WALLET, oldSellerWallet, sellerWallet)); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public EList<Item> getSellerItems() { if (sellerItems == null) { sellerItems = new EObjectResolvingEList<Item>(Item.class, this, PlaytrdPackage.TRADE__SELLER_ITEMS); } return sellerItems; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public EList<Item> getBuyerItems() { if (buyerItems == null) { buyerItems = new EObjectResolvingEList<Item>(Item.class, this, PlaytrdPackage.TRADE__BUYER_ITEMS); } return buyerItems; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public Wallet getBuyerWallet() { if (buyerWallet != null && buyerWallet.eIsProxy()) { InternalEObject oldBuyerWallet = (InternalEObject)buyerWallet; buyerWallet = (Wallet)eResolveProxy(oldBuyerWallet); if (buyerWallet != oldBuyerWallet) { if (eNotificationRequired()) eNotify(new ENotificationImpl(this, Notification.RESOLVE, PlaytrdPackage.TRADE__BUYER_WALLET, oldBuyerWallet, buyerWallet)); } } return buyerWallet; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public Wallet basicGetBuyerWallet() { return buyerWallet; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ public void setBuyerWallet(Wallet newBuyerWallet) { Wallet oldBuyerWallet = buyerWallet; buyerWallet = newBuyerWallet; if (eNotificationRequired()) eNotify(new ENotificationImpl(this, Notification.SET, PlaytrdPackage.TRADE__BUYER_WALLET, oldBuyerWallet, buyerWallet)); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated NOT */ public void perform() { // compute new money values double total = PlaytrdValidator.getTradeMoneyValue(this); double newBuyerMoney = getBuyerWallet().getMoneyValue().doubleValue(GameCurrency.GAME_CURRENCY) - total; double newSellerMoney = getSellerWallet().getMoneyValue().doubleValue(GameCurrency.GAME_CURRENCY) + total; // transfer of items transferItems(getBuyer(), getSellerItems()); transferItems(getSeller(), getBuyerItems()); // transfer of money getBuyerWallet().setMoneyValue(Measure.valueOf(newBuyerMoney, GameCurrency.GAME_CURRENCY)); getSellerWallet().setMoneyValue(Measure.valueOf(newSellerMoney, GameCurrency.GAME_CURRENCY)); } private void transferItems(Inventory target, List<Item> items) { for (Item item : items) { Inventory inventory = getItemInventory(item); inventory.getContainedItems().remove(item); target.getContainedItems().add(item); } } private Inventory getItemInventory(Item item) { for (EObject container = item.eContainer(); container != null; container = container.eContainer()) { if (container instanceof Inventory) { return (Inventory)container; } } return null; } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ @Override public Object eGet(int featureID, boolean resolve, boolean coreType) { switch (featureID) { case PlaytrdPackage.TRADE__SELLER: if (resolve) return getSeller(); return basicGetSeller(); case PlaytrdPackage.TRADE__BUYER: if (resolve) return getBuyer(); return basicGetBuyer(); case PlaytrdPackage.TRADE__SELLER_WALLET: if (resolve) return getSellerWallet(); return basicGetSellerWallet(); case PlaytrdPackage.TRADE__SELLER_ITEMS: return getSellerItems(); case PlaytrdPackage.TRADE__BUYER_ITEMS: return getBuyerItems(); case PlaytrdPackage.TRADE__BUYER_WALLET: if (resolve) return getBuyerWallet(); return basicGetBuyerWallet(); } return super.eGet(featureID, resolve, coreType); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ @SuppressWarnings("unchecked") @Override public void eSet(int featureID, Object newValue) { switch (featureID) { case PlaytrdPackage.TRADE__SELLER: setSeller((Owner)newValue); return; case PlaytrdPackage.TRADE__BUYER: setBuyer((Owner)newValue); return; case PlaytrdPackage.TRADE__SELLER_WALLET: setSellerWallet((Wallet)newValue); return; case PlaytrdPackage.TRADE__SELLER_ITEMS: getSellerItems().clear(); getSellerItems().addAll((Collection<? extends Item>)newValue); return; case PlaytrdPackage.TRADE__BUYER_ITEMS: getBuyerItems().clear(); getBuyerItems().addAll((Collection<? extends Item>)newValue); return; case PlaytrdPackage.TRADE__BUYER_WALLET: setBuyerWallet((Wallet)newValue); return; } super.eSet(featureID, newValue); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ @Override public void eUnset(int featureID) { switch (featureID) { case PlaytrdPackage.TRADE__SELLER: setSeller((Owner)null); return; case PlaytrdPackage.TRADE__BUYER: setBuyer((Owner)null); return; case PlaytrdPackage.TRADE__SELLER_WALLET: setSellerWallet((Wallet)null); return; case PlaytrdPackage.TRADE__SELLER_ITEMS: getSellerItems().clear(); return; case PlaytrdPackage.TRADE__BUYER_ITEMS: getBuyerItems().clear(); return; case PlaytrdPackage.TRADE__BUYER_WALLET: setBuyerWallet((Wallet)null); return; } super.eUnset(featureID); } /** * <!-- begin-user-doc --> * <!-- end-user-doc --> * @generated */ @Override public boolean eIsSet(int featureID) { switch (featureID) { case PlaytrdPackage.TRADE__SELLER: return seller != null; case PlaytrdPackage.TRADE__BUYER: return buyer != null; case PlaytrdPackage.TRADE__SELLER_WALLET: return sellerWallet != null; case PlaytrdPackage.TRADE__SELLER_ITEMS: return sellerItems != null && !sellerItems.isEmpty(); case PlaytrdPackage.TRADE__BUYER_ITEMS: return buyerItems != null && !buyerItems.isEmpty(); case PlaytrdPackage.TRADE__BUYER_WALLET: return buyerWallet != null; } return super.eIsSet(featureID); } } //TradeImpl