package org.python.pydev.editor.refactoring; import java.util.Arrays; import java.util.List; import java.util.Stack; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.python.pydev.core.log.Log; /** * This is a refactoring request which may actually be composed of multiple requests (i.e.: for when we want to * move several resources at once). */ public class PyRefactoringRequest implements IPyRefactoringRequest { protected final List<RefactoringRequest> requests; protected String inputName; public PyRefactoringRequest(RefactoringRequest... request) { this.requests = Arrays.asList(request); } @Override public List<RefactoringRequest> getRequests() { return this.requests; } @Override public void fillInitialNameAndOffset() { for (RefactoringRequest r : requests) { r.fillInitialNameAndOffset(); } } @Override public void setInputName(String text) { this.inputName = text; for (RefactoringRequest r : requests) { r.inputName = text; } } @Override public void setUpdateReferences(boolean selection) { for (RefactoringRequest r : requests) { r.setUpdateReferences(selection); } } @Override public IFile getIFileResource() { IFile f = null; for (RefactoringRequest r : requests) { if (f == null) { f = r.getIFileResource(); } else { IFile f2 = r.getIFileResource(); if (!f.equals(f2)) { // This is inconsistent return null; } } } return f; } @Override public void setSimpleResourceRename(boolean simpleResourceRename) { for (RefactoringRequest r : requests) { r.setSimpleResourceRename(simpleResourceRename); } } @Override public boolean getSimpleResourceRename() { try { Boolean b = null; for (RefactoringRequest r : requests) { if (b == null) { b = r.getSimpleResourceRename(); } else { if (b != r.getSimpleResourceRename()) { // If there's a conflict, we can't do a resource rename // (this makes no sense). return false; } } } if (b == null) { return false; } return b; } catch (Exception e) { Log.log(e); return false; } } private final Stack<IProgressMonitor> monitors = new Stack<IProgressMonitor>(); @Override public void pushMonitor(IProgressMonitor pm) { if (pm == null) { pm = new NullProgressMonitor(); } this.monitors.push(pm); for (RefactoringRequest r : requests) { r.pushMonitor(pm); } } @Override public IProgressMonitor popMonitor() { for (RefactoringRequest r : requests) { r.popMonitor(); } return this.monitors.pop(); } @Override public IProgressMonitor getMonitor() { return this.monitors.peek(); } @Override public String getInputName() { return this.inputName; } @Override public boolean isModuleRenameRefactoringRequest() { Boolean ret = null; for (RefactoringRequest r : requests) { boolean moduleRenameRefactoringRequest = r.isModuleRenameRefactoringRequest(); if (ret == null) { ret = moduleRenameRefactoringRequest; } else { if (ret != moduleRenameRefactoringRequest) { throw new AssertionError("Error: multiple request types (unexpected condition)."); } } } if (ret == null) { throw new AssertionError("Unable to determine (no requests available)"); } return ret; } @Override public String getInitialName() { for (RefactoringRequest r : requests) { return r.initialName; } throw new AssertionError("Unable to get initial name (no requests available)"); } }