package org.marketcetera.photon.ui.databinding;
import java.math.BigDecimal;
import org.apache.commons.lang.StringUtils;
import org.marketcetera.photon.commons.databinding.ITypedObservableValue;
import org.marketcetera.photon.commons.databinding.TypedObservableValueDecorator;
import org.marketcetera.trade.Instrument;
import org.marketcetera.trade.Option;
import org.marketcetera.trade.OptionType;
import org.marketcetera.util.misc.ClassVersion;
import com.google.common.collect.ImmutableList;
/* $License$ */
/**
* Observes an instrument as an option and provides child observables for the
* option components.
*
* @author <a href="mailto:will@marketcetera.com">Will Horn</a>
* @version $Id: OptionObservable.java 16154 2012-07-14 16:34:05Z colin $
* @since 2.0.0
*/
@ClassVersion("$Id: OptionObservable.java 16154 2012-07-14 16:34:05Z colin $")
public class OptionObservable extends
CompoundObservableManager<ITypedObservableValue<Instrument>> {
private final ITypedObservableValue<String> mSymbol;
private final ITypedObservableValue<String> mExpiry;
private final ITypedObservableValue<BigDecimal> mStrikePrice;
private final ITypedObservableValue<OptionType> mOptionType;
/**
* Constructor.
*
* @param instrument
* the instrument to observe
*/
public OptionObservable(ITypedObservableValue<Instrument> instrument) {
super(instrument);
mSymbol = TypedObservableValueDecorator.create(String.class);
mExpiry = TypedObservableValueDecorator.create(String.class);
mStrikePrice = TypedObservableValueDecorator.create(BigDecimal.class);
mOptionType = TypedObservableValueDecorator.create(OptionType.class);
init(ImmutableList.of(mSymbol, mExpiry, mStrikePrice, mOptionType));
}
@Override
protected void updateChildren() {
Instrument instrument = getParent().getTypedValue();
if (instrument instanceof Option) {
Option option = (Option) instrument;
setIfChanged(mSymbol, option.getSymbol());
setIfChanged(mExpiry, option.getExpiry());
setIfChanged(mStrikePrice, option.getStrikePrice());
setIfChanged(mOptionType, option.getType());
} else {
setIfChanged(mSymbol, null);
setIfChanged(mExpiry, null);
setIfChanged(mStrikePrice, null);
setIfChanged(mOptionType, null);
}
}
@Override
protected void updateParent() {
String symbol = mSymbol.getTypedValue();
String expiry = mExpiry.getTypedValue();
BigDecimal strike = mStrikePrice.getTypedValue();
OptionType type = mOptionType.getTypedValue();
Option newValue = null;
if (StringUtils.isNotBlank(symbol) && StringUtils.isNotBlank(expiry)
&& strike != null && type != null) {
newValue = new Option(symbol, expiry, strike, type);
}
ITypedObservableValue<Instrument> instrument = getParent();
setIfChanged(instrument, newValue);
}
/**
* Observes the option symbol.
*
* @return the option symbol observable
*/
public ITypedObservableValue<String> observeSymbol() {
return mSymbol;
}
/**
* Observes the option expiry.
*
* @return the option expiry observable
*/
public ITypedObservableValue<String> observeExpiry() {
return mExpiry;
}
/**
* Observes the option strike price.
*
* @return the option strike price observable
*/
public ITypedObservableValue<BigDecimal> observeStrikePrice() {
return mStrikePrice;
}
/**
* Observes the option type.
*
* @return the option type observable
*/
public ITypedObservableValue<OptionType> observeOptionType() {
return mOptionType;
}
}