package org.nightlabs.jfire.reporting.ui.layout.scheduled.delivery; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtension; import org.nightlabs.eclipse.extension.AbstractEPProcessor; import org.nightlabs.eclipse.extension.EPProcessorException; import org.nightlabs.jfire.reporting.scheduled.IScheduledReportDeliveryDelegate; import org.nightlabs.jfire.reporting.ui.ReportingPlugin; /** * @author Alexander Bieber <!-- alex [AT] nightlabs [DOT] de --> * */ public class ScheduledReportDeliveryDelegateEditRegistry extends AbstractEPProcessor { public static final String EXTENSION_POINT_ID = ReportingPlugin.class.getPackage().getName() + ".scheduledReportDeliveryDelegateEdit"; /** * Map to hold all contributions. The key is the id of the factory (usually the class name of * the implementaion of {@link IScheduledReportDeliveryDelegate}, value is the contributed * factory */ private Map<String, IScheduledReportDeliveryDelegateEditFactory> factories = new HashMap<String, IScheduledReportDeliveryDelegateEditFactory>(); /** * Creates a new {@link ScheduledReportDeliveryDelegateEditRegistry}. Usually the * {@link #sharedInstance()} should be used. */ protected ScheduledReportDeliveryDelegateEditRegistry() { } /* (non-Javadoc) * @see org.nightlabs.base.ui.extensionpoint.AbstractEPProcessor#getExtensionPointID() */ @Override public String getExtensionPointID() { return EXTENSION_POINT_ID; } /* (non-Javadoc) * @see org.nightlabs.base.ui.extensionpoint.AbstractEPProcessor#processElement(org.eclipse.core.runtime.IExtension, org.eclipse.core.runtime.IConfigurationElement) */ @Override public void processElement(IExtension extension, IConfigurationElement element) throws Exception { if ("scheduledReportDeliveryDelegateEditFactory".equalsIgnoreCase(element.getName())) { String id = element.getAttribute("id"); if (id == null || id.isEmpty()) { throw new EPProcessorException("Attribute id must be defined", extension); } IScheduledReportDeliveryDelegateEditFactory factory = (IScheduledReportDeliveryDelegateEditFactory) element .createExecutableExtension("class"); factories.put(id, factory); } } public Collection<IScheduledReportDeliveryDelegateEditFactory> getFactories() { checkProcessing(); return Collections.unmodifiableCollection(factories.values()); } public IScheduledReportDeliveryDelegateEditFactory getFactory(String id) { checkProcessing(); return factories.get(id); } /** Static shared instance of ScheduledReportDeliveryDelegateEditRegistry */ private static ScheduledReportDeliveryDelegateEditRegistry sharedInstance; /** * @return The (lazily created) singleton of {@link ScheduledReportDeliveryDelegateEditRegistry}. */ public static ScheduledReportDeliveryDelegateEditRegistry sharedInstance() { if (sharedInstance == null) { synchronized (ScheduledReportDeliveryDelegateEditRegistry.class) { if (sharedInstance == null) { sharedInstance = new ScheduledReportDeliveryDelegateEditRegistry(); } } } return sharedInstance; } }