blob: f726f1510a7fb1b52bb2b79d556918333472790e [file] [log] [blame]
/**
* *******************************************************************************
* Copyright (c) 2010 Mia-Software.
* 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:
*
* Nicolas Guyomar (Mia-Software) - initial API and implementation
* *******************************************************************************
*
*/
package org.eclipse.modisco.kdm.source.extension.ui.adapters;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.CoreException;
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.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
import org.eclipse.gmt.modisco.infra.common.core.logging.MoDiscoLogger;
import org.eclipse.modisco.kdm.source.extension.ui.Activator;
import org.eclipse.modisco.kdm.source.extension.ui.interfaces.RevealingStrategy;
import org.eclipse.modisco.kdm.source.extension.ui.interfaces.SourceStrategy;
import org.eclipse.modisco.kdm.source.extension.ui.registry.EditorRegistry;
public class SourceAccessAdapterFactory extends AdapterFactoryImpl {
private static List<SourceStrategy> listSourceStrategy;
private static List<RevealingStrategy> listRevealingStrategy;
@Override
protected Adapter createAdapter(final Notifier target) {
Adapter adapter = null;
if (SourceAccessAdapterFactory.listSourceStrategy == null) {
initializeSourceStrategy();
}
SourceStrategy sourceStrategy = findSourceStrategy(target);
if (SourceAccessAdapterFactory.listRevealingStrategy == null) {
initializeRevealingStrategy();
}
RevealingStrategy revealingStrategy = findRevealingStrategy(target);
if (sourceStrategy != null && revealingStrategy != null) {
adapter = new SourceAccessAdapter(sourceStrategy, revealingStrategy,
target);
associate(adapter, target);
}
return adapter;
}
/**
* Look for the extension point containing the registered
* {@link SourceStrategy} extension
*
* @return
*/
protected static void initializeSourceStrategy() {
IExtensionRegistry registry = Platform.getExtensionRegistry();
IExtensionPoint extPointStrategySource = registry
.getExtensionPoint(EditorRegistry.EXTENSION_POINT_STRATEGY_SOURCE_ID);
for (IExtension ext : extPointStrategySource.getExtensions()) {
for (IConfigurationElement configElt : ext
.getConfigurationElements()) {
String strategyResolutionClass = configElt
.getAttribute(EditorRegistry.CLASS);
String metamodelUri = configElt
.getAttribute(EditorRegistry.METAMODEL);
if (strategyResolutionClass != null && metamodelUri != null) {
try {
SourceStrategy sourceStrategy = (SourceStrategy) configElt
.createExecutableExtension(EditorRegistry.CLASS);
// Add the sourceStrategy to the list
addSourceStrategy(sourceStrategy);
} catch (CoreException e) {
MoDiscoLogger.logError(e, Activator.getDefault());
}
} else {
MoDiscoLogger.logError("Metamodel or class in extension: " //$NON-NLS-1$
+ ext.getNamespaceIdentifier() + " is null", //$NON-NLS-1$
Activator.getDefault());
}
}
}
}
/**
* Look for the extension point containing the registered
* {@link RevealingStrategy} extension
*
* @return
*/
protected static void initializeRevealingStrategy() {
IExtensionRegistry registry = Platform.getExtensionRegistry();
IExtensionPoint extPointStrategyRevealing = registry
.getExtensionPoint(EditorRegistry.EXTENSION_POINT_STRATEGY_REVEALING_ID);
for (IExtension ext : extPointStrategyRevealing.getExtensions()) {
for (IConfigurationElement configElt : ext
.getConfigurationElements()) {
String strategyOpeningClass = configElt
.getAttribute(EditorRegistry.CLASS);
if (strategyOpeningClass != null) {
try {
RevealingStrategy revealingStrategy = (RevealingStrategy) configElt
.createExecutableExtension(EditorRegistry.CLASS);
// Add the revealing strategy to the list
addRevealingSrategy(revealingStrategy);
} catch (CoreException e) {
MoDiscoLogger.logError(e, Activator.getDefault());
}
}
}
}
}
private static RevealingStrategy findRevealingStrategy(final Notifier target) {
for (RevealingStrategy revealingStrategy : getRevealingStrategies()) {
if (revealingStrategy.isApplicableTo(target)) {
return revealingStrategy;
}
}
return null;
}
private static SourceStrategy findSourceStrategy(final Notifier target) {
for (SourceStrategy srcStrategy : getSourceStrategies()) {
if (srcStrategy.isApplicableTo(target)) {
return srcStrategy;
}
}
return null;
}
/**
* @return the listSourceStrategy
*/
private static List<SourceStrategy> getSourceStrategies() {
if (SourceAccessAdapterFactory.listSourceStrategy == null) {
SourceAccessAdapterFactory.listSourceStrategy = new ArrayList<SourceStrategy>();
}
return SourceAccessAdapterFactory.listSourceStrategy;
}
private static void addSourceStrategy(final SourceStrategy sourceStrategy) {
if (!getSourceStrategies().contains(sourceStrategy)) {
getSourceStrategies().add(sourceStrategy);
}
}
private static void addRevealingSrategy(final RevealingStrategy revealingStrategy) {
if (!getRevealingStrategies().contains(revealingStrategy)) {
getRevealingStrategies().add(revealingStrategy);
}
}
/**
* @return the listRevealingStrategy
*/
private static List<RevealingStrategy> getRevealingStrategies() {
if (SourceAccessAdapterFactory.listRevealingStrategy == null) {
SourceAccessAdapterFactory.listRevealingStrategy = new ArrayList<RevealingStrategy>();
}
return SourceAccessAdapterFactory.listRevealingStrategy;
}
}