Search in sources :

Example 36 with RenameArguments

use of org.eclipse.ltk.core.refactoring.participants.RenameArguments in project bndtools by bndtools.

the class PkgRenameParticipant method createChange.

@Override
public Change createChange(IProgressMonitor pm) throws CoreException, OperationCanceledException {
    final Map<IFile, TextChange> fileChanges = new HashMap<IFile, TextChange>();
    IResourceProxyVisitor visitor = new IResourceProxyVisitor() {

        @Override
        public boolean visit(IResourceProxy proxy) throws CoreException {
            if ((proxy.getType() == IResource.FOLDER) || (proxy.getType() == IResource.PROJECT)) {
                return true;
            }
            if (!((proxy.getType() == IResource.FILE) && proxy.getName().toLowerCase().endsWith(".bnd"))) {
                return false;
            }
            /* we're dealing with a *.bnd file */
            /* get the proxied file */
            IFile resource = (IFile) proxy.requestResource();
            /* read the file as a single string */
            String bndFileText = null;
            try {
                bndFileText = FileUtils.readFully(resource).get();
            } catch (Exception e) {
                String str = "Could not read file " + proxy.getName();
                logger.logError(str, e);
                throw new OperationCanceledException(str);
            }
            /*
                 * get the previous change for this file if it exists, or otherwise create a new change for it, but do
                 * not store it yet: wait until we know if there are actually changes in the file
                 */
            TextChange fileChange = getTextChange(resource);
            final boolean fileChangeIsNew = (fileChange == null);
            if (fileChange == null) {
                fileChange = new TextFileChange(proxy.getName(), resource);
                fileChange.setEdit(new MultiTextEdit());
            }
            TextEdit rootEdit = fileChange.getEdit();
            BndEditModel model = new BndEditModel();
            Document document = new Document(bndFileText);
            try {
                model.loadFrom(document);
            } catch (IOException e) {
                String str = "Could not load document " + proxy.getName();
                logger.logError(str, e);
                throw new OperationCanceledException(str);
            }
            /* loop over all renames to perform */
            for (Map.Entry<IPackageFragment, RenameArguments> entry : pkgFragments.entrySet()) {
                IPackageFragment pkgFragment = entry.getKey();
                RenameArguments arguments = entry.getValue();
                final String oldName = pkgFragment.getElementName();
                final String newName = arguments.getNewName();
                List<ImportPattern> newImportedPackages = makeNewHeaders(model.getImportPatterns(), oldName, newName);
                if (newImportedPackages != null) {
                    model.setImportPatterns(newImportedPackages);
                }
                List<ExportedPackage> newExportedPackages = makeNewHeaders(model.getExportedPackages(), oldName, newName);
                if (newExportedPackages != null) {
                    model.setExportedPackages(newExportedPackages);
                }
                List<String> newPrivatePackages = makeNewHeaders(model.getPrivatePackages(), oldName, newName);
                if (newPrivatePackages != null) {
                    model.setPrivatePackages(newPrivatePackages);
                }
                Map<String, String> changes = model.getDocumentChanges();
                for (Iterator<Entry<String, String>> iter = changes.entrySet().iterator(); iter.hasNext(); ) {
                    Entry<String, String> change = iter.next();
                    String propertyName = change.getKey();
                    String stringValue = change.getValue();
                    addEdit(document, rootEdit, propertyName, stringValue);
                    iter.remove();
                }
                Pattern pattern = Pattern.compile(/* match start boundary */
                "(^|" + grammarSeparator + ")" + /* match bundle activator */
                "(Bundle-Activator\\s*:\\s*)" + /* match itself / package name */
                "(" + Pattern.quote(oldName) + ")" + /* match class name */
                "(\\.[^\\.]+)" + /* match end boundary */
                "(" + grammarSeparator + "|" + Pattern.quote("\\") + "|$)");
                /* find all matches to replace and add them to the root edit */
                Matcher matcher = pattern.matcher(bndFileText);
                while (matcher.find()) {
                    rootEdit.addChild(new ReplaceEdit(matcher.start(3), matcher.group(3).length(), newName));
                }
            }
            /*
                 * only store the changes when no changes were stored before for this file and when there are actually
                 * changes.
                 */
            if (fileChangeIsNew && rootEdit.hasChildren()) {
                fileChanges.put(resource, fileChange);
            }
            return false;
        }
    };
    /* determine which projects have to be visited */
    Set<IProject> projectsToVisit = new HashSet<IProject>();
    for (IPackageFragment pkgFragment : pkgFragments.keySet()) {
        projectsToVisit.add(pkgFragment.getResource().getProject());
        for (IProject projectToVisit : pkgFragment.getResource().getProject().getReferencingProjects()) {
            projectsToVisit.add(projectToVisit);
        }
        for (IProject projectToVisit : pkgFragment.getResource().getProject().getReferencedProjects()) {
            projectsToVisit.add(projectToVisit);
        }
    }
    /* visit the projects */
    for (IProject projectToVisit : projectsToVisit) {
        projectToVisit.accept(visitor, IContainer.NONE);
    }
    if (fileChanges.isEmpty()) {
        /* no changes at all */
        return null;
    }
    /* build a composite change with all changes */
    CompositeChange cs = new CompositeChange(changeTitle);
    for (TextChange fileChange : fileChanges.values()) {
        cs.add(fileChange);
    }
    return cs;
}
Also used : IFile(org.eclipse.core.resources.IFile) IResourceProxyVisitor(org.eclipse.core.resources.IResourceProxyVisitor) HashMap(java.util.HashMap) RenameArguments(org.eclipse.ltk.core.refactoring.participants.RenameArguments) Matcher(java.util.regex.Matcher) OperationCanceledException(org.eclipse.core.runtime.OperationCanceledException) IDocument(aQute.bnd.properties.IDocument) Document(aQute.bnd.properties.Document) Entry(java.util.Map.Entry) IResourceProxy(org.eclipse.core.resources.IResourceProxy) CompositeChange(org.eclipse.ltk.core.refactoring.CompositeChange) BndEditModel(aQute.bnd.build.model.BndEditModel) HashSet(java.util.HashSet) ImportPattern(aQute.bnd.build.model.clauses.ImportPattern) Pattern(java.util.regex.Pattern) IPackageFragment(org.eclipse.jdt.core.IPackageFragment) TextChange(org.eclipse.ltk.core.refactoring.TextChange) IOException(java.io.IOException) TextFileChange(org.eclipse.ltk.core.refactoring.TextFileChange) CoreException(org.eclipse.core.runtime.CoreException) OperationCanceledException(org.eclipse.core.runtime.OperationCanceledException) IOException(java.io.IOException) IProject(org.eclipse.core.resources.IProject) ImportPattern(aQute.bnd.build.model.clauses.ImportPattern) MultiTextEdit(org.eclipse.text.edits.MultiTextEdit) TextEdit(org.eclipse.text.edits.TextEdit) ExportedPackage(aQute.bnd.build.model.clauses.ExportedPackage) ReplaceEdit(org.eclipse.text.edits.ReplaceEdit) HashMap(java.util.HashMap) Map(java.util.Map) MultiTextEdit(org.eclipse.text.edits.MultiTextEdit)

