/** * <p>Copyright: Copyright (c) 2009</p> * <p>Company: �������ӹɷ����޹�˾</p> */ package com.hundsun.ares.studio.internal.ui.aresaction; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.log4j.Logger; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtensionRegistry; import org.eclipse.core.runtime.Platform; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; import com.hundsun.ares.studio.ui.ARESUI; import com.hundsun.ares.studio.ui.aresaction.IARESActionDescriptor; /** * ARES ����ע��� * @author sundl */ public class ARESActionRegistry { private static Logger logger = Logger.getLogger(ARESActionDescriptor.class.getName()); private static final String EXTENSION_POINT_ID = "aresaction"; private static ARESActionRegistry instance; // id --> declare private Map<String, AresActionDelareDescriptor> declaretioins = new HashMap<String, AresActionDelareDescriptor>(); // id --> implementations private Multimap<String, AresActionImplementationDescriptor> implementations = ArrayListMultimap.create(); // ares action id ---> descriptor private Multimap<String, IARESActionDescriptor> actions = ArrayListMultimap.create(); public static ARESActionRegistry getInstance() { if (instance == null) { instance = new ARESActionRegistry(); } return instance; } private ARESActionRegistry() { init(); } private void init() { IExtensionRegistry reg = Platform.getExtensionRegistry(); IConfigurationElement[] elements = reg.getConfigurationElementsFor(ARESUI.PLUGIN_ID, EXTENSION_POINT_ID); for (IConfigurationElement element : elements) { if (element.getName().equals("action_declare")) { AresActionDelareDescriptor descriptor = new AresActionDelareDescriptor(element); declaretioins.put(descriptor.getId(), descriptor); } else if (element.getName().equals("action_implementation")) { AresActionImplementationDescriptor descriptor = new AresActionImplementationDescriptor(element); implementations.put(descriptor.getId(), descriptor); } } } /** * ����ָ��id�IJ������� * @param id * @return */ public AresActionDelareDescriptor getActionDeclare(String id) { return declaretioins.get(id); } public Collection<AresActionDelareDescriptor> getActionDeclaretions() { return declaretioins.values(); } /** * ����ָ��id�IJ���ʵ�� * @param id * @return */ public AresActionImplementationDescriptor[] getActionImplementations(String id) { Collection<AresActionImplementationDescriptor> results = implementations.get(id); return results.toArray(new AresActionImplementationDescriptor[0]); } /** * ����ָ���IJ������ָ������Դ���Ͷ���IJ���ʵ�� * @param id * @param resType * @return */ public AresActionImplementationDescriptor getActionImplementation(String id, String resType) { for (AresActionImplementationDescriptor desc : getActionImplementations(id)) { if (desc.isMatch(resType)) { return desc; } } return null; } /** * ����ע��IJ���ID * @return */ public String[] getAllActionIds() { return declaretioins.keySet().toArray(new String[0]); } /** * ����ָ������Դ������ʵ������Щ���������ҷ�����Щ���������� * @param resTypes * @return */ public List<AresActionDelareDescriptor> computeActionDeclaretions(String[] resTypes) { List<AresActionDelareDescriptor> results = new ArrayList<AresActionDelareDescriptor>(); for (AresActionDelareDescriptor declare : declaretioins.values()) { for (String resType : resTypes) { AresActionImplementationDescriptor implementation = getActionImplementation(declare.getId(), resType); if (implementation != null) { results.add(declare); break; } } } return results; } /** * �������֧�ֵ���Դ���ͣ�������ʵ��֧������Щ��Դ���ͣ� * @param actionId * @return */ public String[] computeSupportedResTypes(String actionId) { Set<String> resTypes = new HashSet<String>(); AresActionImplementationDescriptor[] implementations = getActionImplementations(actionId); for (AresActionImplementationDescriptor impl : implementations) { resTypes.addAll(Arrays.asList(impl.getResTypes())); } return resTypes.toArray(new String[0]); } }