package oracle.otnsamples.ibfbs.admin.helper;
import java.util.Collection;
import java.util.TimerTask;
import java.util.Date;
import java.util.Vector;
import java.math.BigDecimal;
import javax.naming.InitialContext;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSession;
import oracle.toplink.tools.sessionmanagement.SessionManager;
import oracle.toplink.tools.sessionconfiguration.XMLLoader;
import oracle.toplink.threetier.ServerSession;
import oracle.toplink.threetier.ClientSession;
import oracle.toplink.queryframework.SQLCall;
import oracle.toplink.exceptions.DatabaseException;
import oracle.toplink.publicinterface.DatabaseRow;
import oracle.otnsamples.ibfbs.utils.ConnectionParams;
import oracle.otnsamples.ibfbs.admin.ejb.MailService;
import oracle.otnsamples.ibfbs.admin.ejb.MailServiceHome;
import oracle.otnsamples.ibfbs.trademanagement.helper.StockRateHelper;
import oracle.otnsamples.ibfbs.admin.exception.WebServiceAccessException;
public class UploadStockRateTask extends TimerTask {
public void run() {
int status = 0;
try {
WebServicesHelper wshelper = new WebServicesHelper();
StockSymbolHelper sshelper = new StockSymbolHelper();
StockRateHelper srHelper = new StockRateHelper();
Collection symbols = sshelper.getAllSymbols();
srHelper.loadRates(wshelper.fetchStockRates(symbols));
} catch (WebServiceAccessException we) {
System.err.println(" Error accessing web service :" + we.toString());
status = -1;
} catch (Exception ex) { System.err.println(" Generic Exception while "
+ " uploading stock data :\n" + ex.toString());
status = -1;
} finally {
sendUploadStatus(status);
}
sendAlerts();
}
public void sendAlerts() {
ServerSession server = null;
try {
server = (ServerSession) SessionManager.getManager().getSession(new XMLLoader(),
"FBSServerSession",
Thread.currentThread().getContextClassLoader());
}catch(DatabaseException dbEx) {
System.out.println(" UploadStockRateTast.sendAlerts: Cannot send alerts, "+
"error initializing Server Session :"+dbEx);
return;
}
BigDecimal accountnumber = null;
BigDecimal minlimit = null;
BigDecimal maxlimit = null;
BigDecimal rate = null;
String symbol = null;
String name = null;
String email = null;
String mobile = null;
String alertmode = null;
QueueSession session = null;
QueueConnection qconn = null;
try {
InitialContext ic = new InitialContext();
QueueConnectionFactory factory = (QueueConnectionFactory)ic.lookup(
ConnectionParams.alertQueueConnFactory);
qconn = factory.createQueueConnection();
Queue queue = (Queue)ic.lookup(ConnectionParams.alertQueue);
qconn.start();
session = qconn.createQueueSession(false, 1);
ClientSession client = server.acquireClientSession();
Vector alerts = (Vector) client.executeSelectingCall(new SQLCall(
" SELECT a.AccountNumber,a.Symbol,a.MinLimit,a.MaxLimit, "
+ " ua.FirstName || ' ' || ua.LastName FullName ,ua.AlertMode,ua.Email, "
+ " ua.MobileEmail, sr.LowPrice "
+ " FROM Alerts a,UserAccount ua, StockRate sr "
+ " WHERE sr.StockDate = (SELECT MAX(StockDate) FROM StockRate)"
+ " AND a.Symbol = sr.Symbol AND "
+ " (sr.LowPrice <= a.MinLimit OR sr.LowPrice >= a.MaxLimit) AND "
+ " a.AccountNumber = ua.AccountNumber "));
Message message;
for(int i=0;i<alerts.size();i++) {
DatabaseRow alert = (DatabaseRow)alerts.elementAt(i);
accountnumber = (BigDecimal)alert.get("ACCOUNTNUMBER");
symbol = (String)alert.get("SYMBOL");
minlimit = (BigDecimal)alert.get("MINLIMIT");
maxlimit = (BigDecimal)alert.get("MAXLIMIT");
name = (String)alert.get("FULLNAME");
alertmode = (String)alert.get("ALERTMODE");
email = (String)alert.get("EMAIL");
mobile = (String)alert.get("MOBILEEMAIL");
rate = (BigDecimal)alert.get("LOWPRICE");
message = session.createMessage();
message.setStringProperty("accountNumber", accountnumber.toString());
message.setStringProperty("symbol", symbol);
message.setStringProperty("minlimit", minlimit.toString());
message.setStringProperty("maxlimit", maxlimit.toString());
message.setStringProperty("name", name);
message.setStringProperty("alertMode", alertmode);
message.setStringProperty("email", email);
message.setStringProperty("mobile", mobile);
message.setFloatProperty("rate", rate.floatValue());
message.setJMSExpiration(18000L);
session.createSender(queue).send(message);
}
} catch (DatabaseException se) { System.err.println("SQl Error while sending alert : \n"
+ se.toString());
} catch (Exception ex) { System.err.println("Exception while sending alert : \n"
+ ex.toString());
} finally {
try {
if(session != null) session.close();
if(qconn != null) qconn.close();
} catch(JMSException je) {
System.err.println("JMSException : while closing session" + je.toString());
}
}
}
private void sendUploadStatus(int status) {
MailService mailService = null;
try {
InitialContext ic = new InitialContext();
MailServiceHome mailServiceHome = (MailServiceHome) ic.lookup("MailService");
mailService = mailServiceHome.create();
mailService.sendMail(ConnectionParams.notificationMailId,
"uploadtask@fbs.com", " Upload Stock Rate Status",
getUploadMsg(status));
} catch (Exception ex) {
System.err.println(
" Couldnot initialize mail service to send upload status :"
+ ex.toString());
}
}
private String getUploadMsg(int status) {
StringBuffer sb = new StringBuffer();
String uploadStatus = (status == 0)
? " Upload Success "
: "Upload Failed";
sb.append(" Hi Admin,<br><br> ")
.append(" The Status of Stock Rate Upload Task : <b><u>")
.append(uploadStatus)
.append(" </u></b><br><br>")
.append(" <br><br> Upload Time : ")
.append(new Date())
.append("<br><br>")
.append(" --Upload Task. ");
return sb.toString();
}
private String getHTMLAlertMsg(int accountNumber, String name, String symbol,
String minlimit, String maxlimit, float rate) {
StringBuffer sb = new StringBuffer();
sb.append("<br><br>")
.append(" Hi,<br><br>")
.append("<h4><u>Alert Details</u></h4>")
.append("<table border='1'>")
.append(" <tr><th> Account Number</th><td>")
.append(accountNumber)
.append("</td></tr>")
.append(" <tr><th> Name</th><td>" + name + "</td></tr>")
.append(" <tr><th> Symbol</th><td>" + symbol + "</td></tr>")
.append(" <tr><th> Min Limit</th><td>" + minlimit + "</td></tr>")
.append(" <tr><th> Max Limit</th><td>" + maxlimit + "</td></tr>")
.append(" <tr><th> Current Stock Price</th><th>" + rate + "</th></tr>")
.append("</table><br>")
.append("<font color='##990000' size='3'><b> You have a Stock Alert !!")
.append("</b></font><br><br>")
.append("<br><br>Happy Trading !! <br> FBS Team.");
return sb.toString();
}
private String getTextAlertMsg(int accountNumber, String name, String symbol,
String minlimit, String maxlimit, float rate) {
StringBuffer sb = new StringBuffer();
sb.append("\nAlert Details \n\n")
.append("Account Number" + accountNumber + "\n")
.append("Name :" + name + "\n")
.append("Symbol :" + symbol + "\n")
.append("Min Limit :" + minlimit + "\n")
.append("Max Limit :" + maxlimit + "\n")
.append("Current Stock Price :" + rate + "\n");
return sb.toString();
}
}