package org.python.pydev.editor.refactoring; import java.io.File; import java.util.List; import java.util.Set; import org.eclipse.core.resources.IContainer; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.python.pydev.core.FullRepIterable; import org.python.pydev.core.MisconfigurationException; import org.python.pydev.core.log.Log; import org.python.pydev.plugin.nature.PythonNature; import org.python.pydev.shared_core.string.StringUtils; public class MultiModuleMoveRefactoringRequest extends PyRefactoringRequest { private String initialName; private IContainer target; public MultiModuleMoveRefactoringRequest(List<ModuleRenameRefactoringRequest> requests, IContainer target) throws MisconfigurationException, TargetNotInPythonpathException { super(requests.toArray(new RefactoringRequest[requests.size()])); PythonNature nature = PythonNature.getPythonNature(target); File file = target.getLocation().toFile(); this.target = target; this.initialName = nature.resolveModule(file); IPath fullPath = target.getFullPath(); if (this.initialName == null) { //Check if it's a source folder... try { Set<String> projectSourcePathSet = nature.getPythonPathNature().getProjectSourcePathSet(true); for (String string : projectSourcePathSet) { if (new Path(string).equals(fullPath)) { this.initialName = ""; break; } } } catch (CoreException e) { Log.log(e); } } if (this.initialName == null) { throw new TargetNotInPythonpathException("Unable to resolve file as a python module: " + fullPath); } } @Override public void setInputName(String text) { Assert.isNotNull(text, "Not expecting input name to be null."); this.inputName = text; Path initialPath = new Path(StringUtils.replaceAll(this.initialName, ".", "/")); Path finalPath = new Path(StringUtils.replaceAll(text, ".", "/")); IContainer initialContainer = target; IContainer finalContainer; if (initialPath.equals(finalPath)) { finalContainer = initialContainer; } else if (initialPath.isPrefixOf(finalPath)) { IPath walk = finalPath.removeFirstSegments(initialPath.segmentCount()); finalContainer = initialContainer.getFolder(walk); } else { IPath walk = finalPath.removeFirstSegments(initialPath.segmentCount()); finalContainer = initialContainer; for (int i = 0; i < walk.segmentCount(); i--) { finalContainer = finalContainer.getParent(); } } for (RefactoringRequest r : requests) { ModuleRenameRefactoringRequest modReq = (ModuleRenameRefactoringRequest) r; modReq.setTarget(finalContainer); String lastPart = FullRepIterable.getLastPart(r.initialName); if (text.length() > 0) { r.inputName = text + "." + lastPart; } else { r.inputName = lastPart; } } } @Override public String getInitialName() { return this.initialName; } public IContainer getTarget() { return this.target; } }