package net.codjo.control.server.plugin;
import java.sql.Connection;
import net.codjo.agent.DFService;
import net.codjo.control.common.loader.TransfertData;
import net.codjo.control.common.message.TransferJobRequest;
import net.codjo.sql.server.ConnectionPool;
import net.codjo.sql.server.JdbcServiceUtil;
import net.codjo.workflow.common.message.JobException;
import net.codjo.workflow.common.message.JobRequest;
import net.codjo.workflow.common.protocol.JobProtocolParticipant;
import net.codjo.workflow.server.api.JobAgent;
import org.apache.log4j.Logger;
/**
*
*/
class TransferJobAgent extends JobAgent {
private static final Logger LOG = Logger.getLogger(TransferJobAgent.class);
TransferJobAgent(JdbcServiceUtil jdbc, ControlPreference controlPreference, MODE mode) {
super(new TransferParticipant(jdbc, controlPreference),
new DFService.AgentDescription(getTransfertDescription()), mode);
}
TransferJobAgent(JdbcServiceUtil jdbc, ControlPreference controlPreference) {
this(jdbc, controlPreference, MODE.NOT_DELEGATE);
}
private static DFService.ServiceDescription getTransfertDescription() {
return new DFService.ServiceDescription(ControlServerPlugin.QUARANTINE_TRANSFER_TYPE,
"control-service");
}
private static class TransferParticipant extends JobProtocolParticipant {
private final JdbcServiceUtil jdbc;
private final ControlPreference preference;
TransferParticipant(JdbcServiceUtil jdbc, ControlPreference preference) {
this.jdbc = jdbc;
this.preference = preference;
}
@Override
protected void executeJob(JobRequest jobRequest) throws JobException {
TransferJobRequest request = new TransferJobRequest(jobRequest);
try {
TransfertData data = preference.getTransfertData(request);
ConnectionPool connectionPool = jdbc.getConnectionPool(getAgent(), getRequestMessage());
Connection connection = connectionPool.getConnection();
try {
if (TransferJobRequest.Transfer.QUARANTINE_TO_USER == request.getTransferType()) {
data.getQuarantineToUserQuery(connection)
.execute();
}
else if (TransferJobRequest.Transfer.USER_TO_QUARANTINE == request.getTransferType()) {
data.getUserToQuarantineQuery(connection)
.execute();
}
else {
throw new JobException("Type de transfert inconnu.");
}
}
finally {
connectionPool.releaseConnection(connection);
}
}
catch (Throwable cause) {
String message = "Impossible de transferer les donn�es : "
+ request.getTransferType()
+ "(" + request.getQuarantine() + ", " + request.getUserQuarantine() + ")";
LOG.error(message, cause);
throw new JobException(message, cause);
}
}
}
}