package com.hundsun.ares.studio.jres.basicdata.logic.epackage; import java.util.HashMap; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EFactory; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EcoreFactory; import org.eclipse.emf.ecore.EcorePackage; import com.hundsun.ares.studio.core.IARESBundle; import com.hundsun.ares.studio.core.IARESProject; import com.hundsun.ares.studio.core.IARESResource; import com.hundsun.ares.studio.jres.basicdata.constant.IBasicDataEpacakgeConstant; import com.hundsun.ares.studio.jres.basicdata.constant.IBasicDataRestypes; import com.hundsun.ares.studio.jres.basicdata.core.basicdata.EpacakgeDefineList; import com.hundsun.ares.studio.jres.basicdata.core.basicdata.PackageDefine; import com.hundsun.ares.studio.jres.basicdata.logic.epackage.extensionpoint.EpackageFactoryManager; public class BasicDataEpackageFactory { private final static Map<IARESResource, EPackage> epackageMap = new HashMap<IARESResource, EPackage>(); private final static Map<IARESBundle, IARESResource> defineMap = new HashMap<IARESBundle, IARESResource>(); public static BasicDataEpackageFactory eINSTANCE = new BasicDataEpackageFactory(); /* * Instantiate EcoreFactory */ EcoreFactory theCoreFactory = EcoreFactory.eINSTANCE; /* * Instantiate EcorePackage */ EcorePackage theCorePackage = EcorePackage.eINSTANCE; public EPackage createEPackage(IARESResource resource)throws Exception{ if( null != resource.getLib()){ //TODO ������Դ���е���Դ�Ĵ��� return null; } if(!epackageMap.containsKey(resource)){ PackageDefine tableDefine = getDefine(resource); epackageMap.put(resource, createEPackage(resource.getARESProject(), tableDefine)); } return epackageMap.get(resource); } /** * ��ȡ���� * @param resource * @return * @throws Exception */ public PackageDefine getDefine(IARESResource resource)throws Exception{ String resourctUrl = resource.getResource().getProjectRelativePath().toOSString(); //��ȡ������Դ IARESProject project = resource.getARESProject(); if(!defineMap.containsKey(project)){ IARESResource[] resources = project.getResources(IBasicDataRestypes.PackageDefineResorceName); if(0 == resources.length){ throw new Exception("û���ҵ��������Ϣ��"); } defineMap.put(project, resources[0]); } IARESResource defineResource = defineMap.get(project); EpacakgeDefineList defineList = defineResource.getInfo(EpacakgeDefineList.class); if(null == defineList){ throw new Exception("�������Ϣģ�ͼ���ʧ�ܡ�"); } PackageDefine tableDefine = null; for(PackageDefine defineItem:defineList.getItems()){ if(StringUtils.equals(defineItem.getUrl(), resourctUrl)){ tableDefine = defineItem; } } if(null == tableDefine){ throw new Exception("û���ڱ������Ϣ���ҵ�����Դ�Ķ��塣"); } return tableDefine; } /** * ���EPackage���� * @param resource */ public void clearEPackage(IARESResource resource){ epackageMap.remove(resource); try { resource.close(); } catch (Exception e) { } } /** * ����Epackage * @param project * @param tableDefine * @return * @throws Exception */ public EPackage createEPackage(IARESProject project,PackageDefine tableDefine)throws Exception{ IBaiscDataEpackageFactory factory = EpackageFactoryManager.getInstance().getFactory(tableDefine.getType()); return factory.createEPackage(project, tableDefine); } /** * ��������ʵ�� * @param project * @param tableDefine * @return * @throws Exception */ public EObject createInstance(IARESProject project,PackageDefine tableDefine)throws Exception{ EPackage tempEPackage = createEPackage(project,tableDefine); // EFactory tempFactoryInstance = tempEPackage.getEFactoryInstance(); // return tempFactoryInstance.create((EClass)tempEPackage // .getEClassifier(IBasicDataEpacakgeConstant.ResourceRoot)); return createInstance(tempEPackage); } /** * ��������ʵ�� * @param tempEPackage * @return * @throws Exception */ public EObject createInstance(EPackage tempEPackage)throws Exception{ EFactory tempFactoryInstance = tempEPackage.getEFactoryInstance(); return tempFactoryInstance.create((EClass)tempEPackage .getEClassifier(IBasicDataEpacakgeConstant.ResourceRoot)); } }