blob: 81a9d963c48687135a8fd8fae5116aedd016c50a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 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.common.core.internal;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jpt.common.core.JptCommonCorePlugin;
import org.eclipse.osgi.util.NLS;
import org.osgi.framework.Bundle;
/**
* Utilities for extension point management, validation, etc.
*/
public class XPointUtil {
public static String findRequiredAttribute(
IConfigurationElement configElement, String attributeName)
throws XPointException {
String val = configElement.getAttribute(attributeName);
if (val == null) {
logMissingAttribute(configElement, attributeName);
throw new XPointException();
}
return val;
}
public static <T> T instantiate(
String pluginId, String extensionPoint, String className, Class<T> interfaze) {
Class<T> clazz = loadClass(pluginId, extensionPoint, className, interfaze);
if (clazz == null) {
return null;
}
return instantiate(pluginId, extensionPoint, clazz);
}
public static <T> T instantiate(String pluginId, String extensionPoint, Class<T> clazz) {
try {
return clazz.newInstance();
}
catch (Exception e) {
logFailedInstantiation(pluginId, extensionPoint, clazz.getName());
return null;
}
}
public static <T> Class<T> loadClass(
String pluginId, String extensionPoint, String className, Class<T> interfaze) {
Bundle bundle = Platform.getBundle(pluginId);
Class<?> clazz;
try {
clazz = bundle.loadClass(className);
}
catch (Exception e) {
logFailedClassLoad(pluginId, extensionPoint, className);
return null;
}
if (interfaze != null && ! interfaze.isAssignableFrom(clazz)) {
logFailedInterfaceAssignment(pluginId, extensionPoint, className, interfaze.getName());
return null;
}
return (Class<T>) clazz;
}
public static void logDuplicateExtension(String extensionPoint, String nodeName, String value) {
log(JptCommonCoreMessages.REGISTRY_DUPLICATE, extensionPoint, nodeName, value);
}
public static void logMissingAttribute(
IConfigurationElement configElement, String attributeName) {
log(JptCommonCoreMessages.REGISTRY_MISSING_ATTRIBUTE,
attributeName,
configElement.getName(),
configElement.getDeclaringExtension().getExtensionPointUniqueIdentifier(),
configElement.getContributor().getName());
}
public static void logInvalidValue(
IConfigurationElement configElement, String nodeName, String invalidValue) {
log(JptCommonCoreMessages.REGISTRY_INVALID_VALUE,
invalidValue,
nodeName,
configElement.getDeclaringExtension().getExtensionPointUniqueIdentifier(),
configElement.getContributor().getName());
}
private static void logFailedClassLoad(String pluginId, String extensionPoint, String className) {
log(JptCommonCoreMessages.REGISTRY_FAILED_CLASS_LOAD,
className,
extensionPoint,
pluginId);
}
private static void logFailedInterfaceAssignment(
String pluginId, String extensionPoint, String className, String interfaceName) {
log(JptCommonCoreMessages.REGISTRY_FAILED_INTERFACE_ASSIGNMENT,
className,
extensionPoint,
pluginId,
interfaceName);
}
private static void logFailedInstantiation(String pluginId, String extensionPoint, String className) {
log(JptCommonCoreMessages.REGISTRY_FAILED_INSTANTIATION,
className,
extensionPoint,
pluginId);
}
public static void log(String msg, String... bindings) {
JptCommonCorePlugin.log(NLS.bind(msg, bindings));
}
public static void log(Exception e) {
JptCommonCorePlugin.log(e);
}
public static final class XPointException
extends Exception {
private static final long serialVersionUID = 1L;
}
}