package org.marketcetera.photon;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.databinding.observable.Observables;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.databinding.observable.list.WritableList;
import org.eclipse.jface.viewers.LabelProvider;
import org.marketcetera.algo.BrokerAlgoSpec;
import org.marketcetera.client.brokers.BrokerStatus;
import org.marketcetera.client.brokers.BrokersStatus;
import org.marketcetera.photon.commons.Validate;
import org.marketcetera.trade.BrokerID;
import org.marketcetera.util.misc.ClassVersion;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
/* $License$ */
/**
* Manages a collection of brokers objects.
*
* This class is thread safe.
*
* @author <a href="mailto:will@marketcetera.com">Will Horn</a>
* @version $Id: BrokerManager.java 16752 2013-11-14 02:54:13Z colin $
* @since 1.0.0
*/
@ClassVersion("$Id: BrokerManager.java 16752 2013-11-14 02:54:13Z colin $")
public final class BrokerManager implements IBrokerIdValidator {
/**
* The default/null broker.
*/
public static final Broker AUTO_SELECT_BROKER = new Broker(Messages.BROKER_MANAGER_AUTO_SELECT.getText(),null,null);
/**
* Returns the singleton instance for the currently running plug-in.
*
* @return the singleton instance
*/
public static BrokerManager getCurrent() {
return PhotonPlugin.getDefault().getBrokerManager();
}
private final IObservableList mAvailableBrokers = new WritableList(new SyncRealm(),
Lists.newArrayList(AUTO_SELECT_BROKER),
Broker.class);
private final IObservableList mUnmodifiableAvailableBrokers = Observables.unmodifiableObservableList(mAvailableBrokers);
private final Map<BrokerID, Broker> mBrokerMap = Maps.newHashMap();
/**
* Returns an observable list of the available brokers managed by this
* class. The returned list should not be modified.
*
* @return the available brokers
*/
public IObservableList getAvailableBrokers() {
return mUnmodifiableAvailableBrokers;
}
/**
* Updates the available brokers from a {@link BrokersStatus} event.
*
* @param statuses
* the new statuses
*/
public synchronized void setBrokersStatus(BrokersStatus statuses) {
mBrokerMap.clear();
mAvailableBrokers.clear();
List<Broker> availableBrokers = Lists.newArrayList();
availableBrokers.add(AUTO_SELECT_BROKER);
for (BrokerStatus status : statuses.getBrokers()) {
if (status.getLoggedOn()) {
Broker broker = new Broker(status.getName(),
status.getId(),
status.getBrokerAlgos());
mBrokerMap.put(status.getId(), broker);
availableBrokers.add(broker);
}
}
mAvailableBrokers.addAll(availableBrokers);
}
@Override
public synchronized boolean isValid(String brokerId) {
Validate.notNull(brokerId, "brokerID"); //$NON-NLS-1$
return mBrokerMap.containsKey(new BrokerID(brokerId));
}
/**
* Returns the {@link Broker} object for a given {@link BrokerID}. If no
* Broker is found, null is returned.
*
* @param brokerId
* the broker id
* @return the broker
*/
public synchronized Broker getBroker(BrokerID brokerId) {
if (brokerId == null) {
return AUTO_SELECT_BROKER;
}
return mBrokerMap.get(brokerId);
}
/**
* Synchronizes access to the available brokers list.
*/
@ClassVersion("$Id: BrokerManager.java 16752 2013-11-14 02:54:13Z colin $")
private final class SyncRealm extends Realm {
@Override
public boolean isCurrent() {
return true;
}
@Override
protected void syncExec(Runnable runnable) {
synchronized (BrokerManager.this) {
super.syncExec(runnable);
}
}
}
/**
* A Photon abstraction for a broker.
*/
@ClassVersion("$Id: BrokerManager.java 16752 2013-11-14 02:54:13Z colin $")
public final static class Broker {
private final String mName;
private final BrokerID mId;
private final Set<BrokerAlgoSpec> algos;
private Broker(String name,
BrokerID id,
Set<BrokerAlgoSpec> inAlgos)
{
mName = name;
mId = id;
algos = inAlgos;
}
/**
* Returns the broker name.
*
* @return the broker name
*/
public String getName() {
return mName;
}
/**
* Returns the broker id.
*
* @return the broker id
*/
public BrokerID getId() {
return mId;
}
/**
* Get the algos value.
*
* @return a <code>Set<BrokerAlgoSpec></code> value
*/
public Set<BrokerAlgoSpec> getAlgos()
{
return algos;
}
}
/**
* Adapter for displaying {@link Broker} objects.
*/
@ClassVersion("$Id: BrokerManager.java 16752 2013-11-14 02:54:13Z colin $")
public final static class BrokerLabelProvider extends LabelProvider {
@Override
public String getText(Object element) {
Broker broker = (Broker) element;
if (broker == BrokerManager.AUTO_SELECT_BROKER)
return broker.getName();
return Messages.BROKER_LABEL_PATTERN.getText(broker.getName(),
broker.getId());
}
}
}