阅读更多
大致说下这个功能的思路:
1:用字符串构建java文件
2:在内存中构建ijavaelement对象,并对这个对象进行重组(用到了jdt的OrganizeImportsOperation)
3:IFile写入文件
String path = "";//文件绝对路径
IJavaProject project = null;
IPath genSourceFolderPath = new Path(filePath);
for (IProject p : ResourcesPlugin.getWorkspace().getRoot().getProjects()) {
if (p.isOpen()) {
// 查找工程的实际路径是否在源代码生成路径上,如果是,则就是该工程
if (p.getLocation().isPrefixOf(genSourceFolderPath)) {
project = JavaCore.create(p);
}
}
}
if (project == null) {
throw new AresCompilerException("无法生成源码文件:" + path);
}
IPath javaFilePath = new Path(path).makeRelativeTo(project.getProject().getLocation());
IFile javaFile = project.getProject().getFile(javaFilePath);
IJavaElement element = JavaCore.create(javaFile);
String lineDelimiter = StubUtility.getLineDelimiterUsed(null);
formattedSource = CodeFormatterUtil.format(CodeFormatter.K_COMPILATION_UNIT, source.toString(), 0,
lineDelimiter, (IJavaProject) null);
ASTParser parser = ASTParser.newParser(AST.JLS3);
try {
element = ((ICompilationUnit) element).getWorkingCopy(null);
((ICompilationUnit) element).getBuffer().setContents(formattedSource);
} catch (JavaModelException e) {
e.printStackTrace();
}
parser.setSource((ICompilationUnit)element);
final CompilationUnit node = (CompilationUnit) parser.createAST(new NullProgressMonitor());
OrganizeImportsOperation operation = new OrganizeImportsOperation((ICompilationUnit)element, node, true, false, false, new IChooseImportQuery() {
public TypeNameMatch[] chooseImports(TypeNameMatch[][] openChoices, ISourceRange[] ranges) {
return new TypeNameMatch[0];
}
});
InputStream inputStream = null;
try {
TextEdit textEdit = operation.createTextEdit(null);
JavaModelUtil.applyEdit((ICompilationUnit) element, textEdit, false, new NullProgressMonitor());
formattedSource = ((ICompilationUnit) element).getBuffer().getContents();
inputStream = new ByteArrayInputStream(formattedSource.getBytes(javaFile.getCharset()));
if (!javaFile.exists()) {
ResourcesUtil.safelyCreateFile(javaFile, inputStream, false, new NullProgressMonitor());
}else {
javaFile.setContents(inputStream, IFile.FORCE, new NullProgressMonitor());
}
} catch (Exception e) {
e.printStackTrace();
} finally{
IOUtils.closeQuietly(inputStream);
}