/** * */ package com.topsun.posclient.application; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtension; import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.Platform; public class ContributionItemsRegistry { // private static final Logger logger = SystemLogFactory.getLogger(ContributionItemsRegistry.class); private static ContributionItemsRegistry instance = null; public static ContributionItemsRegistry getInstance() { if (instance == null) { synchronized (ContributionItemsRegistry.class) { if (instance == null) { instance = new ContributionItemsRegistry(); } } } return instance; } private List<ContributionItemDescriptor> descriptorList = new ArrayList<ContributionItemDescriptor>(); public ContributionItemsRegistry() { init(); } private void init() { ContributionItemCategoryDescriptor[] categorys = ContributionItemCategorysRegistry.getInstance().getDescriptors(); for (ContributionItemCategoryDescriptor category : categorys) { IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(category.getExtensionPointId()); IExtension[] extensions = extensionPoint.getExtensions(); for (IExtension extension : extensions) { IConfigurationElement[] elements = extension.getConfigurationElements(); descriptorList.addAll(load(elements, category.getId())); } } } private List<ContributionItemDescriptor> load(IConfigurationElement[] children, String category) { List<ContributionItemDescriptor> descriptors = new ArrayList<ContributionItemDescriptor>(children.length); for (IConfigurationElement element : children) { ContributionItemDescriptor descriptor = null; if ("actionItem".equals(element.getName())) { descriptor = new ContributionItemActionDescriptor(); } else if ("controlItem".equals(element.getName())) { descriptor = new ContributionItemControlDescriptor(); } if (descriptor != null) { try { descriptor.init(element); descriptor.setCategory(category); if (descriptors.contains(descriptor)) { throw new IllegalArgumentException("Duplicated '" + element.getName() + "' with id '" + descriptor.getId() + "' and category '" + descriptor.getCategory() + "'."); } descriptors.add(descriptor); } catch (Throwable e) { // logger.error(e); } } } return descriptors; } public ContributionItemDescriptor[] getDescriptors() { sortDescriptorList(descriptorList); return descriptorList.toArray(new ContributionItemDescriptor[descriptorList.size()]); } private void sortDescriptorList(List<ContributionItemDescriptor> descriptorList) { Collections.sort(descriptorList, new Comparator<ContributionItemDescriptor>() { public int compare(ContributionItemDescriptor o1, ContributionItemDescriptor o2) { if (o1 == null) { return -1; } if (o2 == null) { return 1; } return o1.getIndex() - o2.getIndex(); } }); } }