package blade.migrate.core; import blade.migrate.api.AutoMigrateException; import blade.migrate.api.AutoMigrator; import blade.migrate.api.Problem; import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.dom.rewrite.ImportRewrite; import org.eclipse.jdt.internal.core.util.Util; import org.eclipse.text.edits.TextEdit; public abstract class ImportStatementMigrator extends JavaFileMigrator implements AutoMigrator { private static final String PREFIX = "import:"; private final Map<String, String> _imports = new HashMap<>(); public ImportStatementMigrator(String[] imports, String[] fixedImports) { for(int i = 0; i < imports.length; i++) { _imports.put(imports[i], fixedImports[i]); } } @Override public void correctProblems(File file, List<Problem> problems) throws AutoMigrateException { final List<String> importsToRewrite = new ArrayList<>(); for (Problem problem : problems) { if (problem.autoCorrectContext instanceof String) { final String importData = problem.autoCorrectContext; if (importData != null && importData.startsWith(PREFIX)) { final String importValue = importData.substring(PREFIX.length()); if (_imports.containsKey(importValue)) { importsToRewrite.add(importValue); } } } } if (importsToRewrite.size() > 0) { ICompilationUnit source = null; final FileHelper fileHelper = new FileHelper(); final IFile javaFile; try { javaFile = WorkspaceUtil.getFileFromWorkspace(file, new WorkspaceHelper()); } catch (CoreException | IOException e1) { throw new AutoMigrateException("Unable to get java file as IFile, is project a java project?", e1); } try { source = JavaCore.createCompilationUnitFrom(javaFile); } catch (Exception e) { throw new AutoMigrateException("Could not get compilation unit for file: " + file.getName(), e); } final ImportRewrite importRewrite; try { importRewrite = ImportRewrite.create(source, true); } catch (JavaModelException e1) { e1.printStackTrace(); throw new AutoMigrateException("Unable to create import rewrite action: " + file.getName(), e1); } for (String importToRewrite : importsToRewrite) { importRewrite.removeImport(importToRewrite); final String newImport = _imports.get(importToRewrite); importRewrite.addImport(newImport); } if (importRewrite.hasRecordedChanges()) { try { final TextEdit textEdit = importRewrite.rewriteImports(new NullProgressMonitor()); final String newSource = Util.editedString(source.getSource(), textEdit); javaFile.setContents(new ByteArrayInputStream(newSource.getBytes()), IResource.FORCE, null); } catch (CoreException e) { throw new AutoMigrateException("Auto correct failed to rewrite imports", e); } } } } @Override public List<SearchResult> searchJavaFile(File file, JavaFileChecker javaFileChecker) { final List<SearchResult> searchResults = new ArrayList<>(); for (String importName : _imports.keySet()) { final SearchResult importResult = javaFileChecker.findImport(importName); if (importResult != null) { importResult.autoCorrectContext = PREFIX + importName; searchResults.add(importResult); } } return searchResults; } }