blob: 269437354aec02db3d7a1e91133c316b57d78968 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2008 Oracle. All rights reserved. This
* program and the accompanying materials are made available under the terms of
* the Eclipse Public License v1.0 which accompanies this distribution, and is
* available at http://www.eclipse.org/legal/epl-v10.html
*
* Contributors: Oracle. - initial API and implementation
*******************************************************************************/
package org.eclipse.jpt.ui.internal.platform;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jpt.ui.JpaPlatformUi;
import org.eclipse.jpt.ui.JptUiPlugin;
import org.eclipse.jpt.utility.internal.CollectionTools;
import org.eclipse.jpt.utility.internal.iterators.CompositeIterator;
import org.eclipse.jpt.utility.internal.iterators.TransformationIterator;
public class JpaPlatformUiRegistry
{
// singleton
private static final JpaPlatformUiRegistry INSTANCE = new JpaPlatformUiRegistry();
/**
* Return the singleton.
*/
public static JpaPlatformUiRegistry instance() {
return INSTANCE;
}
private static final String EXTENSION_ID =
"jpaPlatform"; //$NON-NLS-1$
private static final String EL_PLATFORM =
"jpaPlatform"; //$NON-NLS-1$
private static final String AT_ID =
"id"; //$NON-NLS-1$
private static final String AT_CLASS =
"class"; //$NON-NLS-1$
// key: String jpaPlatform id value: IConfigurationElement class descriptor
private Map<String, IConfigurationElement> jpaPlatforms;
/* (non Java doc)
* restrict access
*/
private JpaPlatformUiRegistry() {
buildJpaPlatforms();
}
private void buildJpaPlatforms() {
this.jpaPlatforms = new HashMap<String, IConfigurationElement>();
for (Iterator<IConfigurationElement> stream = allConfigElements(); stream.hasNext(); ) {
buildJpaPlatform(stream.next());
}
}
private void buildJpaPlatform(IConfigurationElement configElement) {
if (! configElement.getName().equals(EL_PLATFORM)) {
return;
}
String platformId = configElement.getAttribute(AT_ID);
String platformClass = configElement.getAttribute(AT_CLASS);
if ((platformId == null) || (platformClass == null)) {
if (platformId == null) {
reportMissingAttribute(configElement, AT_ID);
}
if (platformClass == null) {
reportMissingAttribute(configElement, AT_CLASS);
}
return;
}
if (this.jpaPlatforms.containsKey(platformId)) {
IConfigurationElement otherConfigElement = this.jpaPlatforms.get(platformId);
reportDuplicatePlatform(configElement, otherConfigElement);
}
this.jpaPlatforms.put(platformId, configElement);
}
public JpaPlatformUi jpaPlatform(String platformId) {
IConfigurationElement registeredConfigElement = this.jpaPlatforms.get(platformId);
if (registeredConfigElement == null) {
return null;
}
try {
return (JpaPlatformUi) registeredConfigElement.createExecutableExtension(AT_CLASS);
}
catch (CoreException ce) {
reportFailedInstantiation(registeredConfigElement);
return null;
}
}
private Iterator<IConfigurationElement> allConfigElements() {
IExtensionRegistry registry = Platform.getExtensionRegistry();
IExtensionPoint extensionPoint =
registry.getExtensionPoint(JptUiPlugin.PLUGIN_ID, EXTENSION_ID);
IExtension[] extensions = extensionPoint.getExtensions();
return new CompositeIterator<IConfigurationElement>(
new TransformationIterator<IExtension, Iterator<IConfigurationElement>>(CollectionTools.iterator(extensions)) {
@Override
protected Iterator<IConfigurationElement> transform(IExtension extension) {
return CollectionTools.iterator(extension.getConfigurationElements());
}
}
);
}
// TODO externalize strings
private void reportMissingAttribute(IConfigurationElement configElement, String attributeName) {
String message =
"An extension element \""
+ configElement.getName()
+ "\" in plugin \""
+ configElement.getContributor().getName()
+ "\" is missing a required attribute \""
+ attributeName
+ "\".";
JptUiPlugin.log(message);
}
// TODO externalize strings
private void reportDuplicatePlatform(
IConfigurationElement oneConfigElement, IConfigurationElement otherConfigElement) {
String message =
"The plugins \""
+ oneConfigElement.getContributor().getName()
+ "\" and \""
+ otherConfigElement.getContributor().getName()
+ "\" have registered a duplicate attribute \"id\" "
+ "for the extension element \"jpaPlatform\".";
JptUiPlugin.log(message);
}
// TODO externalize strings
private void reportFailedInstantiation(IConfigurationElement configElement) {
String message =
"Could not instantiate the class \""
+ configElement.getAttribute(AT_CLASS)
+ "\" for the extension element \""
+ configElement.getName()
+ "\" in the plugin \""
+ configElement.getContributor().getName()
+ "\".";
JptUiPlugin.log(message);
}
}