package oracle.otnsamples.ibfbs.usermanagement.helper;
import java.util.Collection;
import java.util.ArrayList;
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.ReadAllQuery;
import oracle.toplink.queryframework.ReportQuery;
import oracle.toplink.exceptions.DatabaseException;
import oracle.otnsamples.ibfbs.toplink.News;
import oracle.otnsamples.ibfbs.usermanagement.exception.UserManagementEventException;
public class NewsHelper {
private ServerSession server = null;
public NewsHelper()
throws UserManagementEventException{
try {
server = (ServerSession) SessionManager.getManager().getSession(new XMLLoader(),
"FBSServerSession",
Thread.currentThread().getContextClassLoader());
}catch(DatabaseException dbEx) {
throw new UserManagementEventException(" Error initializing Server Session :"+dbEx);
}
}
public Collection getLatestNews(String symbol)
throws UserManagementEventException {
ClientSession client = null;
ArrayList newsList = new ArrayList(3);
try {
client = server.acquireClientSession();
ReadAllQuery readNews = new ReadAllQuery(News.class);
ExpressionBuilder newsBuilder = new ExpressionBuilder();
ExpressionBuilder symbolBuilder = new ExpressionBuilder();
ReportQuery subQuery = new ReportQuery(News.class, symbolBuilder);
subQuery.addMaximum("newsdate");
subQuery.setSelectionCriteria(symbolBuilder.get("symbol").equalsIgnoreCase(symbol));
readNews.useCollectionClass(ArrayList.class);
readNews.setSelectionCriteria(newsBuilder.get("newsdate").equal(subQuery).and(
newsBuilder.get("symbol").equalsIgnoreCase(symbol)));
newsList.addAll((ArrayList)client.executeQuery(readNews));
} catch (DatabaseException ex) {
throw new UserManagementEventException(" Error while getting "
+ " News:\n" + ex.toString());
}
return newsList;
}
public void loadNews(Collection newsCollection)
throws DatabaseException {
ClientSession client = server.acquireClientSession();
client.getLogin().useBatchWriting();
UnitOfWork uow = client.acquireUnitOfWork();
uow.registerAllObjects(newsCollection);
uow.commit();
}
public Collection getLatestNews(String[] symbols)
throws UserManagementEventException {
ClientSession client = null;
ArrayList newsList = new ArrayList(symbols.length);
try {
client = server.acquireClientSession();
ReadAllQuery readNews = new ReadAllQuery(News.class);
ExpressionBuilder newsBuilder = new ExpressionBuilder();
ExpressionBuilder symbolBuilder = new ExpressionBuilder();
ReportQuery subQuery = new ReportQuery(News.class, symbolBuilder);
subQuery.addMaximum("newsdate");
for(int i=0;i<symbols.length;i++) {
subQuery.setSelectionCriteria(symbolBuilder.get("symbol").equalsIgnoreCase(symbols[i]));
readNews.useCollectionClass(ArrayList.class);
readNews.setSelectionCriteria(newsBuilder.get("newsdate").equal(subQuery)
.and(newsBuilder.get("symbol").equalsIgnoreCase(symbols[i])));
newsList.addAll((ArrayList)client.executeQuery(readNews));
}
} catch (DatabaseException ex) {
throw new UserManagementEventException(" Error while getting "
+ " Stock News:\n" + ex.toString());
}
return newsList;
}
}