package org.marketcetera.photon.ui.databinding; import org.apache.commons.lang.StringUtils; import org.marketcetera.photon.commons.databinding.ITypedObservableValue; import org.marketcetera.photon.commons.databinding.TypedObservableValueDecorator; import org.marketcetera.trade.Future; import org.marketcetera.trade.FutureExpirationMonth; import org.marketcetera.trade.Instrument; import org.marketcetera.util.misc.ClassVersion; import com.google.common.collect.ImmutableList; /* $License$ */ /** * Observes an instrument as a future and provides child observables for the * future components. * * @author <a href="mailto:colin@marketcetera.com">Colin DuPlantis</a> * @version $Id: FutureObservable.java 16154 2012-07-14 16:34:05Z colin $ * @since 2.1.0 */ @ClassVersion("$Id: FutureObservable.java 16154 2012-07-14 16:34:05Z colin $") public class FutureObservable extends CompoundObservableManager<ITypedObservableValue<Instrument>> { /** * Create a new FutureObservable instance. * * @param inParent an <code>ITypedObservableValue<Instrument></code> value */ public FutureObservable(ITypedObservableValue<Instrument> inParent) { super(inParent); mSymbol = TypedObservableValueDecorator.create(String.class); mExpirationMonth = TypedObservableValueDecorator.create(FutureExpirationMonth.class); mExpirationYear = TypedObservableValueDecorator.create(String.class); init(ImmutableList.of(mSymbol, mExpirationMonth, mExpirationYear)); } /** * Observes the future symbol. * * @return an <code>ITypedObservableValue<String></code> value */ public ITypedObservableValue<String> observeSymbol() { return mSymbol; } /** * Observes the future expiration month. * * @return an <code>ITypedObservableValue<FutureExpirationMonth></code> value */ public ITypedObservableValue<FutureExpirationMonth> observeExpirationMonth() { return mExpirationMonth; } /** * Observes the future expiration year. * * @return an <code>ITypedObservableValue<Integer></code> value */ public ITypedObservableValue<String> observeExpirationYear() { return mExpirationYear; } /* (non-Javadoc) * @see org.marketcetera.photon.ui.databinding.CompoundObservableManager#updateParent() */ @Override protected void updateParent() { String symbol = mSymbol.getTypedValue(); FutureExpirationMonth expirationMonth = mExpirationMonth.getTypedValue(); String expirationYear = mExpirationYear.getTypedValue(); Future newValue = null; if(StringUtils.isNotBlank(symbol) && mExpirationMonth != null && mExpirationYear != null) { try { if(Integer.parseInt(((String)mExpirationYear.getValue())) > 0) { newValue = new Future(symbol, expirationMonth, Integer.parseInt(expirationYear)); } } catch (Exception ignored) {} } ITypedObservableValue<Instrument> instrument = getParent(); setIfChanged(instrument, newValue); } /* (non-Javadoc) * @see org.marketcetera.photon.ui.databinding.CompoundObservableManager#updateChildren() */ @Override protected void updateChildren() { Instrument instrument = getParent().getTypedValue(); if (instrument instanceof Future) { Future future = (Future)instrument; setIfChanged(mSymbol, future.getSymbol()); setIfChanged(mExpirationMonth, future.getExpirationMonth()); setIfChanged(mExpirationYear, Integer.toString(future.getExpirationYear())); } else { setIfChanged(mSymbol, null); setIfChanged(mExpirationMonth, null); setIfChanged(mExpirationYear, null); } } /** * observes the future symbol */ private final ITypedObservableValue<String> mSymbol; /** * observes the future expiration month */ private final ITypedObservableValue<FutureExpirationMonth> mExpirationMonth; /** * observes the future expiration year */ private final ITypedObservableValue<String> mExpirationYear; }