/**
*
*/
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();
}
});
}
}