/*******************************************************************************
* Copyright (c) 2006-2009
* Software Technology Group, Dresden University of Technology
*
* 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:
* Software Technology Group - TU Dresden, Germany
* - initial API and implementation
******************************************************************************/
package org.reuseware.coconut.roundtrip.impl;
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.util.URI;
import org.reuseware.coconut.roundtrip.RoundTripAdapter;
import org.reuseware.coconut.roundtrip.EModificationType;
import org.reuseware.coconut.roundtrip.IConflictResolver;
import org.reuseware.coconut.roundtrip.IModificationHandler;
/**
* This class can be registered as a modification handler
* to composed fragments. If a composed fragment is changed
* this handler propagates the changes back to the source
* fragments. If a conflict is cause by a change, a
* conflict resolver is used to resolve it.
*/
public class RoundtripModificationHandler implements IModificationHandler {
private ChangeHandler changeHandler;
private AddHandler addHandler;
private RemoveHandler removeHandler;
/**
* A constructor used when this handler is register via extension
* point.
*/
public RoundtripModificationHandler() {
this(registerConflictResolvers());
}
/**
* A constructor used then this handler is used in JUnit test cases.
*
* @param conflictResolver
*/
public RoundtripModificationHandler(IConflictResolver conflictResolver) {
changeHandler = new ChangeHandler(conflictResolver);
addHandler = new AddHandler(conflictResolver);
removeHandler = new RemoveHandler(conflictResolver);
}
private static IConflictResolver registerConflictResolvers() {
IExtensionRegistry extensionRegistry = Platform.getExtensionRegistry();
if (extensionRegistry == null) {
return null;
}
List<IConflictResolver> resolvers = new ArrayList<IConflictResolver>();
IExtensionPoint extensionPoint = extensionRegistry
.getExtensionPoint("org.reuseware.coconut.fragment.conflictResolver");
IExtension[] extensions = extensionPoint.getExtensions();
for (int i = 0; i < extensions.length; i++) {
IConfigurationElement[] elements = extensions[i].getConfigurationElements();
for (int j = 0; j < elements.length; j++) {
try {
resolvers.add((IConflictResolver) elements[j].createExecutableExtension("class"));
} catch (CoreException ce) {
ce.printStackTrace();
} catch (ClassCastException cce) {
cce.printStackTrace();
}
}
}
if (resolvers.size() > 1) {
System.err.println("RoundtripModificationHandler.registerConflictResolvers() found multiple registered conflict resolver. This is most probably a configuration issue.");
} else if (resolvers.size() < 1) {
System.err.println("RoundtripModificationHandler.registerConflictResolvers() no conflict resolver found. This is most probably a configuration issue.");
}
return resolvers.get(0);
}
public void handle(EModificationType type, URI ufi, RoundTripAdapter adapter) {
if (type == EModificationType.ADD) {
addHandler.handleAdd(ufi, adapter);
}
if (type == EModificationType.CHANGE) {
changeHandler.handleChange(ufi, adapter);
}
if (type == EModificationType.REMOVE) {
removeHandler.handleRemove(ufi, adapter);
}
}
}