package org.wso2.carbon.business.messaging.hl7.store;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.synapse.MessageContext;
import org.apache.synapse.core.SynapseEnvironment;
import org.apache.synapse.message.MessageConsumer;
import org.apache.synapse.message.MessageProducer;
import org.apache.synapse.message.store.MessageStore;
import org.apache.synapse.message.store.Constants;
import java.sql.*;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.concurrent.atomic.AtomicInteger;
public class JDBCStore implements MessageStore {
private static final Log logger = LogFactory.getLog(JDBCStore.class.getName());
private boolean isInitialized = false;
private String name;
private String description;
private Map<String, Object> parameters;
private String fileName;
private int maxProducerId = Integer.MAX_VALUE;
/** Message producer id */
private AtomicInteger producerId = new AtomicInteger(0);
/** Message consumer id */
private AtomicInteger consumerId = new AtomicInteger(0);
private Connection conn;
private String driverClass = "com.mysql.jdbc.Driver";
private String dbUrl = "jdbc:mysql://localhost/test";
private String dbUser = "root";
private String dbPass = "root";
private void parseParameters() {
this.driverClass = (String) parameters.get("jdbcDriverClass");
this.dbUrl = (String) parameters.get("jdbcUrl");
this.dbUser = (String) parameters.get("jdbcUser");
this.dbPass = (String) parameters.get("jdbcPass");
if(this.driverClass == null || this.dbUrl == null) {
logger.error("Required parameters jdbcDriverClass and jdbcUrl missing");
}
}
@Override
public void init(SynapseEnvironment synapseEnvironment) {
if(synapseEnvironment == null) {
logger.error("Cannot initialize HL7 JDBC Store");
return;
}
parseParameters();
this.isInitialized = initJDBCStore();
if(this.isInitialized) {
logger.info(toString() + ". Initialized... ");
} else {
logger.warn(toString() + ". Initialization Failed... ");
}
}
public Connection getConnection() {
return this.conn;
}
private boolean initJDBCStore() {
try {
Class.forName(driverClass);
this.conn = DriverManager.getConnection(dbUrl, dbUser, dbPass);
if (!initTables()) {
logger.error("Failed to initialize data tables for '" + dbUrl + "'");
return false;
} else {
return true;
}
} catch (ClassNotFoundException e) {
logger.error("Could not find JDBC driver '" + driverClass + "'");
return false;
} catch (SQLException e) {
logger.error("Error on connection to '" + dbUrl + "'. " + e.getMessage());
return false;
}
}
private boolean initTables() throws SQLException {
Statement statement = conn.createStatement();
ResultSet result = statement.executeQuery(JDBCUtils.getTableExistsQuery(getName()));
if(!result.next()) {
statement.execute(JDBCUtils.getCreateTableQuery(getName()));
return true;
} else {
return false;
}
}
@Override
public void destroy() {
try {
if (!this.conn.isClosed()) {
this.conn.close();
}
} catch (SQLException e) {
logger.error("Error while destroying connection to '" + dbUrl + "'");
}
}
@Override
public String getName() {
return this.name;
}
@Override
public void setName(String name) {
this.name = name;
}
@Override
public void setDescription(String description) {
this.description = description;
}
@Override
public String getDescription() {
return this.description;
}
@Override
public MessageProducer getProducer() {
JDBCProducer producer = new JDBCProducer(this);
producer.setId(nextProducerId());
return producer;
}
@Override
public MessageConsumer getConsumer() {
return null;
}
@Override
public void setParameters(Map<String, Object> parameters) {
this.parameters = parameters;
}
@Override
public Map<String, Object> getParameters() {
return this.parameters;
}
@Override
public int getType() {
return Constants.JDBC_MS;
}
@Override
public MessageContext remove() throws NoSuchElementException {
return null;
}
@Override
public void clear() {
}
@Override
public MessageContext remove(String s) {
return null;
}
@Override
public int size() {
return 0;
}
@Override
public MessageContext get(int i) {
return null;
}
@Override
public List<MessageContext> getAll() {
return null;
}
@Override
public MessageContext get(String s) {
return null;
}
@Override
public boolean isEdited() {
return false;
}
@Override
public void setIsEdited(boolean b) {
}
@Override
public String getArtifactContainerName() {
return null;
}
@Override
public void setArtifactContainerName(String s) {
}
@Override
public String toString() {
return "HL7 Store [" + getName() + "]";
}
@Override
public void setFileName(String fileName) {
this.fileName = fileName;
}
@Override
public String getFileName() {
return this.fileName;
}
private int nextConsumerId() {
int id = consumerId.incrementAndGet();
return id;
}
private int nextProducerId() {
int id = producerId.incrementAndGet();
if (id == maxProducerId) {
logger.info("Setting producer ID generator to 0...");
producerId.set(0);
id = producerId.incrementAndGet();
}
return id;
}
}