package org.wso2.carbon.business.messaging.hl7.store.jpa;
import org.apache.axis2.Constants;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.synapse.MessageContext;
import org.apache.synapse.core.axis2.Axis2MessageContext;
import org.apache.synapse.message.MessageProducer;
import org.wso2.carbon.business.messaging.hl7.store.entity.PersistentHL7Message;
import org.wso2.carbon.business.messaging.hl7.store.util.SerializableMessageContext;
import org.wso2.carbon.business.messaging.hl7.store.util.SerializerUtils;
import org.wso2.carbon.business.messaging.hl7.transport.HL7TransportOutInfo;
import javax.persistence.EntityManager;
public class JPAProducer implements MessageProducer {
private static final Log logger = LogFactory.getLog(JPAProducer.class.getName());
private String id;
private boolean isInitialized = false;
private JPAStore store;
public JPAProducer(JPAStore store) {
if (store == null) {
logger.error("Cannot initialize.");
return;
}
this.store = store;
this.isInitialized = true;
}
// TODO: catch specific exceptions - do performance test
@Override
public boolean storeMessage(MessageContext messageContext) {
SerializableMessageContext serializableMessageContext = SerializerUtils.toStorableMessage(messageContext, messageContext.getMessageID());
HL7TransportOutInfo outInfo = (HL7TransportOutInfo) ((Axis2MessageContext) messageContext).getAxis2MessageContext().getProperty(Constants.OUT_TRANSPORT_INFO);
String controlId = "";
if(outInfo != null) {
controlId = outInfo.getMessageControllerID();
}
EntityManager manager = store.getEntityManager();
try {
PersistentHL7Message persistentHL7Message = new PersistentHL7Message(store.getName(), messageContext.getMessageID(), controlId, SerializerUtils.serialize(serializableMessageContext));
manager.getTransaction().begin();
manager.persist(persistentHL7Message);
manager.getTransaction().commit();
return true;
} catch (Exception e) {
logger.error("Could not store HL7 message. " + e.getMessage());
return false;
}
}
@Override
public boolean cleanup() {
return false;
}
@Override
public void setId(int id) {
this.id = "[" + store.getName() + "-P-" + id + "]";
}
@Override
public String getId() {
return getIdAsString();
}
private String getIdAsString() {
if (this.id == null) {
return "[unknown-producer]";
}
return this.id;
}
}