/**
* Դ�������ƣ�ExtensibleModelManager.java
* �������Ȩ���������ӹɷ�����˾ ��Ȩ����
* ϵͳ���ƣ�JRES Studio
* ģ�����ƣ�com.hundsun.ares.studio.core
* ����˵����$desc
* ����ĵ���
* ���ߣ�sundl
*/
package com.hundsun.ares.studio.core.model;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EPackage;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
import com.hundsun.ares.studio.core.ARESCore;
import com.hundsun.ares.studio.core.IARESElement;
import com.hundsun.ares.studio.core.model.extend.IBasicExtendPropertyDescriptor;
import com.hundsun.ares.studio.core.model.extend.IExtendedPropertyProvider;
import com.hundsun.ares.studio.core.model.extend.IExtendedPropertyProvider2;
/**
* ��չģ����ص�
* @author sundl
*/
public class ExtendPropertyManager {
private static final Logger logger = Logger.getLogger(ExtendPropertyManager.class);
public List<IBasicExtendPropertyDescriptor> getExtensibleProperties(EClass eClass) {
List<IBasicExtendPropertyDescriptor> result = new ArrayList<IBasicExtendPropertyDescriptor>();
return result;
}
private final static String EP_NAME = "extendPropertyProvider";
private final static String EP_ATTRIBUTE_ID = "id";
private final static String EP_ATTRIBUTE_Uri = "uri";
private final static String EP_ATTRIBUTE_EClass = "eClass";
private final static String EP_ATTRIBUTE_Order = "order";
private final static String EP_ATTRIBUTE_Class = "class";
// EClass �� Provider��Map
private Multimap<EClass, IExtendedPropertyProvider> providerMap = ArrayListMultimap.create();
// ʵ��Provider2�ӿڵģ�һ�㲻ָ��EClass���Ե�������
private List<IExtendedPropertyProvider2> provider2List = new ArrayList<IExtendedPropertyProvider2>();
private static ExtendPropertyManager INSTANCE;
public static ExtendPropertyManager getInstance() {
if (INSTANCE == null)
INSTANCE = new ExtendPropertyManager();
return INSTANCE;
}
private ExtendPropertyManager() {
loadExtensionPoints();
}
private void loadExtensionPoints() {
logger.info("��ʼ������չģ�ͱ༭֧����չ��");
IExtensionRegistry reg = Platform.getExtensionRegistry();
IConfigurationElement[] elements = reg.getConfigurationElementsFor(ARESCore.PLUGIN_ID , EP_NAME);
for (IConfigurationElement element : elements) {
try {
String id = element.getAttribute(EP_ATTRIBUTE_ID);
String uri = element.getAttribute(EP_ATTRIBUTE_Uri);
String eclass = element.getAttribute(EP_ATTRIBUTE_EClass);
//d.order = NumberUtils.toInt(element.getAttribute(EP_ATTRIBUTE_Order), Integer.MAX_VALUE);
//d.editingSupport = (IExtensibleModelEditingSupport) element.createExecutableExtension(EP_ATTRIBUTE_Class);
IExtendedPropertyProvider obj = (IExtendedPropertyProvider) element.createExecutableExtension(EP_ATTRIBUTE_Class);
if (StringUtils.isEmpty(uri) || StringUtils.isEmpty(eclass)) {
if (obj instanceof IExtendedPropertyProvider2) {
provider2List.add((IExtendedPropertyProvider2) obj);
continue;
} else {
logger.warn(String.format("��չģ��ע��URI��EClass��дΪ�գ����ڲ��:%s, ID:%s", element.getContributor().getName(), id));
break;
}
}
EPackage ePackage = EPackage.Registry.INSTANCE.getEPackage(uri);
if (ePackage == null) {
logger.warn(String.format("���%sע����չ��%s, �Ҳ�����д��uri��%s", element.getContributor().getName(), id, uri));
}
EClass eClass = (EClass) ePackage.getEClassifier(eclass);
providerMap.put(eClass, (IExtendedPropertyProvider) obj);
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
logger.info("����������չģ�ͱ༭֧����չ��");
}
public List<IBasicExtendPropertyDescriptor> getExtendedProperties(IARESElement element, EClass eclass) {
List<IBasicExtendPropertyDescriptor> result = new ArrayList<IBasicExtendPropertyDescriptor>();
for (IExtendedPropertyProvider provider : providerMap.get(eclass)) {
if (provider.isEnabled(element, eclass)) {
result.addAll(Arrays.asList(provider.getExtendProperties()));
}
}
for (IExtendedPropertyProvider2 provider : provider2List) {
result.addAll(Arrays.asList(provider.getExtendProperties(element, eclass)));
}
return result;
}
}