package com.hundsun.ares.studio.jres.basicdata.resources.providers;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EPackage;
import com.hundsun.ares.studio.core.IARESResource;
import com.hundsun.ares.studio.jres.basicdata.constant.IBasicDataEpacakgeConstant;
import com.hundsun.ares.studio.jres.basicdata.core.basicdata.MasterSlaveLinkTable;
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.core.basicdata.SingleTable;
import com.hundsun.ares.studio.jres.basicdata.logic.epackage.BasicDataEpackageFactory;
import com.hundsun.ares.studio.jres.basicdata.logic.util.BasicDataEpackageUtil;
import com.hundsun.ares.studio.jres.basicdata.logic.util.EPackageUtil;
import com.hundsun.ares.studio.jres.metadata.constant.IMetadataRefType;
import com.hundsun.ares.studio.model.reference.ReferenceFactory;
import com.hundsun.ares.studio.model.reference.RelationInfo;
import com.hundsun.ares.studio.reference.IRelationInfoProvider;
public class BasicDataRelationInfoProvider implements IRelationInfoProvider{
private static final Logger logger = Logger.getLogger(BasicDataRelationInfoProvider.class);
private String basicDataType = "";
private void addReferenceInfo(IARESResource resource,List<RelationInfo> infoList,EAttribute[] attrArray){
for(EAttribute attr:attrArray){
RelationInfo info = ReferenceFactory.eINSTANCE.createRelationInfo();
info.setHostResource(resource);
info.setUsedRefName(attr.getName());
info.setUsedRefType(IMetadataRefType.StdField);
// info.setUsedRefNamespace(value)
infoList.add(info);
}
}
@Override
public List<RelationInfo> getRelationInfos(IARESResource resource,
Map<Object, Object> context) {
List<RelationInfo> infoList = new ArrayList<RelationInfo>();
basicDataType = EPackageUtil.getBasicDataType(resource.getARESProject());
EPackage ePackage = null;
PackageDefine define = null;
try {
ePackage = BasicDataEpackageFactory.eINSTANCE.createEPackage(resource);
define = BasicDataEpackageFactory.eINSTANCE.getDefine(resource);
//�������ñ�
if(define instanceof SingleTable){
addTableReferenceInfo(resource,infoList,((SingleTable) define).getMaster());
}else if(define instanceof MasterSlaveTable){
addTableReferenceInfo(resource,infoList,((MasterSlaveTable) define).getMaster());
addTableReferenceInfo(resource,infoList,((MasterSlaveTable) define).getSlave());
}else if(define instanceof MasterSlaveLinkTable){
addTableReferenceInfo(resource,infoList,((MasterSlaveLinkTable) define).getMaster());
addTableReferenceInfo(resource,infoList,((MasterSlaveLinkTable) define).getSlave());
addTableReferenceInfo(resource,infoList,((MasterSlaveLinkTable) define).getLink());
}
if(BasicDataEpackageUtil.contains(ePackage, IBasicDataEpacakgeConstant.MasterItem)){
EClass master = (EClass)ePackage.getEClassifier(IBasicDataEpacakgeConstant.MasterItem);
EAttribute[] attrArray = BasicDataEpackageUtil.filterAttr(master);
addReferenceInfo(resource, infoList, attrArray);
}
if(BasicDataEpackageUtil.contains(ePackage, IBasicDataEpacakgeConstant.SlaveItem)){
EClass master = (EClass)ePackage.getEClassifier(IBasicDataEpacakgeConstant.SlaveItem);
EAttribute[] attrArray = BasicDataEpackageUtil.filterAttr(master);
addReferenceInfo(resource, infoList, attrArray);
}
if(BasicDataEpackageUtil.contains(ePackage, IBasicDataEpacakgeConstant.InfoItem)){
EClass master = (EClass)ePackage.getEClassifier(IBasicDataEpacakgeConstant.InfoItem);
EAttribute[] attrArray = BasicDataEpackageUtil.filterAttr(master);
addReferenceInfo(resource, infoList, attrArray);
}
} catch (Exception e) {
logger.error("��ȡ��������ʱ������EPackageʧ��", e);
}
return infoList;
}
/**
* @param resource
* @param infoList
* @param name
*/
private void addTableReferenceInfo(IARESResource resource,
List<RelationInfo> infoList, String name) {
RelationInfo info = ReferenceFactory.eINSTANCE.createRelationInfo();
info.setHostResource(resource);
info.setUsedRefName(name);
info.setUsedRefType(basicDataType);
infoList.add(info);
}
}