eclipse jdt organize imports 实现
大致说下这个功能的思路:
1:用字符串构建java文件
2:在内存中构建ijavaelement对象,并对这个对象进行重组(用到了jdt的OrganizeImportsOperation)
3:IFile写入文件
Stringpath="";//文件绝对路径
IJavaProjectproject=null;
IPathgenSourceFolderPath=newPath(filePath);
for(IProjectp:ResourcesPlugin.getWorkspace().getRoot().getProjects()){
if(p.isOpen()){
//查找工程的实际路径是否在源代码生成路径上,如果是,则就是该工程
if(p.getLocation().isPrefixOf(genSourceFolderPath)){
project=JavaCore.create(p);
}
}
}
if(project==null){
thrownewAresCompilerException("无法生成源码文件:"+path);
}
IPathjavaFilePath=newPath(path).makeRelativeTo(project.getProject().getLocation());
IFilejavaFile=project.getProject().getFile(javaFilePath);
IJavaElementelement=JavaCore.create(javaFile);
StringlineDelimiter=StubUtility.getLineDelimiterUsed(null);
formattedSource=CodeFormatterUtil.format(CodeFormatter.K_COMPILATION_UNIT,source.toString(),0,
lineDelimiter,(IJavaProject)null);
ASTParserparser=ASTParser.newParser(AST.JLS3);
try{
element=((ICompilationUnit)element).getWorkingCopy(null);
((ICompilationUnit)element).getBuffer().setContents(formattedSource);
}catch(JavaModelExceptione){
e.printStackTrace();
}
parser.setSource((ICompilationUnit)element);
finalCompilationUnitnode=(CompilationUnit)parser.createAST(newNullProgressMonitor());
OrganizeImportsOperationoperation=newOrganizeImportsOperation((ICompilationUnit)element,node,true,false,false,newIChooseImportQuery(){
publicTypeNameMatch[]chooseImports(TypeNameMatch[][]openChoices,ISourceRange[]ranges){
returnnewTypeNameMatch[0];
}
});
InputStreaminputStream=null;
try{
TextEdittextEdit=operation.createTextEdit(null);
JavaModelUtil.applyEdit((ICompilationUnit)element,textEdit,false,newNullProgressMonitor());
formattedSource=((ICompilationUnit)element).getBuffer().getContents();
inputStream=newByteArrayInputStream(formattedSource.getBytes(javaFile.getCharset()));
if(!javaFile.exists()){
ResourcesUtil.safelyCreateFile(javaFile,inputStream,false,newNullProgressMonitor());
}else{
javaFile.setContents(inputStream,IFile.FORCE,newNullProgressMonitor());
}
}catch(Exceptione){
e.printStackTrace();
}finally{
IOUtils.closeQuietly(inputStream);
}