/*=============================================================================#
# Copyright (c) 2012-2016 Stephan Wahlbrink (WalWare.de) 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:
# Stephan Wahlbrink - initial API and implementation
#=============================================================================*/
package de.walware.ecommons.ltk.core.refactoring;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.mapping.IResourceChangeDescriptionFactory;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.SubMonitor;
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.MoveProcessor;
import org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant;
import org.eclipse.ltk.core.refactoring.participants.ReorgExecutionLog;
import org.eclipse.ltk.core.refactoring.participants.ResourceChangeChecker;
import org.eclipse.ltk.core.refactoring.participants.SharableParticipants;
import org.eclipse.osgi.util.NLS;
import de.walware.ecommons.ltk.core.ElementSet;
import de.walware.ecommons.ltk.core.model.IModelElement;
import de.walware.ecommons.ltk.internal.core.refactoring.Messages;
public abstract class CommonMoveProcessor extends MoveProcessor {
private final RefactoringAdapter fAdapter;
private final ElementSet fElementsToMove;
private final RefactoringDestination fDestination;
private Change fMoveChange;
private ReorgExecutionLog fExecutionLog;
public CommonMoveProcessor(final ElementSet elements, final RefactoringDestination destination,
final RefactoringAdapter adapter) {
assert (elements != null);
assert (adapter != null);
fElementsToMove = elements;
fDestination = destination;
if (destination.getInitialObjects().size() != 1
|| !(destination.getInitialObjects().get(0) instanceof IModelElement) ) {
throw new IllegalArgumentException();
}
fAdapter = adapter;
}
@Override
public abstract String getIdentifier();
protected abstract String getRefactoringIdentifier();
@Override
public Object[] getElements() {
final Object[] elements = fElementsToMove.getInitialObjects().toArray(
new Object[fElementsToMove.getInitialObjects().size() + 1] );
elements[elements.length - 1] = fDestination.getInitialObjects().get(0);
return elements;
}
@Override
public String getProcessorName() {
return Messages.MoveRefactoring_label;
}
@Override
public boolean isApplicable() throws CoreException {
return (fAdapter.canInsert(fElementsToMove, fDestination)
&& fAdapter.canDelete(fElementsToMove) );
}
@Override
public RefactoringStatus checkInitialConditions(final IProgressMonitor monitor)
throws CoreException {
final RefactoringStatus result = new RefactoringStatus();
fAdapter.checkInitialToModify(result, fDestination);
fAdapter.checkInitialToModify(result, fElementsToMove);
return result;
}
@Override
public RefactoringStatus checkFinalConditions(final IProgressMonitor monitor,
final CheckConditionsContext context)
throws CoreException, OperationCanceledException {
final SubMonitor progress = SubMonitor.convert(monitor, RefactoringMessages.Common_FinalCheck_label, 1);
try{
final RefactoringStatus result = new RefactoringStatus();
fElementsToMove.removeElementsWithAncestorsOnList();
fElementsToMove.postProcess();
fAdapter.checkFinalToDelete(result, fElementsToMove);
fAdapter.checkFinalToModify(result, fDestination, monitor);
final TextChangeManager textManager = new TextChangeManager();
fMoveChange = fAdapter.createChangeToMove(getProcessorName(),
fElementsToMove, fDestination, textManager, progress.newChild(1) );
final ResourceChangeChecker checker = (ResourceChangeChecker) context.getChecker(ResourceChangeChecker.class);
final IResourceChangeDescriptionFactory deltaFactory = checker.getDeltaFactory();
fAdapter.buildDeltaToModify(fElementsToMove, deltaFactory);
return result;
}
catch (final OperationCanceledException e) {
throw e;
}
finally{
progress.done();
}
}
@Override
public RefactoringParticipant[] loadParticipants(final RefactoringStatus status,
final SharableParticipants shared)
throws CoreException {
final List<RefactoringParticipant> result = new ArrayList<>();
fExecutionLog = new ReorgExecutionLog();
fAdapter.addParticipantsToMove(fElementsToMove, fDestination, result, status, this,
shared, fExecutionLog );
return result.toArray(new RefactoringParticipant[result.size()]);
}
@Override
public Change createChange(final IProgressMonitor monitor)
throws CoreException, OperationCanceledException {
try {
monitor.beginTask(RefactoringMessages.Common_CreateChanges_label, 1);
final Map<String, String> arguments = new HashMap<>();
final String description = (fElementsToMove.getElementCount() == 1) ?
Messages.MoveRefactoring_description_singular : Messages.MoveRefactoring_description_plural;
final IProject resource = fElementsToMove.getSingleProject();
final String project = (resource != null) ? resource.getName() : null;
final String source = (project != null) ? NLS.bind(RefactoringMessages.Common_Source_Project_label, project) : RefactoringMessages.Common_Source_Workspace_label;
// final String header = NLS.bind(RefactoringCoreMessages.JavaDeleteProcessor_header, new String[] { String.valueOf(fElements.length), source});
// final int flags = JavaRefactoringDescriptor.JAR_MIGRATION | JavaRefactoringDescriptor.JAR_REFACTORING | RefactoringDescriptor.STRUCTURAL_CHANGE | RefactoringDescriptor.MULTI_CHANGE;
// final JDTRefactoringDescriptorComment comment= new JDTRefactoringDescriptorComment(project, this, header);
// if (fDeleteSubPackages)
// comment.addSetting(RefactoringCoreMessages.JavaDeleteProcessor_delete_subpackages);
// if (fAccessorsDeleted)
// comment.addSetting(RefactoringCoreMessages.JavaDeleteProcessor_delete_accessors);
// arguments.put(ATTRIBUTE_DELETE_SUBPACKAGES, Boolean.valueOf(fDeleteSubPackages).toString());
// arguments.put(ATTRIBUTE_SUGGEST_ACCESSORS, Boolean.valueOf(fSuggestGetterSetterDeletion).toString());
// arguments.put(ATTRIBUTE_RESOURCES, new Integer(fResources.length).toString());
// for (int offset= 0; offset < fResources.length; offset++)
// arguments.put(JavaRefactoringDescriptorUtil.ATTRIBUTE_ELEMENT + (offset + 1), JavaRefactoringDescriptorUtil.resourceToHandle(project, fResources[offset]));
// arguments.put(ATTRIBUTE_ELEMENTS, new Integer(fModelElements.length).toString());
// for (int offset= 0; offset < fModelElements.length; offset++)
// arguments.put(JavaRefactoringDescriptorUtil.ATTRIBUTE_ELEMENT + (offset + fResources.length + 1), JavaRefactoringDescriptorUtil.elementToHandle(project, fModelElements[offset]));
final int flags = 0;
final String comment = ""; //$NON-NLS-1$
final CommonRefactoringDescriptor descriptor = new CommonRefactoringDescriptor(
getIdentifier(), project, description, comment, arguments, flags);
return new DynamicValidationRefactoringChange(descriptor,
Messages.MoveRefactoring_label,
new Change[] { fMoveChange },
fExecutionLog );
}
finally {
monitor.done();
}
}
}