/*
* Copyright (c) 2008 Stiftung Deutsches Elektronen-Synchrotron,
* Member of the Helmholtz Association, (DESY), HAMBURG, GERMANY.
*
* THIS SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "../AS IS" BASIS.
* WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
* TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR PARTICULAR PURPOSE AND
* NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
* FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
* THE USE OR OTHER DEALINGS IN THE SOFTWARE. SHOULD THE SOFTWARE PROVE DEFECTIVE
* IN ANY RESPECT, THE USER ASSUMES THE COST OF ANY NECESSARY SERVICING, REPAIR OR
* CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE.
* NO USE OF ANY SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
* DESY HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
* OR MODIFICATIONS.
* THE FULL LICENSE SPECIFYING FOR THE SOFTWARE THE REDISTRIBUTION, MODIFICATION,
* USAGE AND OTHER RIGHTS AND OBLIGATIONS IS INCLUDED WITH THE DISTRIBUTION OF THIS
* PROJECT IN THE FILE LICENSE.HTML. IF THE LICENSE IS NOT INCLUDED YOU MAY FIND A COPY
* AT HTTP://WWW.DESY.DE/LEGAL/LICENSE.HTM
*/
package org.csstudio.sds.ui.internal.feedback;
import java.util.HashMap;
import java.util.Map;
import org.csstudio.sds.ui.SdsUiPlugin;
import org.csstudio.sds.ui.feedback.IGraphicalFeedbackFactory;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Access service for contributions for the extension point
* <b>org.csstudio.sds.graphicalFeedbackFactories</b>.
*
* This service will only be used internally.
*
* @author Sven Wende
*
*/
public final class GraphicalFeedbackContributionsService {
private static final Logger LOG = LoggerFactory.getLogger(GraphicalFeedbackContributionsService.class);
/**
* The singleton instance.
*/
private static GraphicalFeedbackContributionsService _instance = null;
/**
* Contains descriptors for all contributions.
*/
private Map<String, GraphicalFeedbackContributionDescriptor> _descriptors;
/**
* Private constructor.
*/
private GraphicalFeedbackContributionsService() {
lookup();
}
/**
* Gets the singleton instance.
*
* @return the singleton instance
*/
public static GraphicalFeedbackContributionsService getInstance() {
if (_instance == null) {
_instance = new GraphicalFeedbackContributionsService();
}
return _instance;
}
/**
* Returns a graphical feedback factory for widget models of the specified
* type. If no special factory was contributed for this specific type, a
* default implementation is returned.
*
* @param typeId
* widget model type id
*
* @return a graphical feedback factory
*/
public IGraphicalFeedbackFactory getGraphicalFeedbackFactory(
final String typeId) {
IGraphicalFeedbackFactory factory = new DefaultFeedbackFactory();
if (_descriptors.containsKey(typeId)) {
factory = _descriptors.get(typeId).getGraphicalFeedbackFactory();
}
return factory;
}
/**
* Looks up the extension registry for contributions.
*/
private void lookup() {
_descriptors = new HashMap<String, GraphicalFeedbackContributionDescriptor>();
IExtensionRegistry extReg = Platform.getExtensionRegistry();
String id = SdsUiPlugin.EXTPOINT_GRAPHICAL_FEEDBACK_FACTORIES;
IConfigurationElement[] confElements = extReg
.getConfigurationElementsFor(id);
for (IConfigurationElement element : confElements) {
String typeId = element.getAttribute("typeId"); //$NON-NLS-1$
if (_descriptors.containsKey(typeId)) {
throw new IllegalArgumentException(
"Only one graphical feedback factory for the type >>" + typeId //$NON-NLS-1$
+ "<< should be registered."); //$NON-NLS-1$
}
if (typeId != null) {
_descriptors.put(typeId,
new GraphicalFeedbackContributionDescriptor(element));
}
}
}
/**
* This descriptor serves as a delegate to enable lazy loading of extension
* point implementations.
*
* @author Sven Wende
*/
class GraphicalFeedbackContributionDescriptor {
/**
* A configuration element.
*/
private final IConfigurationElement _configurationElement;
/**
* The grapical feedback factory. (Gets instantiated lazily and cached)!
*/
private IGraphicalFeedbackFactory _graphicalFeedbackFactory;
/**
* Constructor.
*
* @param configurationElement
* required
*/
public GraphicalFeedbackContributionDescriptor(
final IConfigurationElement configurationElement) {
assert configurationElement != null;
_configurationElement = configurationElement;
}
/**
*
* @return a new edit part
*/
public IGraphicalFeedbackFactory getGraphicalFeedbackFactory() {
if (_graphicalFeedbackFactory == null) {
try {
_graphicalFeedbackFactory = (IGraphicalFeedbackFactory) _configurationElement
.createExecutableExtension("class"); //$NON-NLS-1$
} catch (CoreException e) {
LOG.error(e.toString());
}
}
return _graphicalFeedbackFactory;
}
}
}