package com.hundsun.ares.studio.jres.basicdata.database.factory;
import java.util.LinkedHashMap;
import java.util.Map;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EPackage;
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.MasterSlaveTable;
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 MasterSlaveEPackageFactory extends BaseEPackageFactory{
public static MasterSlaveEPackageFactory eInstance = new MasterSlaveEPackageFactory();
public EPackage create(IARESProject project,PackageDefine define)throws Exception{
if(define instanceof MasterSlaveTable){
MasterSlaveTable defineData = (MasterSlaveTable)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 slvaeTableName = defineData.getSlave();
TableResourceData slaveTable = JRESResProviderUtil.getResourceModel(project,
slvaeTableName,
IDatabaseRefType.Table,
TableResourceData.class);
if(null == slaveTable){
throw new Exception(String.format("����Դ[%s]�����ڡ�", slvaeTableName));
}
//�ӱ���Դ
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());
slaveBasicDataFields.put(item.getFieldName(),basicDataField);
basicDataField.setChineseName(item.getChineseName());
}
//�����ֶ�
String[] linkFields = DataBaseEPackageUtil.getLinkFields(masterTable,
slaveTable ,"����[%s]�е������ֶ�[%s]�ڹ�����[%s]�в����ڡ�");
//�ӱ���ȥ�������ֶ�
for(String item:linkFields){
slaveBasicDataFields.remove(item);
}
if(slaveBasicDataFields.isEmpty()){
throw new Exception(String.format("�ӱ�[%s]�ֶ���Ϊ0��", slvaeTableName));
}
EPackage ePackage = theCoreFactory.createEPackage();
ePackage.setName("MasterSlaveTablePackage");
ePackage.setNsPrefix("masterSlaveTable");
ePackage.setNsURI("http://www.hundsun.com/masterslavetable");
EClass rootClass = addResourceRoot(ePackage);
EClass masterClass = addMasterItem(ePackage,
IBasicDataEpacakgeConstant.MasterItem,
masterBasicDataFields);
EClass slaveClass = addEclass(ePackage,IBasicDataEpacakgeConstant.SlaveItem, slaveBasicDataFields);
slaveClass.getESuperTypes().add(BasicdataPackage.Literals.BASICDATA_ITEM);//�̳�BasicdataItem
//���ע��
BasicDataEpackageUtil.addMasterKeyAnnotation(masterClass, linkFields);
addReference( masterClass, slaveClass, IBasicDataEpacakgeConstant.Attr_Slave_Items);
return ePackage;
}
return null;
}
}