blob: 9a38236e9a6e38b56f2feb46b284682d8e3ee6d5 [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2005, 2006 IBM Corporation and others.
* 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:
* IBM Corporation - initial API and implementation
****************************************************************************/
package org.eclipse.gmf.runtime.emf.type.core.internal.descriptors;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.gmf.runtime.common.core.util.Log;
import org.eclipse.gmf.runtime.common.core.util.StringStatics;
import org.eclipse.gmf.runtime.emf.type.core.IContainerDescriptor;
import org.eclipse.gmf.runtime.emf.type.core.IElementMatcher;
import org.eclipse.gmf.runtime.emf.type.core.edithelper.IEditHelperAdvice;
import org.eclipse.gmf.runtime.emf.type.core.internal.EMFTypePlugin;
import org.eclipse.gmf.runtime.emf.type.core.internal.EMFTypePluginStatusCodes;
import org.eclipse.gmf.runtime.emf.type.core.internal.impl.XMLExpressionMatcher;
import org.eclipse.gmf.runtime.emf.type.core.internal.l10n.EMFTypeCoreMessages;
/**
* Descriptor for an advice binding. Advice can be bound to any element type.
*
* @author ldamus
*/
public class AdviceBindingDescriptor
implements IEditHelperAdviceDescriptor {
/**
* The advice binding ID.
*/
private final String id;
/**
* The identifier of this element type.
*/
private final String typeId;
/**
* Indicates the related element types that should inherite this advice.
*/
private final AdviceBindingInheritance inheritance;
/**
* The matcher class name. May be <code>null</code>.
*/
private String matcherClassName;
/**
* The container element matcher. May be <code>null</code>.
*/
private IElementMatcher matcher;
/**
* The container matcher configuration element.
*/
private IConfigurationElement matcherConfig;
/**
* The binding configuration element.
*/
private final IConfigurationElement bindingConfig;
/**
* The class name of the edit helper advice.
*/
private String editHelperAdviceName;
/**
* The edit helper advice.
*/
private IEditHelperAdvice editHelperAdvice;
/**
* The container descriptor.
*/
private IContainerDescriptor containerDescriptor;
/**
* Teh metamodel descriptor.
*/
private final MetamodelDescriptor metamodelDescriptor;
/**
* Constructs a new container descriptor from the configuration element.
*
* @param config
* the configuration element
* @throws CoreException
* when the configuration element does not contain the required
* elements and attributes
*/
public AdviceBindingDescriptor(IConfigurationElement config,
MetamodelDescriptor metamodelDescriptor)
throws CoreException {
this.bindingConfig = config;
this.metamodelDescriptor = metamodelDescriptor;
// ID
this.id = config.getAttribute(ElementTypeXmlConfig.A_ID);
if (id == null) {
throw EMFTypePluginStatusCodes.getAdviceBindingInitException(
StringStatics.BLANK,
EMFTypeCoreMessages.adviceBinding_reason_no_id_WARN_);
}
// EDIT HELPER ADVICE CLASS
editHelperAdviceName = config
.getAttribute(ElementTypeXmlConfig.A_CLASS);
if (editHelperAdviceName == null) {
throw EMFTypePluginStatusCodes
.getAdviceBindingInitException(
id,
EMFTypeCoreMessages.adviceBinding_reason_no_edit_helper_advice_id_WARN_);
}
// TYPE ID
this.typeId = config.getAttribute(ElementTypeXmlConfig.A_TYPE_ID);
if (typeId == null) {
throw EMFTypePluginStatusCodes.getAdviceBindingInitException(id,
EMFTypeCoreMessages.adviceBinding_reason_no_type_id_WARN_);
}
// ECONTAINER
IConfigurationElement[] containerConfigs = config
.getChildren(ElementTypeXmlConfig.E_ECONTAINER);
if (containerConfigs.length > 0) {
containerDescriptor = new ContainerDescriptor(containerConfigs[0],
metamodelDescriptor, getId());
}
// APPLY TO RELATED ELEMENT TYPES
String inheritanceString = config
.getAttribute(ElementTypeXmlConfig.A_INHERITANCE);
AdviceBindingInheritance declaredInheritance = AdviceBindingInheritance
.getAdviceBindingInheritance(inheritanceString);
if (declaredInheritance == null) {
if (inheritanceString != null) {
// Invalid inheritance value
throw EMFTypePluginStatusCodes.getAdviceBindingInitException(id,
EMFTypeCoreMessages.adviceBinding_reason_invalid_inheritance_WARN_);
}
// Default inheritance is NONE
declaredInheritance = AdviceBindingInheritance.NONE;
}
this.inheritance = declaredInheritance;
// XML MATCHER EXPRESSION
IConfigurationElement[] enablementConfigs = config
.getChildren(ElementTypeXmlConfig.E_ENABLEMENT);
if (enablementConfigs.length > 0) {
matcher = new XMLExpressionMatcher(enablementConfigs[0], id);
}
// MATCHER CLASS
if (matcher == null) {
IConfigurationElement[] matcherConfigs = config
.getChildren(ElementTypeXmlConfig.E_MATCHER);
if (matcherConfigs.length > 0) {
matcherClassName = matcherConfigs[0].getAttribute(ElementTypeXmlConfig.A_CLASS);
if (matcherClassName == null) {
throw EMFTypePluginStatusCodes.getInitException(id,
EMFTypeCoreMessages.element_reason_matcher_no_class_WARN_, null);
}
matcherConfig = matcherConfigs[0];
}
}
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gmf.runtime.emf.type.core.internal.impl.IEditHelperAdviceDescriptor#getTypeId()
*/
public String getTypeId() {
return typeId;
}
/**
* Returns the advice binding id.
* @return the advice binding id
*/
public String getId() {
return id;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gmf.runtime.emf.type.core.internal.impl.IEditHelperAdviceDescriptor#getMatcher()
*/
public IElementMatcher getMatcher() {
if (matcher == null && matcherClassName != null && matcherConfig != null) {
try {
matcher = (IElementMatcher) matcherConfig
.createExecutableExtension(ElementTypeXmlConfig.A_CLASS);
} catch (CoreException e) {
Log
.error(
EMFTypePlugin.getPlugin(),
EMFTypePluginStatusCodes.MATCHER_CLASS_NOT_FOUND,
EMFTypeCoreMessages
.bind(
EMFTypeCoreMessages.matcher_class_not_found_ERROR_,
matcherClassName), e);
// Don't try to recompute the matcher class if it has failed.
matcherClassName = null;
}
}
return matcher;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.gmf.runtime.emf.type.core.internal.impl.IEditHelperAdviceDescriptor#getEditHelperAdvice()
*/
public IEditHelperAdvice getEditHelperAdvice() {
if (editHelperAdvice == null) {
if (editHelperAdviceName != null) {
try {
editHelperAdvice = (IEditHelperAdvice) bindingConfig
.createExecutableExtension(ElementTypeXmlConfig.A_CLASS);
} catch (CoreException e) {
Log
.error(
EMFTypePlugin.getPlugin(),
EMFTypePluginStatusCodes.EDIT_HELPER_ADVICE_CLASS_NOT_FOUND,
EMFTypeCoreMessages
.bind(
EMFTypeCoreMessages.editHelperAdvice_class_not_found_ERROR_,
editHelperAdviceName), e);
// Don't recompute the edit helper advice after it has
// failed once.
editHelperAdviceName = null;
}
}
}
return editHelperAdvice;
}
/**
* Gets the metamodel descriptor for this advice binding.
*
* @return the metamodel descriptor
*/
public MetamodelDescriptor getMetamodelDescriptor() {
return metamodelDescriptor;
}
/* (non-Javadoc)
* @see org.eclipse.gmf.runtime.emf.type.core.internal.descriptors.IEditHelperAdviceDescriptor#getInheritance()
*/
public AdviceBindingInheritance getInheritance() {
return inheritance;
}
/**
* Gets the container descriptor.
*
* @return the container descriptor
*/
public IContainerDescriptor getContainerDescriptor() {
return containerDescriptor;
}
public String toString() {
return "AdviceBindingDescriptor[" + getId()+ "]"; //$NON-NLS-1$//$NON-NLS-2$
}
}