/*******************************************************************************
* 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.List;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.reuseware.coconut.roundtrip.RoundTripAdapter;
import org.reuseware.coconut.roundtrip.EModificationType;
import org.reuseware.coconut.roundtrip.ICallbackFragmentSelected;
import org.reuseware.coconut.roundtrip.IConflictResolver;
/**
* RemoveHandler extends AbstractHandler to implement analysis functionality for
* modifications that remove elements.
*
* @author Roland Samlaus
*/
public class RemoveHandler extends AbstractHandler {
public RemoveHandler(IConflictResolver resolver) {
super(resolver);
}
/**
* Handles problems that occur while removing elements from a composed
* artifact. Such problem may occur, when multiple composition programs
* use the source fragment the removed element originates from.
*
* @param composedArtifactUFI
* the UFI of the composed artifact
* @param adapter
* The adapter that was notified about the removal of an element
*/
public void handleRemove(URI composedArtifactUFI, RoundTripAdapter adapter) {
List<URI> programUFIs = getCreatingCompositionPrograms(composedArtifactUFI);
if (programUFIs.size() > 1) {
programUFIs = getTargetsFromCompositionProgram(composedArtifactUFI);
selectSourceToRemoveFrom(programUFIs, adapter);
} else {
adapter.confirmRemoveElementsFromFragment();
}
}
/**
* Notifies the conflict resolver about a conflict and ask for a decision about
* which source fragment the element should be removed from.
*
* @param compositionProgramUFIs
* a list of compositions program ufi's where the source fragment
* is used in.
*/
private void selectSourceToRemoveFrom(List<URI> compositionProgramUFIs,
RoundTripAdapter adapter) {
getConflictResolver().chooseSourceFragement(EModificationType.REMOVE, compositionProgramUFIs, adapter, new ICallbackFragmentSelected() {
public void fragmentSelected(RoundTripAdapter adapter,
URI selectedFragmentUFI) {
copyFragment(adapter);
}
});
}
public void saveOriginal(RoundTripAdapter adapter) {
adapter.saveOriginalFragment();
}
public EObject getOriginal(RoundTripAdapter adapter) {
return adapter.getOriginal();
}
public void setOnEdgeUFI(URI ufi) {
}
/*
private void discardChanges(CopiedFromAdapter adapter) {
adapter.discardRemove();
}
private void preCompareAction(CopiedFromAdapter adapter) {
adapter.removeTemporary();
}
private void postCompareAction(CopiedFromAdapter adapter) {
adapter.undoChanges();
}
*/
@Override
public void modifyTemporary(RoundTripAdapter adapter) {
adapter.removeTemporary();
}
}