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);
}
}