blob: 437a5d19ce2993e2a28cfc85f3429afa6d73f17c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) Philipps University of Marburg. 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:
* Philipps University of Marburg - initial API and implementation
*******************************************************************************/
package org.eclipse.emf.refactor.refactoring.runtime.ltk;
import java.util.List;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.change.ChangeDescription;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.emf.refactor.refactoring.core.Refactoring;
import org.eclipse.emf.refactor.refactoring.managers.RefactoringManager;
import org.eclipse.emf.refactor.refactoring.runtime.ltk.change.RefactoringChange;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.ltk.core.refactoring.Change;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
import org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant;
import org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor;
import org.eclipse.ltk.core.refactoring.participants.SharableParticipants;
/**
* Adapter class of a LTK RefactoringProcessor used for
* EMF model refactorings.
* @generated NOT
* @author Florian Mantz
*/
public class LtkEmfRefactoringProcessorAdapter
extends RefactoringProcessor {
/**
* Id of the RefactoringProcessor.
*/
protected final String id;
/**
* Runnable that executes the model refactoring.
*/
protected final Runnable refactoringAction;
/**
* ChangeDescription object for model refactoring execution.
*/
protected final ChangeDescription changeDescription;
/**
* Given selection objects the model refactoring shall
* be executed on.
*/
protected final List<EObject> selection;
/**
* Root object of the EMF model.
*/
protected final EObject root;
/**
* EditingDomain object of the EMF model.
*/
protected EditingDomain editingDomain;
public EditingDomain getEditingDomain() {
return editingDomain;
}
public void setEditingDomain(EditingDomain editingDomain) {
this.editingDomain = editingDomain;
}
/**
* Private constructor used by other constructors.
* @param refactoring EMF Model Refactoring to be executed.
* @param selection Given selection objects the model refactoring
* shall be executed on.
* @param refactoringAction Runnable that executes the model refactoring.
* @param changeDescription ChangeDescription object for model
* refactoring execution.
*/
private LtkEmfRefactoringProcessorAdapter
(Refactoring refactoring, List<EObject> selection,
Runnable refactoringAction, ChangeDescription changeDescription){
this.id = (null!=refactoring)?refactoring.getId():null;
this.selection=selection;
this.root = EcoreUtil.getRootContainer(selection.get(0));
this.editingDomain = initEditingDomain(selection);
this.refactoringAction = refactoringAction;
this.changeDescription = changeDescription;
if (null == this.selection || null == this.root
|| null == this.editingDomain){
throw new RuntimeException
("RefactoringProcessor could not be created!");
}
}
/**
* Constructor using a Runnable that executes the model refactoring.
* @param refactoring EMF Model Refactoring to be executed.
* @param selection Given selection objects the model refactoring
* shall be executed on.
* @param refactoringAction Runnable that executes the model refactoring.
*/
protected LtkEmfRefactoringProcessorAdapter(Refactoring refactoring,
List<EObject> selection, Runnable refactoringAction){
this(refactoring,selection,refactoringAction,null);
}
/**
* Constructor using a ChangeDescription object for model
* refactoring execution.
* @param refactoring EMF Model Refactoring to be executed.
* @param selection Given selection objects the model refactoring
* shall be executed on.
* @param changeDescription ChangeDescription object for model
* refactoring execution.
*/
protected LtkEmfRefactoringProcessorAdapter(Refactoring refactoring,
List<EObject> selection, ChangeDescription changeDescription){
this(refactoring,selection,null,changeDescription);
}
/**
* Static method that returns the EditingDomain of a given selection
* of EObjects.
* @param selection Given selection objects the model refactoring shall
* be executed on.
* @return EditingDomain of a given selection of EObjects.
*/
private static EditingDomain initEditingDomain(List<EObject> selection) {
if(null != selection && !selection.isEmpty()){
EditingDomain editingDomain =
AdapterFactoryEditingDomain
.getEditingDomainFor(selection.get(0));
System.out.println("====> editingDomain 1: " + editingDomain);
if (null == editingDomain){
ResourceSet rset =
selection.get(0).eResource().getResourceSet();
editingDomain = TransactionalEditingDomain.Factory.INSTANCE
.getEditingDomain(rset);
System.out.println("====> editingDomain 2: " + editingDomain);
}
if (null == editingDomain) {
ResourceSet rset =
selection.get(0).eResource().getResourceSet();
editingDomain = TransactionalEditingDomain.Factory.INSTANCE
.createEditingDomain(rset);
System.out.println("====> editingDomain 3: " + editingDomain);
}
return editingDomain;
}
throw new RuntimeException("EditingDomain could not be initialized!");
}
/**
* @see org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor#
* getElements()
*/
@Override
public Object[] getElements() {
return this.selection.toArray();
}
/**
* @see org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor#
* getIdentifier()
*/
@Override
public String getIdentifier() {
return getClass().getName();
}
/**
* @see org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor#
* getProcessorName()
*/
@Override
public String getProcessorName() {
if (null == id) return "testCase";
return RefactoringManager.getById(id).getName();
}
/**
* @see org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor#
* isApplicable()
*/
@Override
public boolean isApplicable() throws CoreException {
return true;
}
/**
* @see org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor#
* checkInitialConditions(org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public RefactoringStatus checkInitialConditions(IProgressMonitor pm)
throws CoreException, OperationCanceledException {
return checkInitialConditions();
}
/**
* @see org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor#
* checkInitialConditions(org.eclipse.core.runtime.IProgressMonitor)
*/
public RefactoringStatus checkInitialConditions() {
RefactoringStatus result = new RefactoringStatus();
return result;
}
/**
* @see org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor#
* checkFinalConditions(org.eclipse.core.runtime.IProgressMonitor,
* org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext)
*/
@Override
public RefactoringStatus checkFinalConditions(IProgressMonitor pm,
CheckConditionsContext context) throws CoreException,
OperationCanceledException {
return checkFinalConditions();
}
/**
* @see org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor#
* checkFinalConditions(org.eclipse.core.runtime.IProgressMonitor,
* org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext)
*/
public RefactoringStatus checkFinalConditions() {
RefactoringStatus result = new RefactoringStatus();
return result;
}
/**
* @see org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor#
* createChange(org.eclipse.core.runtime.IProgressMonitor)
*/
@Override
public Change createChange(IProgressMonitor pm) throws CoreException,
OperationCanceledException {
return createChange(true);
}
/**
* Creates a RefactoringChange object either with a Runnable object
* or a ChangeDescription object for executing a EMF model refactoring.
* @param enableChangeRecoder Flag whether the model refactoring
* execution shall be recorded.
* @return RefactoringChange object for executing a EMF model refactoring.
*/
private Change createChange(boolean enableChangeRecoder) {
RefactoringChange refactoringChange = null;
if (null != this.changeDescription){
refactoringChange =
new RefactoringChange(this.getProcessorName(), this.root,
this.editingDomain, this.changeDescription, null, false);
} else {
refactoringChange =
new RefactoringChange(this.getProcessorName(), this.root,
this.editingDomain, null, this.refactoringAction,
enableChangeRecoder);
}
return refactoringChange;
}
/**
* @see org.eclipse.ltk.core.refactoring.participants.RefactoringProcessor#
* loadParticipants(org.eclipse.ltk.core.refactoring.RefactoringStatus,
* org.eclipse.ltk.core.refactoring.participants.SharableParticipants)
*/
@Override
public RefactoringParticipant[] loadParticipants(RefactoringStatus status,
SharableParticipants sharedParticipants) throws CoreException {
return new RefactoringParticipant[0];
}
/**
* Method to invoke a model refactoring without recording its execution.
* @throws OperationCanceledException
* @throws CoreException
*/
public void runWithoutChangeRecorder()
throws OperationCanceledException, CoreException{
createChange(false).perform(new NullProgressMonitor());
}
/**
* Checks the initial and final conditions of the refactoring.
* @return true if initial and final check do not return errors, false otherwise
*/
public boolean checkConditions(){
return (checkInitialConditions().isOK() && checkFinalConditions().isOK());
}
}