package org.solmix.fmk.call;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.solmix.api.call.DSCall;
import org.solmix.api.datasource.DSRequest;
import org.solmix.api.datasource.DSResponse;
import org.solmix.api.datasource.DataSource;
import org.solmix.api.datasource.DataSourceManager;
import org.solmix.api.exception.SlxException;
import org.solmix.api.jaxb.Eoperation;
import org.solmix.fmk.SlxContext;
import org.solmix.fmk.datasource.DsOp;
import org.solmix.runtime.SystemContext;
/**
* Used with transaction operations.
*
* @author solmix.f@gmail.com
* @version 110082 2013-8-27
*/
public abstract class XAOp
{
private static final Logger log = LoggerFactory.getLogger(DsOp.class);
private String dataSourceName;
private final Eoperation type;
private Object criteria;
private Object values;
protected String opId;
private DataSource dataSource;
private DSRequest request;
public XAOp(DataSource dataSource, Eoperation type)
{
this.dataSource = dataSource;
this.type = type;
}
public XAOp(String dataSourceName, Eoperation type)
{
this.dataSourceName = dataSourceName;
this.type = type;
}
protected DataSourceManager _dataSourceManager;
public DSResponse exe() throws SlxException {
try {
if (dataSourceName != null && dataSource == null) {
_dataSourceManager = getDataSourceManager();
dataSource = _dataSourceManager.get(dataSourceName);
}
request = _dataSourceManager.createDSRequest();
request.setDataSource(dataSource);
if (opId != null)
request.getContext().setOperation(opId);
if (criteria != null)
request.getContext().setCriteria(criteria);
if (values != null)
request.getContext().setValues(values);
request.getContext().setOperationType(type);
request.setCanJoinTransaction(true);
request.setDSCall(rpc);
} catch (Exception e) {
log.error("Find and instance Datasource:" + dataSourceName + " failed,Exception is" + e.getMessage());
}
DSResponse d = null;
try {
d = exe(request);
} finally {
if (dataSource != null) {
_dataSourceManager.free(dataSource);
}
}
return d;
}
public DSRequest getRequest() {
return this.request;
}
public abstract DSResponse exe(DSRequest request) throws SlxException;
private DSCall rpc;
protected void setRpc(DSCall rpc) {
this.rpc = rpc;
}
public XAOp withOpId(String opId) {
this.opId = opId;
return this;
}
public XAOp withCriteria(Object criteria) {
this.criteria = criteria;
return this;
}
public XAOp withValues(Object values) {
this.values = values;
return this;
}
public static class DfXAOp extends XAOp
{
public DfXAOp(String dataSourceName, Eoperation type)
{
super(dataSourceName, type);
}
@Override
public DSResponse exe(DSRequest request) throws SlxException {
return request.execute();
}
}
private DataSourceManager getDataSourceManager() {
SystemContext sc = SlxContext.getThreadSystemContext();
return sc.getExtension(DataSourceManager.class);
}
}