package oracle.otnsamples.ibfbs.trademanagement.helper;
import java.util.Collection;
import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import oracle.toplink.tools.sessionmanagement.SessionManager;
import oracle.toplink.sessions.UnitOfWork;
import oracle.toplink.tools.sessionconfiguration.XMLLoader;
import oracle.toplink.threetier.ServerSession;
import oracle.toplink.threetier.ClientSession;
import oracle.toplink.expressions.ExpressionBuilder;
import oracle.toplink.queryframework.ReadObjectQuery;
import oracle.toplink.queryframework.ReportQuery;
import oracle.toplink.exceptions.DatabaseException;
import oracle.otnsamples.ibfbs.toplink.Stockrate;
import oracle.otnsamples.ibfbs.trademanagement.exception.TradeManagementEventException;
public class StockRateHelper {
private ServerSession server = null;
public StockRateHelper()
throws TradeManagementEventException{
try {
server = (ServerSession) SessionManager.getManager().getSession(new XMLLoader(),
"FBSServerSession",
Thread.currentThread().getContextClassLoader());
}catch(DatabaseException dbEx) {
throw new TradeManagementEventException(" Error initializing Server Session :"+dbEx);
}
}
public Stockrate getLatestRate(String symbol)
throws TradeManagementEventException {
Stockrate rate = null;
try {
ClientSession client = server.acquireClientSession();
ReadObjectQuery readRate = new ReadObjectQuery(Stockrate.class);
ExpressionBuilder rateBuilder = new ExpressionBuilder();
ExpressionBuilder symbolBuilder = new ExpressionBuilder();
ReportQuery subQuery = new ReportQuery(Stockrate.class, symbolBuilder);
subQuery.addMaximum("stockdate");
subQuery.setSelectionCriteria(symbolBuilder.get("symbol").equalsIgnoreCase(symbol));
readRate.setSelectionCriteria(rateBuilder.get("stockdate").equal(subQuery)
.and(rateBuilder.get("symbol").equalsIgnoreCase(symbol)));
rate = (Stockrate) client.executeQuery(readRate);
} catch (DatabaseException ex) {
throw new TradeManagementEventException(" Error while getting "
+ " Stock Rate:\n" + ex.toString());
}
return rate;
}
public Stockrate getQuote(HttpServletRequest req)
throws TradeManagementEventException {
String symbol = req.getParameter("SYMBOL");
if( symbol == null ) return null;
return this.getLatestRate(symbol.trim().toUpperCase());
}
public Collection getLatestRate(String[] symbols)
throws TradeManagementEventException {
ClientSession client = null;
ArrayList rateList = new ArrayList(symbols.length);
try {
client = server.acquireClientSession();
ExpressionBuilder rateBuilder = new ExpressionBuilder();
ExpressionBuilder symbolBuilder = new ExpressionBuilder();
ReadObjectQuery readRate = new ReadObjectQuery(Stockrate.class);
ReportQuery subQuery = new ReportQuery(Stockrate.class, symbolBuilder);
subQuery.addMaximum("stockdate");
for(int i=0;i<symbols.length;i++) {
subQuery.setSelectionCriteria(symbolBuilder.get("symbol").equalsIgnoreCase(symbols[i]));
readRate.setSelectionCriteria( rateBuilder.get("stockdate").equal(subQuery).and(
rateBuilder.get("symbol").equalsIgnoreCase(symbols[i])));
rateList.add(client.executeQuery(readRate));
}
} catch (DatabaseException ex) {
throw new TradeManagementEventException(" Error while getting "
+ " Stock Rate:\n" + ex.toString());
}
return rateList;
}
public void loadRates(Collection stockRates)
throws DatabaseException {
ClientSession client = server.acquireClientSession();
client.getLogin().useBatchWriting();
UnitOfWork uow = client.acquireUnitOfWork();
uow.registerAllObjects(stockRates);
uow.commit();
}
}