X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=case-study%2Fjdt-before%2Fcore%20refactoring%2Forg%2Feclipse%2Fjdt%2Finternal%2Fcorext%2Frefactoring%2Freorg%2FJavaMoveProcessor.java;fp=case-study%2Fjdt-before%2Fcore%20refactoring%2Forg%2Feclipse%2Fjdt%2Finternal%2Fcorext%2Frefactoring%2Freorg%2FJavaMoveProcessor.java;h=27f818d35e9b9f92e71d9c2c4d17e8aa5191c824;hb=1b2798f607d741df30e5197f427381cbff326adc;hp=0000000000000000000000000000000000000000;hpb=246231e4bd9b24345490f369747c0549ca308c4d;p=ifi-stolz-refaktor.git diff --git a/case-study/jdt-before/core refactoring/org/eclipse/jdt/internal/corext/refactoring/reorg/JavaMoveProcessor.java b/case-study/jdt-before/core refactoring/org/eclipse/jdt/internal/corext/refactoring/reorg/JavaMoveProcessor.java new file mode 100644 index 00000000..27f818d3 --- /dev/null +++ b/case-study/jdt-before/core refactoring/org/eclipse/jdt/internal/corext/refactoring/reorg/JavaMoveProcessor.java @@ -0,0 +1,320 @@ +/******************************************************************************* + * Copyright (c) 2000, 2011 IBM Corporation 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.jdt.internal.corext.refactoring.reorg; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.eclipse.core.runtime.Assert; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IAdaptable; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.OperationCanceledException; + +import org.eclipse.core.resources.IResource; + +import org.eclipse.ltk.core.refactoring.Change; +import org.eclipse.ltk.core.refactoring.ChangeDescriptor; +import org.eclipse.ltk.core.refactoring.CompositeChange; +import org.eclipse.ltk.core.refactoring.RefactoringStatus; +import org.eclipse.ltk.core.refactoring.TextEditBasedChange; +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.SharableParticipants; + +import org.eclipse.jdt.core.IJavaElement; +import org.eclipse.jdt.core.JavaModelException; + +import org.eclipse.jdt.internal.corext.refactoring.JavaRefactoringArguments; +import org.eclipse.jdt.internal.corext.refactoring.RefactoringCoreMessages; +import org.eclipse.jdt.internal.corext.refactoring.changes.DynamicValidationStateChange; +import org.eclipse.jdt.internal.corext.refactoring.participants.JavaProcessors; +import org.eclipse.jdt.internal.corext.refactoring.participants.ResourceProcessors; +import org.eclipse.jdt.internal.corext.refactoring.reorg.IReorgPolicy.IMovePolicy; +import org.eclipse.jdt.internal.corext.refactoring.tagging.IQualifiedNameUpdating; +import org.eclipse.jdt.internal.corext.util.Resources; + +import org.eclipse.jdt.ui.refactoring.IRefactoringProcessorIds; + +public final class JavaMoveProcessor extends MoveProcessor implements IQualifiedNameUpdating, IReorgDestinationValidator { + + private ICreateTargetQueries fCreateTargetQueries; + + private IMovePolicy fMovePolicy; + + private IReorgQueries fReorgQueries; + + private boolean fWasCanceled; + + public JavaMoveProcessor(IMovePolicy policy) { + fMovePolicy= policy; + } + + public JavaMoveProcessor(JavaRefactoringArguments arguments, RefactoringStatus status) { + RefactoringStatus initializeStatus= initialize(arguments); + status.merge(initializeStatus); + } + + public boolean canChildrenBeDestinations(IReorgDestination destination) { + return fMovePolicy.canChildrenBeDestinations(destination); + } + + public boolean canElementBeDestination(IReorgDestination destination) { + return fMovePolicy.canElementBeDestination(destination); + } + + public boolean canEnableQualifiedNameUpdating() { + return fMovePolicy.canEnableQualifiedNameUpdating(); + } + + public boolean canUpdateQualifiedNames() { + return fMovePolicy.canUpdateQualifiedNames(); + } + + /** + * Checks if Java references to the selected element(s) can be updated if moved to + * the selected destination. Even if false, participants could still update + * non-Java references. + * + * @return true iff Java references to the moved element can be updated + * @since 3.5 + */ + public boolean canUpdateJavaReferences() { + return fMovePolicy.canUpdateJavaReferences(); + } + + /** + * DO NOT REMOVE, used in a product, see https://bugs.eclipse.org/299631 . + * @return true iff Java references to the moved element can be updated + * @deprecated since 3.5, replaced by {@link #canUpdateJavaReferences()} + */ + public boolean canUpdateReferences() { + return canUpdateJavaReferences(); + } + + @Override + public RefactoringStatus checkFinalConditions(IProgressMonitor pm, CheckConditionsContext context) throws CoreException { + try { + Assert.isNotNull(fReorgQueries); + fWasCanceled= false; + return fMovePolicy.checkFinalConditions(pm, context, fReorgQueries); + } catch (OperationCanceledException e) { + fWasCanceled= true; + throw e; + } + } + + @Override + public RefactoringStatus checkInitialConditions(IProgressMonitor pm) throws CoreException { + pm.beginTask("", 1); //$NON-NLS-1$ + try { + RefactoringStatus result= new RefactoringStatus(); + result.merge(RefactoringStatus.create(Resources.checkInSync(ReorgUtils.getNotNulls(fMovePolicy.getResources())))); + IResource[] javaResources= ReorgUtils.getResources(fMovePolicy.getJavaElements()); + result.merge(RefactoringStatus.create(Resources.checkInSync(ReorgUtils.getNotNulls(javaResources)))); + return result; + } finally { + pm.done(); + } + } + + @Override + public Change createChange(IProgressMonitor pm) throws CoreException { + Assert.isTrue(fMovePolicy.getJavaElementDestination() == null || fMovePolicy.getResourceDestination() == null); + Assert.isTrue(fMovePolicy.getJavaElementDestination() != null || fMovePolicy.getResourceDestination() != null); + try { + final DynamicValidationStateChange result= new DynamicValidationStateChange(RefactoringCoreMessages.JavaMoveProcessor_change_name) { + + @Override + public ChangeDescriptor getDescriptor() { + return fMovePolicy.getDescriptor(); + } + + @Override + public Change perform(IProgressMonitor pm2) throws CoreException { + Change change= super.perform(pm2); + Change[] changes= getChildren(); + for (int index= 0; index < changes.length; index++) { + if (!(changes[index] instanceof TextEditBasedChange)) + return null; + } + return change; + } + }; + CreateTargetExecutionLog log= null; + if (fCreateTargetQueries instanceof MonitoringCreateTargetQueries) { + final MonitoringCreateTargetQueries queries= (MonitoringCreateTargetQueries) fCreateTargetQueries; + final ICreateTargetQueries delegate= queries.getDelegate(); + if (delegate instanceof LoggedCreateTargetQueries) + log= queries.getCreateTargetExecutionLog(); + } + if (log != null) { + final Object[] selected= log.getSelectedElements(); + for (int index= 0; index < selected.length; index++) { + result.add(new LoggedCreateTargetChange(selected[index], fCreateTargetQueries)); + } + } + Change change= fMovePolicy.createChange(pm); + if (change instanceof CompositeChange) { + CompositeChange subComposite= (CompositeChange) change; + result.merge(subComposite); + } else { + result.add(change); + } + return result; + } finally { + pm.done(); + } + } + + private String[] getAffectedProjectNatures() throws CoreException { + String[] jNatures= JavaProcessors.computeAffectedNaturs(fMovePolicy.getJavaElements()); + String[] rNatures= ResourceProcessors.computeAffectedNatures(fMovePolicy.getResources()); + Set result= new HashSet(); + result.addAll(Arrays.asList(jNatures)); + result.addAll(Arrays.asList(rNatures)); + return result.toArray(new String[result.size()]); + } + + public Object getCommonParentForInputElements() { + return new ParentChecker(fMovePolicy.getResources(), fMovePolicy.getJavaElements()).getCommonParent(); + } + + public ICreateTargetQuery getCreateTargetQuery() { + return fMovePolicy.getCreateTargetQuery(fCreateTargetQueries); + } + + protected Object getDestination() { + IJavaElement je= fMovePolicy.getJavaElementDestination(); + if (je != null) + return je; + return fMovePolicy.getResourceDestination(); + } + + @Override + public Object[] getElements() { + List result= new ArrayList(); + result.addAll(Arrays.asList(fMovePolicy.getJavaElements())); + result.addAll(Arrays.asList(fMovePolicy.getResources())); + return result.toArray(); + } + + public String getFilePatterns() { + return fMovePolicy.getFilePatterns(); + } + + @Override + public String getIdentifier() { + return IRefactoringProcessorIds.MOVE_PROCESSOR; + } + + public IJavaElement[] getJavaElements() { + return fMovePolicy.getJavaElements(); + } + + @Override + public String getProcessorName() { + return RefactoringCoreMessages.MoveRefactoring_0; + } + + public IResource[] getResources() { + return fMovePolicy.getResources(); + } + + public boolean getUpdateQualifiedNames() { + return fMovePolicy.getUpdateQualifiedNames(); + } + + public boolean getUpdateReferences() { + return fMovePolicy.getUpdateReferences(); + } + + public boolean hasAllInputSet() { + return fMovePolicy.hasAllInputSet(); + } + + public boolean hasDestinationSet() { + return fMovePolicy.getJavaElementDestination() != null || fMovePolicy.getResourceDestination() != null; + } + + private RefactoringStatus initialize(JavaRefactoringArguments arguments) { + setReorgQueries(new NullReorgQueries()); + final RefactoringStatus status= new RefactoringStatus(); + fMovePolicy= ReorgPolicyFactory.createMovePolicy(status, arguments); + if (fMovePolicy != null && !status.hasFatalError()) { + final CreateTargetExecutionLog log= ReorgPolicyFactory.loadCreateTargetExecutionLog(arguments); + if (log != null && !status.hasFatalError()) { + fMovePolicy.setDestinationCheck(false); + fCreateTargetQueries= new MonitoringCreateTargetQueries(new LoggedCreateTargetQueries(log), log); + } + status.merge(fMovePolicy.initialize(arguments)); + } + return status; + } + + @Override + public boolean isApplicable() throws CoreException { + return fMovePolicy.canEnable(); + } + + public boolean isTextualMove() { + return fMovePolicy.isTextualMove(); + } + + @Override + public RefactoringParticipant[] loadParticipants(RefactoringStatus status, SharableParticipants shared) throws CoreException { + return fMovePolicy.loadParticipants(status, this, getAffectedProjectNatures(), shared); + } + + @Override + public Change postCreateChange(Change[] participantChanges, IProgressMonitor pm) throws CoreException { + return fMovePolicy.postCreateChange(participantChanges, pm); + } + + public void setCreateTargetQueries(ICreateTargetQueries queries) { + Assert.isNotNull(queries); + fCreateTargetQueries= new MonitoringCreateTargetQueries(queries, fMovePolicy.getCreateTargetExecutionLog()); + } + + public RefactoringStatus setDestination(IReorgDestination destination) throws JavaModelException { + fMovePolicy.setDestination(destination); + return fMovePolicy.verifyDestination(destination); + } + + public void setFilePatterns(String patterns) { + fMovePolicy.setFilePatterns(patterns); + } + + public void setReorgQueries(IReorgQueries queries) { + Assert.isNotNull(queries); + fReorgQueries= queries; + } + + public void setUpdateQualifiedNames(boolean update) { + fMovePolicy.setUpdateQualifiedNames(update); + } + + public void setUpdateReferences(boolean update) { + fMovePolicy.setUpdateReferences(update); + } + + public boolean wasCanceled() { + return fWasCanceled; + } + + public int getSaveMode() { + return fMovePolicy.getSaveMode(); + } +}