private void connectNewClients() {
   while (_numActiveClients == 0 && _newClients.size() == 0) {
     try {
       Thread.sleep(100);
     } catch (InterruptedException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
     }
   }
   for (String client : _newClients) {
     //			StockExchangeBroker keyB = _brokers.firstKey();
     //			StockExchangeBroker broker=_brokers.get(keyB);;
     StockExchangeBroker broker = _brokers.pollFirst();
     ;
     if (broker.getNumOfClients() == N) {
       _stockExchangeStompClient.send("/topic/Connected", "connectFailed " + client + "\n");
       _numActiveClients++;
     } else {
       if (broker.getNumOfClients() == 0) _numActiveCBrokers++;
       broker.addClient(client);
       _stockExchangeStompClient.send(
           "/topic/cConnected", "connected " + client + " " + broker.getName() + "\n");
       _stockExchangeStompClient.subscribe("/topic/cDeals-" + client, this);
       _numActiveClients++;
     }
     _brokers.add(broker);
   }
   _newClients.clear();
 }
 public void startNewDay() {
   _numOfClosedBrockers = 0;
   _day++;
   _stockExchangeStompClient.send("/topic/Calendar", "newDay " + _day + "\n");
   connectNewBrokers();
   connectNewClients();
   publishPrices();
 }
  public StockExchange(String server, int port, String login, String pass)
      throws FileNotFoundException, IOException, LoginException {
    _stockExchangeStompClient = new Client(server, port, login, pass);
    _companies = initCompanies();
    _brokers = new TreeSet<StockExchangeBroker>(new BrokerCompare());

    _cash = 0;
    _numOfClosedBrockers = 0;
    _day = -1;
    _numActiveClients = 0;
    _numActiveCBrokers = 0;
    _newBrokers = new Vector<String>();
    _newClients = new Vector<String>();
    // _clients= new HashMap<String,StockExchangeBroker>();
    _stockExchangeStompClient.subscribe("/topic/bConnect", this);
    _stockExchangeStompClient.subscribe("/topic/cConnect", this);
    _stockExchangeStompClient.subscribe("/topic/Orders", this);
    _stockExchangeStompClient.subscribe("/topic/cDisconnect", this);
  }
 private void disconnectClient(String client) {
   for (Company company : _companies.values()) {
     StockOrder order = company.getBuyOrders().get(client);
     while (order != null) { // remove buy orders
       company.getBuyOrders().remove(client);
       order = company.getBuyOrders().get(client);
     }
     order = company.getSellOrders().get(client);
     while (order != null) { // sell buy orders
       company.getSellOrders().remove(client);
       order = company.getSellOrders().get(client);
     }
   }
   _numActiveClients--;
   for (StockExchangeBroker broker : _brokers) broker.removeClient(client);
   //		//_brokers.get(_clients.get(client)).decClientNum(); TODO:
   //		_clients.remove(client);
   _stockExchangeStompClient.unsubscribe("/topic/cDeals-" + client, this);
   _stockExchangeStompClient.send("/topic/cDisconnected", "disconnected " + client + "\n");
 }
 private void computeDeals() {
   for (Company company : _companies.values()) {
     while ((company._buyOrders.size() > 0) && (company._sellOrders.size() > 0)) {
       StockOrder buy = company._buyOrders.get(company._buyOrders.firstKey());
       StockOrder sell = company._sellOrders.get(company._sellOrders.firstKey());
       if (sell.getPrice() > buy.getPrice()) break;
       double price = Math.min(buy.getPrice(), sell.getPrice());
       int amount = Math.min(buy.getAmount(), sell.getAmount());
       String mes =
           "deal "
               + buy.getClientName()
               + " "
               + buy.getBrokerName()
               + " "
               + sell.getClientName()
               + " "
               + sell.getBrokerName()
               + " "
               + buy.getStockName()
               + " "
               + amount
               + " "
               + price
               + "\n";
       if (sell.getClientName().equals("StockExchange")) {
         _cash += price;
         _stockExchangeStompClient.send("/topic/bDeals-" + buy.getBrokerName(), mes);
         company._buyOrders.remove(buy.getClientName());
         company._sellOrders.remove(sell.getClientName());
         company.addDefaultOrder();
       } else {
         _stockExchangeStompClient.send("/topic/bDeals-" + buy.getBrokerName(), mes);
         _stockExchangeStompClient.send("/topic/bDeals-" + sell.getBrokerName(), mes);
         company._buyOrders.remove(buy.getClientName());
         company._sellOrders.remove(sell.getClientName());
       }
     }
   }
 }
 private void connectNewBrokers() {
   while (_numActiveCBrokers == 0 && _newBrokers.size() == 0) {
     try {
       Thread.sleep(100);
     } catch (InterruptedException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
     }
   }
   for (String broker : _newBrokers) {
     _brokers.add(new StockExchangeBroker(broker));
     _stockExchangeStompClient.send("/topic/bConnected", "connected " + broker + "\n");
   }
   _newBrokers.clear();
 }
 private void publishPrices() {
   String mesg = "Prices " + _day + ":\n";
   for (Company company : _companies.values())
     mesg += company.getName() + " " + company.getPrice() + "\n";
   _stockExchangeStompClient.send("/topic/Prices", mesg);
 }