blob: f00d045b297bfd16ac9b0f421f84c68d5775127c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2013 Oracle. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0, which accompanies this distribution
* and is available at https://www.eclipse.org/legal/epl-2.0/.
*
* Contributors:
* Oracle - initial API and implementation
******************************************************************************/
package org.eclipse.jpt.jpa.ui.internal.platform;
import java.util.ArrayList;
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.RegistryFactory;
import org.eclipse.jpt.common.core.JptCommonCoreMessages;
import org.eclipse.jpt.common.core.internal.utility.ExtensionPointTools;
import org.eclipse.jpt.common.utility.internal.ObjectTools;
import org.eclipse.jpt.common.utility.internal.StringTools;
import org.eclipse.jpt.jpa.core.JpaPlatform;
import org.eclipse.jpt.jpa.core.JpaWorkspace;
import org.eclipse.jpt.jpa.core.platform.JpaPlatformManager;
import org.eclipse.jpt.jpa.ui.JpaPlatformUi;
import org.eclipse.jpt.jpa.ui.JpaPlatformUiManager;
import org.eclipse.jpt.jpa.ui.JptJpaUiMessages;
import org.eclipse.jpt.jpa.ui.internal.InternalJpaWorkbench;
import org.eclipse.jpt.jpa.ui.internal.plugin.JptJpaUiPlugin;
/**
* JPA platform UI manager.
*/
public class InternalJpaPlatformUiManager
implements JpaPlatformUiManager
{
/**
* The JPA platform UI manager's Dali JPA workbench.
*/
private final InternalJpaWorkbench jpaWorkbench;
/**
* The JPA platform UI configs.
* Initialized during construction.
*/
private final ArrayList<JpaPlatformUiConfig> jpaPlatformUiConfigs = new ArrayList<JpaPlatformUiConfig>();
// ********** extension point element and attribute names **********
private static final String SIMPLE_EXTENSION_POINT_NAME = "jpaPlatformUis"; //$NON-NLS-1$
private static final String JPA_PLATFORM_UI_ELEMENT = "jpaPlatformUi"; //$NON-NLS-1$
private static final String ID_ATTRIBUTE = "id"; //$NON-NLS-1$
private static final String FACTORY_CLASS_ATTRIBUTE = "factoryClass"; //$NON-NLS-1$
private static final String JPA_PLATFORM_ATTRIBUTE = "jpaPlatform"; //$NON-NLS-1$
/**
* Internal - called from only
* {@link InternalJpaWorkbench#buildJpaPlatformUiManager()}.
*/
public InternalJpaPlatformUiManager(InternalJpaWorkbench jpaWorkbench) {
super();
this.jpaWorkbench = jpaWorkbench;
this.initialize();
}
// ********** initialization **********
private void initialize() {
IExtensionPoint extensionPoint = this.getExtensionPoint();
if (extensionPoint == null) {
throw new IllegalStateException("missing extension point: " + this.getExtensionPointName()); //$NON-NLS-1$
}
for (IExtension extension : extensionPoint.getExtensions()) {
for (IConfigurationElement element : extension.getConfigurationElements()) {
String elementName = element.getName(); // probably cannot be null
if (elementName.equals(JPA_PLATFORM_UI_ELEMENT)) {
JpaPlatformUiConfig config = this.buildJpaPlatformUiConfig(element);
if (config != null) {
this.jpaPlatformUiConfigs.add(config);
}
}
}
}
}
/**
* Return <code>null</code> if there is any sort of problem building a
* JPA platform UI config from the specified configuration element.
*/
private JpaPlatformUiConfig buildJpaPlatformUiConfig(IConfigurationElement element) {
String contributor = element.getContributor().getName();
// id
String id = element.getAttribute(ID_ATTRIBUTE);
if (StringTools.isBlank(id)) {
this.logMissingAttribute(element, ID_ATTRIBUTE);
return null;
}
if (this.containsJpaPlatformUiConfig(id)) {
this.logError(JptCommonCoreMessages.REGISTRY_DUPLICATE, this.getExtensionPointName(), contributor, ID_ATTRIBUTE, id);
return null; // drop any duplicate JPA platform UIs
}
// factory class name
String factoryClassName = element.getAttribute(FACTORY_CLASS_ATTRIBUTE);
if (factoryClassName == null) {
this.logMissingAttribute(element, FACTORY_CLASS_ATTRIBUTE);
return null;
}
// JPA platform ID
String jpaPlatformID = element.getAttribute(JPA_PLATFORM_ATTRIBUTE);
if (jpaPlatformID == null) {
this.logMissingAttribute(element, JPA_PLATFORM_ATTRIBUTE);
return null;
}
if (this.containsJpaPlatformUiConfigForJpaPlatform(jpaPlatformID)) {
this.logError(JptCommonCoreMessages.REGISTRY_DUPLICATE, this.getExtensionPointName(), contributor, JPA_PLATFORM_ATTRIBUTE, jpaPlatformID);
return null; // drop any duplicate JPA platform UIs
}
if (this.jpaPlatformConfigIsMissing(jpaPlatformID)) {
this.logMissingJpaPlatform(element, jpaPlatformID);
return null;
}
JpaPlatformUiConfig config = new JpaPlatformUiConfig(this, id, factoryClassName, jpaPlatformID);
config.setPluginID(contributor);
return config;
}
// ********** JPA platform UIs **********
public JpaPlatformUi getJpaPlatformUi(JpaPlatform jpaPlatform) {
JpaPlatformUiConfig config = this.getJpaPlatformUiConfigForJpaPlatform(jpaPlatform.getId());
return (config == null) ? null : config.getJpaPlatformUi();
}
private boolean containsJpaPlatformUiConfig(String id) {
return this.getJpaPlatformUiConfig(id) != null;
}
private JpaPlatformUiConfig getJpaPlatformUiConfig(String id) {
for (JpaPlatformUiConfig config : this.jpaPlatformUiConfigs) {
if (config.getID().equals(id)) {
return config;
}
}
return null;
}
private boolean containsJpaPlatformUiConfigForJpaPlatform(String jpaPlatformID) {
return this.getJpaPlatformUiConfigForJpaPlatform(jpaPlatformID) != null;
}
private JpaPlatformUiConfig getJpaPlatformUiConfigForJpaPlatform(String jpaPlatformID) {
for (JpaPlatformUiConfig config : this.jpaPlatformUiConfigs) {
if (config.getJpaPlatformID().equals(jpaPlatformID)) {
return config;
}
}
return null;
}
// ********** logging **********
private void logMissingJpaPlatform(IConfigurationElement element, String jpaPlatformID) {
this.logError(JptJpaUiMessages.JPA_PLATFORM_UI_MISSING_JPA_PLATFORM,
jpaPlatformID,
element.getDeclaringExtension().getExtensionPointUniqueIdentifier(),
element.getContributor().getName()
);
}
private void logError(String msg, Object... args) {
this.getPlugin().logError(msg, args);
}
private void logMissingAttribute(IConfigurationElement element, String attributeName) {
this.getPlugin().logError(ExtensionPointTools.buildMissingAttributeMessage(element, attributeName));
}
// ********** misc **********
public InternalJpaWorkbench getJpaWorkbench() {
return this.jpaWorkbench;
}
String getExtensionPointName() {
return this.getPluginID() + '.' + SIMPLE_EXTENSION_POINT_NAME;
}
private IExtensionPoint getExtensionPoint() {
return this.getExtensionRegistry().getExtensionPoint(this.getPluginID(), SIMPLE_EXTENSION_POINT_NAME);
}
private IExtensionRegistry getExtensionRegistry() {
return RegistryFactory.getRegistry();
}
private String getPluginID() {
return this.getPlugin().getPluginID();
}
private JptJpaUiPlugin getPlugin() {
return JptJpaUiPlugin.instance();
}
/**
* Check for the config; although, we may still be unable to instantiate
* the actual JPA platform....
*/
private boolean jpaPlatformConfigIsMissing(String jpaPlatformID) {
return this.getJpaPlatformConfig(jpaPlatformID) == null;
}
private JpaPlatform.Config getJpaPlatformConfig(String jpaPlatformID) {
JpaPlatformManager jpaPlatformManager = this.getJpaPlatformManager();
return (jpaPlatformManager == null) ? null : jpaPlatformManager.getJpaPlatformConfig(jpaPlatformID);
}
private JpaPlatformManager getJpaPlatformManager() {
JpaWorkspace jpaWorkspace = this.getJpaWorkspace();
return (jpaWorkspace == null) ? null : jpaWorkspace.getJpaPlatformManager();
}
private JpaWorkspace getJpaWorkspace() {
return this.jpaWorkbench.getJpaWorkspace();
}
@Override
public String toString() {
return ObjectTools.toString(this, this.jpaPlatformUiConfigs);
}
}