Package com.google.gwt.sample.stockwatcher.server

Source Code of com.google.gwt.sample.stockwatcher.server.StockPriceServiceImpl

package com.google.gwt.sample.stockwatcher.server;

import java.util.Collections;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.foo.stockprovider.StockProvider;
import org.osgi.framework.BundleContext;

import com.google.gwt.sample.stockwatcher.client.DelistedException;
import com.google.gwt.sample.stockwatcher.client.ServiceUnavailableException;
import com.google.gwt.sample.stockwatcher.client.StockPrice;
import com.google.gwt.sample.stockwatcher.client.StockPriceService;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import org.osgi.util.tracker.ServiceTracker;

@SuppressWarnings("serial")
public class StockPriceServiceImpl extends RemoteServiceServlet implements StockPriceService {

  private ServiceTracker tracker;

  @Override
  public void init() throws ServletException {
    BundleContext ctx = (BundleContext) getServletContext().getAttribute("osgi-bundlecontext");
    tracker = new ServiceTracker(ctx, StockProvider.class.getName(), null);
    tracker.open();
  }

  @Override
  public void destroy() {
    tracker.close();
    tracker = null;
  }

  public StockPrice[] getPrices(String[] symbols) throws DelistedException, ServiceUnavailableException {
    StockPrice[] prices = null;
   
    StockProvider provider = (StockProvider) tracker.getService();
    if ( provider != null ) {
      prices = readPrices(provider, symbols);
    }
    else {
      throw new ServiceUnavailableException();
    }
   
    return prices;
  }

  private StockPrice[] readPrices(StockProvider provider, String[] symbols) throws DelistedException {
    StockPrice[] prices = new StockPrice[symbols.length];
   
    Map<String, Double> stocks = provider.getStocks(symbols);   
    Map<String, Double> last = updateStockPrices(stocks);
 
    for (int i=0; i<symbols.length; i++) {
      Double newPrice = stocks.get( symbols[i] );
      if ( newPrice == null ) {
        throw new DelistedException(symbols[i]);
      }
      else {
        Double oldPrice = last.get( symbols[i] );
        prices[i] = updatePrice(symbols[i], oldPrice, newPrice);
      }
    }
   
    return prices;
  }

  @SuppressWarnings("unchecked")
  private Map<String, Double> updateStockPrices(Map<String, Double> stocks) {
    final String key = StockPrice.class.getName();
    final HttpServletRequest req = getThreadLocalRequest();
    final HttpSession session = req.getSession();
   
    Map<String, Double> last = (Map<String, Double>) session.getAttribute(key);
   
    if ( last == null ) {
//      System.out.println( "Created stocks history" );
      last = Collections.emptyMap();
    }
    else {
//      System.out.println( "Found stocks history " + last );
    }
   
//    System.out.println( "Set stocks history " + stocks );
    session.setAttribute(key, stocks);
   
    return last;
  }

  private StockPrice updatePrice(String symbol, Double oldPrice, Double newPrice) {
    double change = oldPrice == null ? 0 : (newPrice - oldPrice);
    return new StockPrice(symbol, newPrice, change);
  }
}
TOP

Related Classes of com.google.gwt.sample.stockwatcher.server.StockPriceServiceImpl

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.