예제 #1
0
/**
 * Manages a collection of brokers objects.
 *
 * <p>This class is thread safe.
 *
 * @author <a href="mailto:[email protected]">Will Horn</a>
 * @version $Id$
 * @since 1.0.0
 */
@ClassVersion("$Id$")
public final class BrokerManager implements IBrokerIdValidator {

  /** The default/null broker. */
  private static final Broker AUTO_SELECT_BROKER =
      new Broker(Messages.BROKER_MANAGER_AUTO_SELECT.getText(), 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());
        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$")
  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$")
  public static final class Broker {
    private final String mName;
    private final BrokerID mId;

    private Broker(String name, BrokerID id) {
      mName = name;
      mId = id;
    }

    /**
     * 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;
    }
  }

  /** Adapter for displaying {@link Broker} objects. */
  @ClassVersion("$Id$")
  public static final 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());
    }
  }
}
 /**
  * Returns the collection of trade suggestions.
  *
  * @return the trade suggestions
  */
 public IObservableList getTradeSuggestions() {
   return Observables.unmodifiableObservableList(mSuggestions);
 }