package org.solmix.fmk.datasource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.solmix.api.datasource.DSRequest; 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.SlxContext.Op; import org.solmix.runtime.SystemContext; public abstract class DsOp<D> implements Op<D, SlxException> { private static final Logger log = LoggerFactory.getLogger(DsOp.class); private String dataSourceName; private final Eoperation type; protected String opId; private DataSource dataSource; public DsOp(DataSource dataSource, Eoperation type) { this.dataSource = dataSource; this.type = type; } public DsOp(String dataSourceName, Eoperation type) { this.dataSourceName = dataSourceName; this.type = type; } protected DataSourceManager _dataSourceManager; @Override public D exe() throws SlxException { DSRequest request = null; try { _dataSourceManager = getDataSourceManager(); if (dataSourceName != null && dataSource == null) { dataSource = _dataSourceManager.get(dataSourceName); } request = _dataSourceManager.createDSRequest(); request.setDataSource(dataSource); request.setDataSourceName(dataSource.getName()); if (opId != null) request.getContext().setOperation(opId); request.getContext().setOperationType(type); } catch (Exception e) { log.error("Find and instance Datasource:" + dataSourceName + " failed,Exception is", e); } D d = null; try { d = exe(request); } finally { if (dataSource != null) { _dataSourceManager.free(dataSource); } } return d; } public DsOp<D> withOpId(String opId) { this.opId = opId; return this; } protected DataSourceManager getDataSourceManager() { SystemContext sc = SlxContext.getThreadSystemContext(); return sc.getExtension(DataSourceManager.class); } public abstract D exe(DSRequest request) throws SlxException; }