/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package ke.go.moh.oec.cds;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import ke.go.moh.oec.Person;
import ke.go.moh.oec.PersonRequest;
import ke.go.moh.oec.RequestTypeId;
import ke.go.moh.oec.Visit;
import ke.go.moh.oec.Work;
import ke.go.moh.oec.lib.Mediator;
/**
* @author Brian Wakhutu
* @author Gitahi Ng'ang'a
*/
public class CdsHelper {
private final Mediator mediator;
public CdsHelper(Mediator mediator) {
this.mediator = mediator;
}
public void processNotifyPersonChanged(PersonRequest personRequest) {
Mediator.getLogger(Cds.class.getName()).log(Level.FINER, "NOTIFY_PERSON_CHANGED");
Person person = personRequest.getPerson();
if (person != null) {
Visit lastRegularVisit = person.getLastRegularVisit();
if (lastRegularVisit != null) {
String visitAddress = lastRegularVisit.getAddress();
String xml = personRequest.getXml();
Mediator.getLogger(Cds.class.getName()).log(Level.FINER, "Notify");
Connection notifyConn = Sql.connect();
String notifySql = "INSERT INTO cds_store(destination, message, voided, received_datetime) "
+ " VALUES(" + Sql.quote(visitAddress) + "," + Sql.quote(xml) + ", 0, NOW())";
//grab autogenerated key
Integer autogeneratedKey = Sql.executeUpdate(notifyConn, notifySql);
//immediately forward notification to reception
PersonRequest pr = new PersonRequest();
pr.setRequestReference(autogeneratedKey.toString());
pr.setDestinationAddress(visitAddress);
pr.setXml(xml);
mediator.getData(RequestTypeId.NOTIFY_PERSON_CHANGED, pr);
} else {
Mediator.getLogger(Cds.class.getName()).log(Level.SEVERE, "null lastRegularVisit in person sent by mpi");
}
} else {
Mediator.getLogger(Cds.class.getName()).log(Level.SEVERE, "null requestData sent by mpi");
}
}
public void processGetWork(Work work) {
Mediator.getLogger(Cds.class.getName()).log(Level.FINER, "GET_WORK");
String workAddress = work.getSourceAddress();
Connection getWorkConn = Sql.connect();
String getWorkSql = " SELECT id, message, destination FROM cds_store WHERE destination = "
+ " " + Sql.quote(workAddress) + ""
+ "AND voided = 0";
ResultSet rs = Sql.query(getWorkConn, getWorkSql);
try {
while (rs.next()) {
Integer notificationId = rs.getInt("id");
String message = rs.getString("message");//get message from cds to be sent
String destinationAddress = rs.getString("destination");//get destination
/*
* Send notify to destination
* instantiate person request so that you can set the new
* information held in the record set
*/
PersonRequest prOut = new PersonRequest();
prOut.setDestinationAddress(destinationAddress);
prOut.setXml(message);
prOut.setRequestReference(notificationId.toString());
//Invoke the mediator to send out new person request changes (prout)
mediator.getData(RequestTypeId.NOTIFY_PERSON_CHANGED, prOut);
}
} catch (SQLException ex) {
Logger.getLogger(Cds.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void processReassignWork(Work work) {
Mediator.getLogger(Cds.class.getName()).log(Level.FINER, "REASSIGN");
int id = Integer.parseInt(work.getNotificationId());
String reassignAddress = work.getReassignAddress();
//Update the destination of the Message to a different destination
Connection reassignConn = Sql.connect();
String reassignSql = "UPDATE cds_store SET destination = " + Sql.quote(reassignAddress) + ""
+ " WHERE id = " + id;
Sql.execute(reassignConn, reassignSql);
}
public void processWorkDone(Work work) {
Mediator.getLogger(Cds.class.getName()).log(Level.FINER, "WORK_DONE");
int id = Integer.parseInt(work.getNotificationId());
//Mark the message as voided
Connection workDoneConn = Sql.connect();
String workDoneSql = "UPDATE cds_store SET voided = 1 where "
+ " id = " + id;
Sql.execute(workDoneConn, workDoneSql);
}
}