/**
* Class BusinessObjectManager 是所有核算对象的管理器
* 它用来管理com.amarsoft.app.base.businessobject.BusinessObject产生的对象
* 主要负责从数据库加载数据、更新数据、插入数据等动作.
* @since JDK1.6
*/
package com.amarsoft.app.base.businessobject;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import com.amarsoft.are.ARE;
import com.amarsoft.are.jbo.BizObject;
import com.amarsoft.are.jbo.BizObjectClass;
import com.amarsoft.are.jbo.BizObjectManager;
import com.amarsoft.are.jbo.BizObjectQuery;
import com.amarsoft.are.jbo.JBOException;
import com.amarsoft.are.jbo.JBOFactory;
import com.amarsoft.are.jbo.JBOTransaction;
import com.amarsoft.are.jbo.impl.StateBizObject;
import com.amarsoft.are.lang.DataElement;
import com.amarsoft.are.lang.StringX;
import com.amarsoft.are.util.ASValuePool;
public class BusinessObjectManager{
/**
* 定义不同的数据内存对象池,需保存的业务对象
*/
protected HashMap> updateObjects=new HashMap>();
/**
* 定义不同的数据内存对象池,需删除的业务对象
*/
protected HashMap> deleteObjects=new HashMap>();
/**
* 定义处理数据对象的“管理器”缓存池
* 使用com.amarsoft.are.jbo.BizObjectManager管理器,则该对象中存储该管理器实例化对象
*/
protected HashMap bizObjectManagers = new HashMap();
/**
* 定义数据处理连接,为了兼容JBO基础数据处理结构,此处定义JBOTransaction
*/
protected JBOTransaction tx=null;
/**
* 管理数据对象数量
*/
protected int objectNumber=0;
/**
* 创建一个对象管理器
* @return
* @throws JBOException
* @throws SQLException
*/
public static BusinessObjectManager createBusinessObjectManager(){
BusinessObjectManager businessObjectManager = new BusinessObjectManager();
return businessObjectManager;
}
/**
* 根据JBOTransaction创建一个对象管理器,事物与JBOTransaction保持一致
* @param tx
* @return
* @throws JBOException
* @throws SQLException
*/
public static BusinessObjectManager createBusinessObjectManager(JBOTransaction tx){
BusinessObjectManager businessObjectManager = createBusinessObjectManager();
businessObjectManager.tx = tx;
return businessObjectManager;
}
/**
* 获取变量tx对象
* @return JBOTransaction
*/
public JBOTransaction getTx() {
return tx;
}
/**
* 获取数据库连接对象
* @return JBOTransaction
* @throws JBOException
* @throws SQLException
*/
public Connection getConnection() throws JBOException {
if(tx!=null){
BizObjectManager m = JBOFactory.getFactory().getManager("jbo.sys.SYSTEM_SETUP");
tx.join(m);
return tx.getConnection(m);
}
else{
return null;
}
}
/**
* 将传入的BusinessObject对象存入到管理器指定操作方式的内存对象中
* @param object
* @throws Exception
*/
public void updateBusinessObject(BusinessObject businessObject) throws Exception{
businessObject.generateKey(false);
String jboClassName = businessObject.getBizClassName();
ArrayList deleteList = (ArrayList)deleteObjects.get(jboClassName);
if(deleteList!=null && deleteList.contains(businessObject)){
deleteList.remove(businessObject);
}
else{
ArrayList list=(ArrayList) updateObjects.get(jboClassName);
if(list==null){
list=new ArrayList();
updateObjects.put(jboClassName, list);
}
if(!list.contains(businessObject)){
list.add(businessObject);
objectNumber++;
}
}
}
/**
* 将传入的BusinessObject对象存入到管理器指定操作方式的内存对象中
* @param operateFlag
* @param objectList
* @throws Exception
*/
public void deleteBusinessObject(BusinessObject businessObject) throws Exception{
String jboClassName = businessObject.getBizClassName();
ArrayList list = (ArrayList)updateObjects.get(jboClassName);
if(list!=null && list.contains(businessObject)){
list.remove(businessObject);
}
else{
list=(ArrayList) deleteObjects.get(jboClassName);
if(list==null){
list=new ArrayList();
deleteObjects.put(jboClassName, list);
}
if(!list.contains(businessObject)){
list.add(businessObject);
objectNumber++;
}
}
}
/**
* 将传入的BusinessObject对象存入到管理器指定操作方式的内存对象中
* @param objectList
* @throws Exception
*/
public void updateBusinessObjects(List objectList) throws Exception{
if(objectList == null) return;
for(BusinessObject o:objectList){
updateBusinessObject(o);
}
}
/**
* 将传入的BusinessObject对象存入到管理器指定操作方式的内存对象中
* @param objectList
* @throws Exception
*/
public void deleteBusinessObjects(List objectList) throws Exception{
if(objectList == null) return;
for(BusinessObject o:objectList){
deleteBusinessObject(o);
}
}
/**
* 根据JBO名称获取BizObjectManager实例
* @param objectType
* @return
* @throws JBOException
*/
public BizObjectManager getBizObjectManager(String jboName) throws JBOException{
BizObjectManager m = null;
if(bizObjectManagers.get(jboName) == null){
m = JBOFactory.getFactory().getManager(jboName);
if(tx != null) tx.join(m);
bizObjectManagers.put(jboName, m);
}
else
m = (BizObjectManager)bizObjectManagers.get(jboName);
return m;
}
public BusinessObject loadRelativeBusinessObject(BusinessObject mainObject,String relativeType) throws Exception{
List a=this.loadRelativeBusinessObjects(mainObject, relativeType);
if(a.isEmpty()) return null;
else if(a.size()>1) throw new JBOException("该对象类型【"+mainObject.getBizClassName()+"】的关联对象属性【"+relativeType+"】的数据存在多条!");
return a.get(0);
}
public List loadRelativeBusinessObjects(BusinessObject mainObject,String relativeType) throws Exception{
Map relativeTypeConfig = BusinessObjectHelper.getBizClassRelativeType(mainObject.getBizObjectClass(), relativeType);
String[][] mappingAttributes=(String[][])relativeTypeConfig.get("AttributeMapping");
Map parameters=new HashMap();
for(int i=0;i l = this.simpleLoadBusinessObjects((String)relativeTypeConfig.get("BizObjectClass"), parameters);
mainObject.setAttributeValue(relativeType, l);
return l;
}
public BusinessObject keyLoadBusinessObject(String bizObjectClass,Object... keyValues) throws Exception{
BizObjectClass c=JBOFactory.getBizObjectClass(bizObjectClass);
String[] keys=c.getKeyAttributes();
if(keys.length != keyValues.length) throw new JBOException("该对象类型【"+bizObjectClass+"】的主键值数据不正确【"+keyValues+"】!");
Object[] paramters = new Object[keys.length*2];
for(int i = 0;i < keys.length; i ++){
paramters[i*2]=keys[i];
paramters[i*2+1]=keyValues[i];
}
List a=this.simpleLoadBusinessObjects(bizObjectClass, paramters);
if(a.isEmpty()) return null;
else if(a.size()>1) throw new JBOException("该对象类型【"+bizObjectClass+"】的符合条件【"+keyValues+"】的数据存在多条!");
return a.get(0);
}
public BusinessObject loadBusinessObject(String jboName,Object... parameters) throws Exception{
if(parameters.length == 1) return keyLoadBusinessObject(jboName,parameters);
List a=this.simpleLoadBusinessObjects(jboName, parameters);
if(a.isEmpty()) return null;
else if(a.size()>1) throw new JBOException("该对象类型【"+jboName+"】的符合条件【"+parameters+"】的数据存在多条!");
return a.get(0);
}
public List simpleLoadBusinessObjects(String jboName,Object... parameters) throws Exception{
String sql="";
for(int i=0;i loadBusinessObjects(BizObjectQuery query) throws JBOException{
return loadBusinessObjects(query,0,1000);
}
public List loadBusinessObjects(BizObjectQuery query,int from,int to) throws JBOException{
query.setFirstResult(from);
query.setMaxResults(to);
@SuppressWarnings("unchecked")
List jboResultSet = query.getResultList(true);
List bizObjectList = new ArrayList();
for(BizObject bo:jboResultSet){
bizObjectList.add(BusinessObject.convertFromBizObject(bo));
}
return bizObjectList;
}
/**
* 根据ObjectType获取JBO的数据结构定义
* 根据Where条件和Where条件附带参数从数据库中加载多个数据对象
* 并返回多个数据对象的List
* @param objectType
* @param whereClause
* @param parameter
* @return List
* @throws Exception
*/
public List loadBusinessObjects(String jboClass,String jbosql,Object... parameters) throws Exception{
BizObjectQuery query = this.getQuery(jboClass, jbosql, parameters);
return this.loadBusinessObjects(query);
}
public List loadBusinessObjects(List boList, String relaObjectType,
String relaWhereClause, ASValuePool rela) throws Exception {
BizObjectManager m1 = getBizObjectManager(relaObjectType);
BizObjectQuery q1 = m1.createQuery(relaWhereClause);
for (BusinessObject bo : boList) {
for (Object key : rela.getKeys()) {
String s = rela.getString((String) key);
if (s.indexOf("${") >= 0)
q1.setParameter((String) key, bo.getString(s.replace("${", "").replace("}", "")));
else if (s.indexOf("{#") >= 0)
q1.setParameter((String) key, bo.getString(s.replace("{#", "").replace("}", "")));
else
q1.setParameter((String) key, s);
}
List ls = q1.getResultList(true);
if(ls != null && !ls.isEmpty())
{
for(BizObject l:ls)
{
bo.appendBusinessObject(relaObjectType,BusinessObject.convertFromBizObject(l));
}
}
}
return boList;
}
/**
* 执行SQL语句,返回List
* @param sql
* @param map 参数
* @param sqlca
* @return
* @throws Exception
*/
public List loadBusinessObjects_SQL(String sql,BusinessObject parameter) throws Exception{
return loadBusinessObjects_SQL("",sql,parameter);
}
/**
* 执行SQL语句,返回List
* @param sql
* @param map 参数
* @param sqlca
* @return
* @throws Exception
*/
public List loadBusinessObjects_SQL(String objectType,String sql,BusinessObject parameter) throws Exception{
List paraList=com.amarsoft.app.base.util.StringHelper.getParameterList(sql);
List valueList = new ArrayList();
for(String paraID:paraList){
String value = parameter.getString(paraID);
if(sql.indexOf("'{#"+paraID+"}%'") > -1)
value += "%";
while(sql.indexOf(":{#"+paraID+"}") > -1){
sql=sql.replaceFirst("\\:\\{#"+paraID+"\\}", "?");
valueList.add(value);
}
while(sql.indexOf("'{#"+paraID+"}'") > -1){
sql=sql.replaceFirst("'\\{#"+paraID+"\\}'", "?");
valueList.add(value);
}
while(sql.indexOf("'{#"+paraID+"}%'") > -1){
sql=sql.replaceFirst("'\\{#"+paraID+"\\}%'", "?");
valueList.add(value);
}
while(sql.indexOf("{#"+paraID+"}") > -1){
sql=sql.replaceFirst("\\{#"+paraID+"\\}", "?");
valueList.add(value);
}
}
List lst=new ArrayList();
Connection conn = null;
BizObjectManager manager = JBOFactory.getBizObjectManager("jbo.sys.USER_INFO");
if(tx != null)
{
tx.join(manager);
conn = tx.getConnection(manager);
}else
{
conn = ARE.getDBConnection(manager.getDatabase());
}
PreparedStatement ps = null;
ResultSet rs = null;
try{
ps = conn.prepareStatement(sql);
for(int i = 0; i < valueList.size();i ++)
{
ps.setString(i+1, valueList.get(i));
}
rs = ps.executeQuery();
while(rs.next()){
BusinessObject bo = null;
if(StringX.isEmpty(objectType)){
bo=BusinessObject.createBusinessObject();
}
else{
bo=BusinessObject.createBusinessObject(objectType);
}
ResultSetMetaData rsm = rs.getMetaData();
for(int i=1;i<=rsm.getColumnCount();i++){
String name=rsm.getColumnLabel(i);
bo.setAttributeValue(name, rs.getObject(name));
}
lst.add(bo);
}
rs.close();
}catch(Exception ex)
{
ARE.getLog().error(sql);
throw ex;
}
finally{
if(ps != null) ps.close();
if(rs != null) rs.close();
if(tx == null || conn != null) conn.close();
}
return lst;
}
/**
* 清理管理器中的对象信息
* @throws Exception
*/
public void clear() throws Exception{
if(updateObjects!=null) updateObjects.clear();
if(deleteObjects!=null) deleteObjects.clear();
}
/**
* 执行数据库提交
* @throws Exception
*/
public void commit() throws Exception{
this.tx.commit();
}
/**
* 执行数据库回滚
* @throws Exception
*/
public void rollback() throws Exception{
this.tx.rollback();
}
/**
* 根据内存对象池分别进行不同的数据写入操作
* 并将内存对象池中的数据清空
* @throws Exception
*/
public void updateDB() throws Exception{
try{
for(Iterator it=deleteObjects.keySet().iterator();it.hasNext();){
String jboName = it.next();
ArrayList businessObjects = (ArrayList) deleteObjects.get(jboName);
BizObjectManager m = getBizObjectManager(jboName);
if(businessObjects != null)
{
for(BusinessObject businessobject:businessObjects){
if(businessobject.getState()==StateBizObject.STATE_NEW){
continue;
}
else m.deleteObject(businessobject);
}
}
}
deleteObjects.clear();
for(Iterator it=updateObjects.keySet().iterator();it.hasNext();){
String jboName = it.next();
ArrayList businessObjects = (ArrayList) updateObjects.get(jboName);
BizObjectManager m = getBizObjectManager(jboName);
if(businessObjects != null)
{
for(BusinessObject businessobject:businessObjects){
m.saveObject(businessobject);
}
}
}
updateObjects.clear();
this.bizObjectManagers.clear();
objectNumber=0;
}
catch(Exception e){
tx.rollback();
throw e;
}
}
public void updateBusinessObjects(List list,Object... parameters) throws Exception{
for(BusinessObject o:list){
for(int i=0;i0) insql=insql.substring(1);
jbosql = jbosql.replaceAll(":"+parameterName, insql);
}
i++;
}
BizObjectQuery query = manager.createQuery(jbosql);
for(int i=0;i