package com.vci.server.bof.service;
|
|
import java.util.Map;
|
import java.util.UUID;
|
import java.util.concurrent.ConcurrentHashMap;
|
|
import com.vci.corba.common.VCIError;
|
import com.vci.corba.omd.data.BusinessObject;
|
import com.vci.corba.omd.data.LinkObject;
|
import com.vci.server.bof.delegate.BOFactoryServerDelegate;
|
|
|
public class BatchTransferService {
|
/**
|
* 长事务数据缓存对象
|
* @author Jason
|
*
|
*/
|
private class TransactionData{
|
BusinessObject[] createBOs = new BusinessObject[0];
|
LinkObject[] createLOs = new LinkObject[0];
|
BusinessObject[] updateBOs = new BusinessObject[0];
|
LinkObject[] updateLOs = new LinkObject[0];
|
BusinessObject[] deleteBOs = new BusinessObject[0];
|
LinkObject[] deleteLOs = new LinkObject[0];
|
}
|
|
/**
|
* 长事务数据缓存
|
*/
|
private Map<String, TransactionData> _mapTransactionData = new ConcurrentHashMap<String, TransactionData>();
|
|
private static BatchTransferService _instance = null;
|
|
public static synchronized BatchTransferService getInstance() {
|
if (_instance == null) {
|
_instance = new BatchTransferService();
|
}
|
|
return _instance;
|
}
|
|
/**
|
* 开始长事务
|
* @return
|
*/
|
public String beginTransaction() {
|
String sessionKey = UUID.randomUUID().toString();
|
//res.success = true;
|
return sessionKey;
|
}
|
|
/**
|
* 批量传递长事务缓存数据
|
* @param sessionKey
|
* @param createBOs
|
* @param createLOs
|
* @param updateBOs
|
* @param updateLOs
|
* @param deleteBOs
|
* @param deleteLOs
|
* @return
|
* @throws VCIError
|
*/
|
public boolean batchCUDBOLO(String sessionKey,
|
BusinessObject[] createBOs, LinkObject[] createLOs,
|
BusinessObject[] updateBOs, LinkObject[] updateLOs,
|
BusinessObject[] deleteBOs, LinkObject[] deleteLOs) throws VCIError {
|
TransactionData trData = getInnerDataFromSession(sessionKey);
|
|
trData.createBOs = getMergedBusinessObjects(createBOs, trData.createBOs);
|
trData.createLOs = getMergedLinkObjects(createLOs, trData.createLOs);
|
trData.updateBOs = getMergedBusinessObjects(updateBOs, trData.updateBOs);
|
trData.updateLOs = getMergedLinkObjects(updateLOs, trData.updateLOs);
|
trData.deleteBOs = getMergedBusinessObjects(deleteBOs, trData.deleteBOs);
|
trData.deleteLOs = getMergedLinkObjects(deleteLOs, trData.deleteLOs);
|
|
_mapTransactionData.put(sessionKey, trData);
|
|
return false;
|
}
|
|
public boolean commitTransaction(String sessionKey) throws VCIError {
|
boolean res = false;
|
|
TransactionData trData = getInnerDataFromSession(sessionKey);
|
|
// BusinessObjectListHolder cbosHolder = new BusinessObjectListHolder();
|
// BusinessObjectListHolder ubosHolder = new BusinessObjectListHolder();
|
//
|
// LinkObjectListHolder closHolder = new LinkObjectListHolder();
|
// LinkObjectListHolder ulosHolder = new LinkObjectListHolder();
|
|
BOFactoryServerDelegate bofDelegate = BOFactoryServerDelegate.getInstance();
|
return bofDelegate.batchCUDBOLO(trData.createBOs, trData.createLOs,
|
trData.updateBOs, trData.updateLOs,
|
trData.deleteBOs, trData.deleteLOs);
|
}
|
|
|
private BusinessObject[] getMergedBusinessObjects(BusinessObject[] bos1, BusinessObject[] bos2){
|
BusinessObject[] bos = new BusinessObject[bos1.length + bos2.length];
|
System.arraycopy(bos1, 0, bos, 0, bos1.length);
|
System.arraycopy(bos2, 0, bos, bos1.length, bos2.length);
|
return bos;
|
}
|
private LinkObject[] getMergedLinkObjects(LinkObject[] los1, LinkObject[] los2){
|
LinkObject[] bos = new LinkObject[los1.length + los2.length];
|
System.arraycopy(los1, 0, bos, 0, los1.length);
|
System.arraycopy(los2, 0, bos, los1.length, los2.length);
|
return bos;
|
}
|
|
|
protected TransactionData getInnerDataFromSession(String sessionKey){
|
Object obj = _mapTransactionData.get(sessionKey);
|
if(obj != null && obj instanceof TransactionData){
|
return (TransactionData)obj;
|
}
|
return new TransactionData();
|
}
|
}
|