blob: f1289a8ea71b0e617203a4f8a12c4ef45c30d108 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015, 2017 EclipseSource Muenchen GmbH 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:
* Stefan Dirix - initial API and implementation
* Philip Langer - bug 516502
*******************************************************************************/
package org.eclipse.emf.compare.ide.ui.dependency;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.compare.ide.ui.internal.EMFCompareIDEUIMessages;
import org.eclipse.emf.compare.ide.ui.internal.EMFCompareIDEUIPlugin;
/**
* This class is used for information flow between {@link ModelDependencyProviderRegistryListener} and
* {@link ModelDependencyProviderRegistry} and managing the creation of {@link IDependencyProvider} instances.
*
* @author Stefan Dirix <sdirix@eclipsesource.com>
*/
public class DependencyProviderDescriptor {
/** Underlying {@link IConfigurationElement} describing this dependency provider. */
private final IConfigurationElement configurationElement;
/**
* Name of the configuration property that can be used to retrieve the qualified class name of this
* dependency provider.
*/
private final String attributeClassName;
/** Don't log the same error multiple times. */
private boolean logOnce;
/**
* The cached provider demand created the first time {@link #getDependencyProvider()} is called.
*/
private IDependencyProvider provider;
/**
* Default constructor.
*
* @param attributeName
* The name of the configuration attribute responsible for the registered
* {@link IDependencyProvider}.
* @param configurationElement
* The {@link IConfigurationElement} containing all relevant extension information.
*/
public DependencyProviderDescriptor(String attributeName, IConfigurationElement configurationElement) {
this.attributeClassName = attributeName;
this.configurationElement = configurationElement;
}
/**
* Returns the {@link IDependencyProvider}.
*
* @return The newly created {@link IDependencyProvider}.
*/
public IDependencyProvider getDependencyProvider() {
if (provider == null && !logOnce) {
try {
provider = (IDependencyProvider)configurationElement
.createExecutableExtension(attributeClassName);
} catch (CoreException e) {
if (!logOnce) {
logOnce = true;
final String className = configurationElement.getAttribute(attributeClassName);
final String message = EMFCompareIDEUIMessages
.getString("ModelDependencyProviderRegistry.invalidModelDependency", className); //$NON-NLS-1$
final IStatus status = new Status(IStatus.ERROR,
configurationElement.getDeclaringExtension().getContributor().getName(), message,
e);
EMFCompareIDEUIPlugin.getDefault().getLog().log(status);
}
}
}
return provider;
}
}