/**
* Դ�������ƣ�SubSystemMerge.java
* �������Ȩ���������ӹɷ�����˾ ��Ȩ����
* ϵͳ���ƣ�JRES Studio
* ģ�����ƣ�com.hundsun.ares.studio.jres.database.ui
* ����˵����$desc
* ����ĵ���
* ���ߣ�
*/
package com.hundsun.ares.studio.jres.database.pdm;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.eclipse.core.runtime.IProgressMonitor;
import com.hundsun.ares.studio.core.ARESModelException;
import com.hundsun.ares.studio.core.ConsoleHelper;
import com.hundsun.ares.studio.core.IARESProject;
import com.hundsun.ares.studio.core.IARESResource;
import com.hundsun.ares.studio.jres.database.constant.IDatabaseRefType;
import com.hundsun.ares.studio.jres.database.pdm.bean.PDMBusinessDataType;
import com.hundsun.ares.studio.jres.database.pdm.bean.PDMStandardField;
import com.hundsun.ares.studio.jres.database.pdm.bean.PDMTableResource;
import com.hundsun.ares.studio.jres.database.ui.DatabaseUI;
import com.hundsun.ares.studio.jres.database.ui.model.MergePojo;
import com.hundsun.ares.studio.jres.metadata.constant.IMetadataResType;
import com.hundsun.ares.studio.jres.model.database.TableColumn;
import com.hundsun.ares.studio.jres.model.database.TableResourceData;
import com.hundsun.ares.studio.jres.model.metadata.BusinessDataType;
import com.hundsun.ares.studio.jres.model.metadata.BusinessDataTypeList;
import com.hundsun.ares.studio.jres.model.metadata.StandardField;
import com.hundsun.ares.studio.jres.model.metadata.StandardFieldList;
import com.hundsun.ares.studio.jres.model.metadata.TypeDefaultValue;
import com.hundsun.ares.studio.jres.model.metadata.TypeDefaultValueList;
import com.hundsun.ares.studio.model.reference.ReferenceInfo;
import com.hundsun.ares.studio.reference.ReferenceManager;
/**
* @author liaogc
* ��ɸ�����ϵͳ�ϲ�,��Ҫ�漰ҵ���������ͺϲ�,���ֶκϲ�,���ݿ���ֶθ���,�Լ�����һ�ݴ�����ı��ֶα���
*/
public class PDMSubSystemMerge {
private IARESProject project;
private PDMSubSystemMergeHelper helper =null;
private String outFile = "";
static final Logger console = ConsoleHelper.getLogger();
public void subSystemMerge(Map<String ,MergePojo> pojoMap,IARESProject project,String targetDir,IProgressMonitor monitor, StringBuffer errorMsg) throws Exception {
this.project = project;
helper = new PDMSubSystemMergeHelper(this.project);
this.outFile = targetDir;
Collection<MergePojo> listInfo =pojoMap.values();
List<PDMBusinessDataType> allUniquePDMBusinessDataTypeList = mergeBusinessDataType(listInfo,monitor,errorMsg);//�ϲ�ҵ����������
helper.updateStandardFieldBusinessType(listInfo,allUniquePDMBusinessDataTypeList);
List<PDMStandardField> allUniqueStaneardFieldList = mergeStandardField(listInfo,monitor,errorMsg);//�ϲ����ֶ�
//helper.updatePDMSStandardFieldBusinessType(allUniqueStaneardFieldList,allUniquePDMBusinessDataTypeList);//����ҵ����������������Ҫ����Ӧ�ı��ֶζ�Ӧ��ҵ����������
Map<String ,List<PDMTableResource>> tableResourceMap =updateTable(allUniqueStaneardFieldList,monitor,errorMsg);//�ϲ����ݿ��
report(allUniqueStaneardFieldList,tableResourceMap,monitor,errorMsg);//����������ĺϲ��ı��ֶα���
}
/**
* �ϲ�ҵ����������
* @param listInfo
* @param monitor
* @param errorMsg
* @return
* @throws ARESModelException
*/
private List<PDMBusinessDataType> mergeBusinessDataType(Collection<MergePojo> listInfo,IProgressMonitor monitor,StringBuffer errorMsg) throws ARESModelException {
List<PDMBusinessDataType> allPDMBusinessDataTypeList = new ArrayList<PDMBusinessDataType>();
IARESResource businessDataTypeResource = project.findResource(IMetadataResType.BizType, IMetadataResType.BizType);
IARESResource resTDVType = project.findResource(IMetadataResType.DefValue, IMetadataResType.DefValue);
List<BusinessDataType> oldBusinessDataTypeList = new ArrayList<BusinessDataType>();
BusinessDataTypeList allBusinessDataTypeList=null;
if (businessDataTypeResource != null) {
allBusinessDataTypeList = businessDataTypeResource.getInfo(BusinessDataTypeList.class);
oldBusinessDataTypeList.addAll(allBusinessDataTypeList.getItems());
}
List<TypeDefaultValue> typeDefaultValueList = new ArrayList<TypeDefaultValue>();
if(resTDVType!=null){
typeDefaultValueList = resTDVType.getInfo(TypeDefaultValueList.class).getItems();
}
for(MergePojo mergePojo:listInfo){
//�Ѹ����̴�������BusinessDataTypeת����PDMBusinessDataType
List<PDMBusinessDataType> susSystemPDMBusinessDataTypeList=helper.analyseBusinessDataType(mergePojo.getBusTypes(),mergePojo.getStdFields(),mergePojo.getSubSyses());
allPDMBusinessDataTypeList.addAll(susSystemPDMBusinessDataTypeList);
}
List<PDMBusinessDataType> allUniquePDMBusinessDataTypeList = helper.mergeBusinessDataType(allPDMBusinessDataTypeList);
List<BusinessDataType> allUniqueBusinessDataTypeList = new ArrayList<BusinessDataType>();
for(PDMBusinessDataType pmdBusinessDataType:allUniquePDMBusinessDataTypeList){
BusinessDataType newBusinessDataType =helper.createBusinessDataType(pmdBusinessDataType);//�Ѻϲ��õ�PDMBusinessDataTypeת����BusinessDataType
int index = PDMHelper.indexOfBusinessDataType(oldBusinessDataTypeList, newBusinessDataType);
if(index==-1){
allUniqueBusinessDataTypeList.add(newBusinessDataType);
}
}
if (businessDataTypeResource != null) {
List<BusinessDataType> totalBusinessDataTypeList = new ArrayList<BusinessDataType>();
totalBusinessDataTypeList.addAll(allBusinessDataTypeList.getItems());
totalBusinessDataTypeList.addAll(allUniqueBusinessDataTypeList);
allBusinessDataTypeList.getItems().clear();
PDMHelper.associateDefaultValueByStdType(totalBusinessDataTypeList,typeDefaultValueList);
Collections.sort(totalBusinessDataTypeList,new NameSorter());
allBusinessDataTypeList.getItems().addAll(totalBusinessDataTypeList);
businessDataTypeResource.save(allBusinessDataTypeList, true, monitor);//����ϲ��õ�ҵ����������
}
return allUniquePDMBusinessDataTypeList;
}
/**
* ���غϲ��õ��ܵı��ֶ�
* @param listInfo
* @param monitor
* @param errorMsg
* @return
* @throws ARESModelException
*/
private List<PDMStandardField> mergeStandardField(Collection<MergePojo> listInfo,IProgressMonitor monitor,StringBuffer errorMsg) throws ARESModelException {
List<PDMStandardField> allPDMStaneardFieldList = new ArrayList<PDMStandardField>();
for(MergePojo mergePojo:listInfo){
//��ÿ����Ŀ�������ı��ֶ��б�ת����PDMStandard�б�
List<PDMStandardField> susSystemPDMStandardFieldList=helper.analyseStandardField(mergePojo.getStdFields(), mergePojo.getSubSyses());
allPDMStaneardFieldList.addAll(susSystemPDMStandardFieldList);
}
//�ϲ����ֶ�
List<PDMStandardField> allUniquePDMStandardFieldList =helper.mergeStandardField(allPDMStaneardFieldList);
List<StandardField> allUniqueStandardFieldList = new ArrayList<StandardField>();
for(PDMStandardField pmdStandardField:allUniquePDMStandardFieldList){
allUniqueStandardFieldList.add(helper.createStandardField(pmdStandardField));//��pmdStandardFieldת������Ӧ��StandardField
}
IARESResource standardFieldResource = project.findResource(IMetadataResType.StdField, IMetadataResType.StdField);
if (standardFieldResource != null) {
StandardFieldList allStandardFieldList = standardFieldResource.getInfo(StandardFieldList.class);
allStandardFieldList.getItems().clear();
Collections.sort(allUniqueStandardFieldList,new NameSorter());
allStandardFieldList.getItems().addAll(allUniqueStandardFieldList);
standardFieldResource.save(allStandardFieldList, true, monitor);//�����µĴ�����ı��ֶ�
}
return allUniquePDMStandardFieldList;
}
/**
* ���±��ֶ���ر�������
* @param allUniquePDMStandardFieldList
* @param monitor
* @param errorMsg
* @throws ARESModelException
*/
private Map<String ,List<PDMTableResource>> updateTable(List<PDMStandardField> allUniquePDMStandardFieldList ,IProgressMonitor monitor,StringBuffer errorMsg) throws ARESModelException {
List<ReferenceInfo> tabInfoList = ReferenceManager.getInstance().getReferenceInfos( project,IDatabaseRefType.Table, true) ;
Map<String,List<PDMStandardField>> pdmStaneardFieldMap = helper.getStandardFieldCategoryByTable(allUniquePDMStandardFieldList);//����Ϊ��λ���б��ֶη���
Map<String ,List<PDMTableResource>> tableResourceMap = PDMHelper.getTableResourceMap(tabInfoList);//����Ϊ��λ���з���
Set<String> tableNames = pdmStaneardFieldMap.keySet();
for(String tableName:tableNames){
if(StringUtils.isNotBlank(tableName)){
List<PDMStandardField> pdmtandardFieldList = pdmStaneardFieldMap.get(tableName);
List<PDMTableResource> pdmTableResources= tableResourceMap.get(tableName);//һ��ͬ������Դ���Դ��ڲ�ͬ����ϵͳ��
if(pdmTableResources!=null){
for(PDMTableResource pdmTableResource:pdmTableResources){//�Ա���ԴΪ��λ���и���
TableResourceData tableInfo = pdmTableResource.getTableInfo();
boolean isChanged = false;
for(PDMStandardField pdmStandardField:pdmtandardFieldList){
if(pdmTableResource!=null
&& pdmStandardField.getBolongSubSystemList().size()>0
&& StringUtils.isNotBlank(pdmTableResource.getSubSystem())
&& pdmStandardField.getBolongSubSystemList().contains(pdmTableResource.getSubSystem())){
if(StringUtils.equals(tableName, tableInfo.getName())){
for(TableColumn tableColumn:tableInfo.getColumns()){
if(StringUtils.equals(pdmStandardField.getOldName(), tableColumn.getName())){
String name = tableColumn.getName();
if(!StringUtils.equals(name, pdmStandardField.getGenName()) && StringUtils.isNotBlank(pdmStandardField.getGenName())){
tableColumn.setName(pdmStandardField.getGenName());
isChanged = true;
}
String changeStr = helper.getModifyInfo(pdmStandardField);
if(StringUtils.isNotBlank(changeStr)){
tableColumn.setComments(changeStr+"|"+StringUtils.defaultIfBlank(tableColumn.getComments(), ""));
isChanged = true;
}
break;
}
}
}
}
}
if(isChanged){
pdmTableResource.getResource().save(pdmTableResource.getTableInfo(), true, monitor);
}
}
}
}
}
return tableResourceMap;
}
/**
* �������ֶκϲ������¼
* @param pmdStandardFieldList
* @param monitor
* @param errorMsg
* @throws IllegalAccessException
* @throws InvocationTargetException
*/
private void report(List<PDMStandardField> pmdStandardFieldList,Map<String ,List<PDMTableResource>> tableResourceMap,IProgressMonitor monitor,StringBuffer errorMsg) throws IllegalAccessException, InvocationTargetException {
List<PDMStandardField> allPDMStandardFieldList = helper.getAllPDMStandardFieldList(pmdStandardFieldList,tableResourceMap);
InputStream input = null;
OutputStream output = null;
try {
input = DatabaseUI.getDefault().getBundle().getEntry("template/���ֶκϲ������¼.xls").openStream();
HSSFWorkbook wb = new HSSFWorkbook(input);
PDMExcelReaderWriter pdmWriter = new PDMExcelReaderWriter();
pdmWriter.standardFieldWriter(wb, allPDMStandardFieldList);
output = new FileOutputStream(outFile);
wb.write(output);
} catch (IOException e) {
console.info(e.getMessage());
}finally{
org.apache.commons.io.IOUtils.closeQuietly(input);
org.apache.commons.io.IOUtils.closeQuietly(output);
}
}
}