Aggregations

RenameArguments (org.eclipse.ltk.core.refactoring.participants.RenameArguments)36 Test (org.junit.Test)15 IPackageFragment (org.eclipse.jdt.core.IPackageFragment)13 ArrayList (java.util.ArrayList)12 List (java.util.List)11 ICompilationUnit (org.eclipse.jdt.core.ICompilationUnit)9 RefactoringStatus (org.eclipse.ltk.core.refactoring.RefactoringStatus)8 RenameJavaElementDescriptor (org.eclipse.jdt.core.refactoring.descriptors.RenameJavaElementDescriptor)7 MoveArguments (org.eclipse.ltk.core.refactoring.participants.MoveArguments)7 IType (org.eclipse.jdt.core.IType)6 RenameRefactoring (org.eclipse.ltk.core.refactoring.participants.RenameRefactoring)6 BaseTest (org.eclipse.che.plugin.java.server.che.BaseTest)5 IFolder (org.eclipse.core.resources.IFolder)5 NullProgressMonitor (org.eclipse.core.runtime.NullProgressMonitor)5 IField (org.eclipse.jdt.core.IField)5 Ignore (org.junit.Ignore)5 IMethod (org.eclipse.jdt.core.IMethod)4 IResource (org.eclipse.core.resources.IResource)3 IPath (org.eclipse.core.runtime.IPath)3 RenamePackageProcessor (org.eclipse.jdt.internal.corext.refactoring.rename.RenamePackageProcessor)3