blob: d643dbddc1d56fb792244bb3c2f821b114a31f70 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2010 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.jaxb.ui.internal.platform;
import static org.eclipse.jpt.common.core.internal.XPointUtil.*;
import java.util.ArrayList;
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.IExtensionRegistry;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jpt.common.core.internal.XPointUtil.XPointException;
import org.eclipse.jpt.common.utility.internal.KeyedSet;
import org.eclipse.jpt.jaxb.core.JptJaxbCorePlugin;
import org.eclipse.jpt.jaxb.core.platform.JaxbPlatformDescription;
import org.eclipse.jpt.jaxb.ui.JptJaxbUiPlugin;
import org.eclipse.jpt.jaxb.ui.platform.JaxbPlatformUi;
import org.eclipse.jpt.jaxb.ui.platform.JaxbPlatformUiManager;
public class JaxbPlatformUiManagerImpl
implements JaxbPlatformUiManager {
static final String EXTENSION_POINT_ID = "jaxbPlatformUis"; //$NON-NLS-1$
static final String QUALIFIED_EXTENSION_POINT_ID = JptJaxbCorePlugin.PLUGIN_ID_ + EXTENSION_POINT_ID; //$NON-NLS-1$
static final String PLATFORM_UI_ELEMENT = "jaxbPlatformUi"; //$NON-NLS-1$
static final String ID_ATTRIBUTE = "id"; //$NON-NLS-1$
static final String PLATFORM_ATTRIBUTE = "jaxbPlatform"; //$NON-NLS-1$
static final String CLASS_ATTRIBUTE = "class"; //$NON-NLS-1$
private static final JaxbPlatformUiManagerImpl INSTANCE = new JaxbPlatformUiManagerImpl();
public static JaxbPlatformUiManagerImpl instance() {
return INSTANCE;
}
private KeyedSet<String, JaxbPlatformUiConfig> platformUiConfigs;
private KeyedSet<JaxbPlatformDescription, JaxbPlatformUiConfig> platformToUiConfigs;
// ********** constructor/initialization **********
private JaxbPlatformUiManagerImpl() {
super();
this.platformUiConfigs = new KeyedSet<String, JaxbPlatformUiConfig>();
this.platformToUiConfigs = new KeyedSet<JaxbPlatformDescription, JaxbPlatformUiConfig>();
readExtensions();
}
private void readExtensions() {
final IExtensionRegistry registry = Platform.getExtensionRegistry();
final IExtensionPoint xpoint
= registry.getExtensionPoint(JptJaxbUiPlugin.PLUGIN_ID, EXTENSION_POINT_ID);
if (xpoint == null) {
throw new IllegalStateException();
}
List<IConfigurationElement> platformUiConfigs = new ArrayList<IConfigurationElement>();
for (IExtension extension : xpoint.getExtensions()) {
for (IConfigurationElement configElement : extension.getConfigurationElements()) {
if (configElement.getName().equals(PLATFORM_UI_ELEMENT)) {
platformUiConfigs.add(configElement);
}
}
}
for (IConfigurationElement configElement: platformUiConfigs) {
readPlatformUiExtension(configElement);
}
}
private void readPlatformUiExtension(IConfigurationElement element) {
try {
JaxbPlatformUiConfig platformUiConfig = new JaxbPlatformUiConfig();
// plug-in id
platformUiConfig.setPluginId(element.getContributor().getName());
// id
platformUiConfig.setId(findRequiredAttribute(element, ID_ATTRIBUTE));
if (this.platformUiConfigs.containsKey(platformUiConfig.getId())) {
logDuplicateExtension(QUALIFIED_EXTENSION_POINT_ID, ID_ATTRIBUTE, platformUiConfig.getId());
throw new XPointException();
}
// jaxb platform id
String jaxbPlatformId = findRequiredAttribute(element, PLATFORM_ATTRIBUTE);
JaxbPlatformDescription jaxbPlatform =
JptJaxbCorePlugin.getJaxbPlatformManager().getJaxbPlatform(jaxbPlatformId);
if (jaxbPlatform == null) {
logInvalidValue(element, PLATFORM_ATTRIBUTE, jaxbPlatformId);
}
if (this.platformToUiConfigs.containsKey(jaxbPlatform)) {
logDuplicateExtension(QUALIFIED_EXTENSION_POINT_ID, PLATFORM_ATTRIBUTE, jaxbPlatformId);
throw new XPointException();
}
platformUiConfig.setJaxbPlatform(jaxbPlatform);
// class
platformUiConfig.setClassName(findRequiredAttribute(element, CLASS_ATTRIBUTE));
this.platformUiConfigs.addItem(platformUiConfig.getId(), platformUiConfig);
this.platformToUiConfigs.addItem(jaxbPlatform, platformUiConfig);
}
catch (XPointException e) {
// Ignore and continue. The problem has already been reported to the user
// in the log.
}
}
public JaxbPlatformUi getJaxbPlatformUi(JaxbPlatformDescription platformDesc) {
JaxbPlatformUiConfig config = this.platformToUiConfigs.getItem(platformDesc);
return (config == null) ? null : config.getPlatformUi();
}
}