/**
* Դ�������ƣ�ExtensibleModelManager.java
* �������Ȩ���������ӹɷ�����˾ ��Ȩ����
* ϵͳ���ƣ�JRES Studio
* ģ�����ƣ�com.hundsun.ares.studio.jres.ui
* ����˵����$desc
* ����ĵ���
* ���ߣ���Ҷ��
*/
package com.hundsun.ares.studio.ui.editor.extend;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import org.apache.commons.lang.math.NumberUtils;
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.HashMultimap;
import com.google.common.collect.Multimap;
import com.hundsun.ares.studio.ui.editor.ARESEditorPlugin;
/**
* @author gongyf
*
*/
public class ExtensibleModelManager {
private final static String EP_NAME = "ExtensibleModelEditingSupports";
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";
private final static IExtensibleModelEditingSupport[] EMPTY = new IExtensibleModelEditingSupport[0];
private static class EditingSupportDescription implements Comparable<EditingSupportDescription>{
public String id;
public String uri;
public String eclass;
public int order;
public IExtensibleModelEditingSupport editingSupport;
/* (non-Javadoc)
* @see java.lang.Comparable#compareTo(java.lang.Object)
*/
@Override
public int compareTo(EditingSupportDescription o) {
return order - o.order;
}
}
private ExtensibleModelManager() {
loadEditingSupports();
}
private static ExtensibleModelManager instance;
public static ExtensibleModelManager getInstance() {
if (instance == null) {
instance = new ExtensibleModelManager();
}
return instance;
}
private Logger logger = Logger.getLogger(getClass());
/**
* �����˶�����չidӵ�е���չ�༭֧���б�
*/
private Multimap<EClass, EditingSupportDescription> editingSupportMap = HashMultimap.create();
private void loadEditingSupports() {
logger.info("��ʼ������չģ�ͱ༭֧����չ��");
IExtensionRegistry reg = Platform.getExtensionRegistry();
IConfigurationElement[] elements = reg.getConfigurationElementsFor(ARESEditorPlugin.PLUGIN_ID , EP_NAME);
for (IConfigurationElement element : elements) {
try {
EditingSupportDescription d = new EditingSupportDescription();
d.id = element.getAttribute(EP_ATTRIBUTE_ID);
d.uri = element.getAttribute(EP_ATTRIBUTE_Uri);
d.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);
EPackage ePackage = EPackage.Registry.INSTANCE.getEPackage(d.uri);
if (ePackage == null) {
logger.warn(String.format("���%sע����չ��%s, �Ҳ�����д��uri��%s", element.getContributor().getName(), d.id, d.uri));
}
EClass eClass = (EClass) ePackage.getEClassifier(d.eclass);
editingSupportMap.put(eClass, d);
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
}
logger.info("����������չģ�ͱ༭֧����չ��");
}
/**
* ��ȡָ����չģ��id����չ�༭֧��
* @param modelId
* @return
*/
public IExtensibleModelEditingSupport[] getExtensibleModelEditingSupports(EClass eClass) {
Set<EditingSupportDescription> descriptionSet = new HashSet<EditingSupportDescription>();
// �Ӽ̳����������л������չ���ϲ���
for (EClass superType : eClass.getEAllSuperTypes()) {
descriptionSet.addAll(editingSupportMap.get(superType));
}
descriptionSet.addAll(editingSupportMap.get(eClass));
// ����
EditingSupportDescription[] descriptions = descriptionSet.toArray(new EditingSupportDescription[descriptionSet.size()]);
Arrays.sort(descriptions);
IExtensibleModelEditingSupport[] supports = new IExtensibleModelEditingSupport[descriptions.length];
for (int i = 0; i < supports.length; i++) {
supports[i] = descriptions[i].editingSupport;
}
return supports;
}
}