views:

290

answers:

3

I have a set of Java 5 source files with old-style Doclet tags, comments and annotations. And based on that I would like to write a generator for another set of Java classes.

What is the best way to do that? And are there any good standalone libraries for code analysis/generation in Java? Any shared exprience in this field is appreciated.

So, far I have found these:

  • JaxME's Java Source Reflection - seems good, but it does not seem to support annotations. Also it had no release since 2006.

  • Annogen - uses JDK's Doclet generator, which has some bugs under 1.5 JDK. Also it had no releases for a long time.

  • Javaparser - seems good as well and pretty recent, but only supports Visitor pattern for a single class i.e. no query mechanism like in the 2 above packages.

+1  A: 

Both the NetBeans IDE and Eclipse JDT projects have considerable Java code analysis/generation logic. I don't know what their dependencies are (i.e., can you use them as standalone libs), but other than that, I would take a good look at those two: it's unlikely there's a java code analysis library under more intensive development and more up to date.

Update:

PMD might be of interest as well:

PMD scans Java source code and looks for potential problems like:

* Possible bugs - empty try/catch/finally/switch statements
* Dead code - unused local variables, parameters and private methods
* Suboptimal code - wasteful String/StringBuffer usage
* Overcomplicated expressions - unnecessary if statements, for loops that could be while loops
* Duplicate code - copied/pasted code means copied/pasted bugs

Additionally, this blog entry discusses various static code analysis tools.

Tomislav Nakic-Alfirevic
Eclipse has JET (Java Emmiter Templates), but it does not work outside Eclipse (http://wiki.eclipse.org/JET_FAQ_How_do_I_run_a_JET_transformation_from_Java%3F).
Superfilin
I've updated my answer with a couple of new items.
Tomislav Nakic-Alfirevic
I have tried to play a bit with PMD, but it's API is a bit too complex. I will continue on experimenting and post you my results.
Superfilin
Thanks for the update.
Tomislav Nakic-Alfirevic
I ended up using PMD together with its AST and XPath.
Superfilin
Posted an example as a separate answer.
Superfilin
+1  A: 

If you only need to generate syntactically correct Java code, check the Codemodel.

lexicore
Codemodel is just a code generator, and it does not have a tool for parsing java code. Though +1 for the link :).
Superfilin
Yes, it is _only_ a code generator, I'd like emphasize that once again. Very nice API to my taste.
lexicore
A: 

I ended up using PMD. Code example can be seen below:

    final Java15Parser parser = new Java15Parser();
    final FileInputStream stream = new FileInputStream("VehicleServiceType.java");

    final Object c = parser.parse(new InputStreamReader(stream));

    final XPath xpath = new BaseXPath("//TypeDeclaration/Annotation/NormalAnnotation[Name/@Image = 'WebService']",
        new DocumentNavigator());

    for (final Iterator iter = xpath.selectNodes(c).iterator(); iter.hasNext();) {
      final Object obj = iter.next();
      // Do code generation based on annotations...
    }
Superfilin
Thanks for the feedback, nice to know you can traverse a class definition using XPath!
Tomislav Nakic-Alfirevic