package com.hundsun.ares.studio.jres.basicdata.database.factory;
import java.util.LinkedHashMap;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import com.hundsun.ares.studio.core.IARESProject;
import com.hundsun.ares.studio.jres.basicdata.constant.IBasicDataEpacakgeConstant;
import com.hundsun.ares.studio.jres.basicdata.core.basicdata.BasicDataField;
import com.hundsun.ares.studio.jres.basicdata.core.basicdata.BasicdataFactory;
import com.hundsun.ares.studio.jres.basicdata.core.basicdata.BasicdataPackage;
import com.hundsun.ares.studio.jres.basicdata.core.basicdata.MasterSlaveLinkTable;
import com.hundsun.ares.studio.jres.basicdata.core.basicdata.PackageDefine;
import com.hundsun.ares.studio.jres.basicdata.logic.epackage.BaseEPackageFactory;
import com.hundsun.ares.studio.jres.basicdata.logic.util.BasicDataEpackageUtil;
import com.hundsun.ares.studio.jres.basicdata.logic.util.JRESResProviderUtil;
import com.hundsun.ares.studio.jres.database.constant.IDatabaseRefType;
import com.hundsun.ares.studio.jres.model.database.TableColumn;
import com.hundsun.ares.studio.jres.model.database.TableResourceData;
public class MasterSlavelinkEPackageFactory extends BaseEPackageFactory{
public static MasterSlavelinkEPackageFactory eInstance = new MasterSlavelinkEPackageFactory();
public EPackage create(IARESProject project,PackageDefine define)throws Exception{
if(define instanceof MasterSlaveLinkTable){
MasterSlaveLinkTable defineData = (MasterSlaveLinkTable)define;
//������Դ
String masterTableName = defineData.getMaster();
TableResourceData masterTable = JRESResProviderUtil.getResourceModel(project,
masterTableName,
IDatabaseRefType.Table,
TableResourceData.class);
if(null == masterTable){
throw new Exception(String.format("����Դ[%s]�����ڡ�", masterTableName));
}
//�����ֶ�
Map<String,BasicDataField> masterBasicDataFields = new LinkedHashMap<String,BasicDataField>();
for(TableColumn item:masterTable.getColumns()){
BasicDataField basicDataField = BasicdataFactory.eINSTANCE.createBasicDataField();
basicDataField.setName(item.getFieldName());
basicDataField.setDataType(item.getDataType());
basicDataField.setColumnType(item.getColumnType().getValue());
basicDataField.setChineseName(item.getChineseName());
masterBasicDataFields.put(item.getFieldName(),basicDataField);
}
//��Ϣ����Դ
String infoTableName = defineData.getLink();
TableResourceData infoTable = JRESResProviderUtil.getResourceModel(project,
infoTableName,
IDatabaseRefType.Table,
TableResourceData.class);
if(null == infoTable){
throw new Exception(String.format("����Դ[%s]�����ڡ�", infoTableName));
}
//��Ϣ���ֶ�
Map<String,BasicDataField> infoBasicDataFields = new LinkedHashMap<String,BasicDataField>();
for(TableColumn item:infoTable.getColumns()){
BasicDataField basicDataField = BasicdataFactory.eINSTANCE.createBasicDataField();
basicDataField.setName(item.getFieldName());
basicDataField.setDataType(item.getDataType());
basicDataField.setColumnType(item.getColumnType().getValue());
basicDataField.setChineseName(item.getChineseName());
infoBasicDataFields.put(item.getFieldName(),basicDataField);
}
//�ӱ���Դ
String slaveTableName = defineData.getSlave();
TableResourceData slaveTable = JRESResProviderUtil.getResourceModel(project,
slaveTableName,
IDatabaseRefType.Table,
TableResourceData.class);
if(null == slaveTable){
throw new Exception(String.format("����Դ[%s]�����ڡ�", slaveTableName));
}
//�ӱ����ֶ�
Map<String,BasicDataField> slaveBasicDataFields = new LinkedHashMap<String,BasicDataField>();
for(TableColumn item:slaveTable.getColumns()){
BasicDataField basicDataField = BasicdataFactory.eINSTANCE.createBasicDataField();
basicDataField.setName(item.getFieldName());
basicDataField.setDataType(item.getDataType());
basicDataField.setColumnType(item.getColumnType().getValue());
basicDataField.setChineseName(item.getChineseName());
slaveBasicDataFields.put(item.getFieldName(),basicDataField);
}
String[] masterLinkFields = DataBaseEPackageUtil.getLinkFields(masterTable,
slaveTable ,"����[%s]�е������ֶ�[%s]�ڹ�����[%s]�в����ڡ�");
String[] infoLinkLinkFields = DataBaseEPackageUtil.getLinkFields(infoTable,
slaveTable ,"��Ϣ��[%s]�е������ֶ�[%s]�ڹ�����[%s]�в����ڡ�");
for(String masterItem:masterLinkFields){
for(String infoItem:infoLinkLinkFields){
if(StringUtils.equals(masterItem, infoItem)){
throw new Exception(String.format("�������Ϣ�������ͬ�����ֶ�[%s]", masterItem));
}
}
}
//��������ȥ����������
for(String item:masterLinkFields){
slaveBasicDataFields.remove(item);
}
// if(infoList.isEmpty()){
// throw new Exception(String.format("��Ϣ��[%s]�ֶ���Ϊ0��", infoTableName));
// }
EPackage ePackage = theCoreFactory.createEPackage();
ePackage.setName("masterslabelinktablePackage");
ePackage.setNsPrefix("masterslabelinktable");
ePackage.setNsURI("http://www.hundsun.com/masterslabelinktable");
EClass rootClass = addResourceRoot(ePackage);
EClass masterClass = addMasterItem(ePackage,
IBasicDataEpacakgeConstant.MasterItem,
masterBasicDataFields);
EClass infoClass = addEclass(ePackage,
IBasicDataEpacakgeConstant.InfoItem,
infoBasicDataFields);
infoClass.getESuperTypes().add(BasicdataPackage.Literals.BASICDATA_ITEM);//�̳�BasicdataItem
EClass linkClass = addEclass(ePackage,
IBasicDataEpacakgeConstant.SlaveItem,
slaveBasicDataFields);
linkClass.getESuperTypes().add(BasicdataPackage.Literals.BASICDATA_ITEM);//�̳�BasicdataItem
//���ע��
BasicDataEpackageUtil.addMasterKeyAnnotation(masterClass, masterLinkFields);
BasicDataEpackageUtil.addMasterKeyAnnotation(infoClass, infoLinkLinkFields);
//�������
addReference( rootClass, infoClass, IBasicDataEpacakgeConstant.Attr_Info_Items);
addReference( masterClass, linkClass, IBasicDataEpacakgeConstant.Attr_Slave_Items);
addContentReference(linkClass,infoClass,IBasicDataEpacakgeConstant.Attr_Info_Content_Reference);
return ePackage;
}
return null;
}
protected void addContentReference(EClass master,
EClass slave,
String referenceName){
//��������
EReference itemReference = theCoreFactory.createEReference();
itemReference.setName(referenceName);
itemReference.setEType(slave);
itemReference.setUpperBound(1);
itemReference.setContainment(false);
itemReference.setTransient(true);
//�������
master.getEStructuralFeatures().add(itemReference);
}
}