Saturday, March 20, 2010

Parse Java Source Code with JaxMe JS

You can parse Java Source Code easily with JaxMe JS.

Here is a code examples that demonstrates how to use JaxME JS. The code won't work as it is, but it's useful to demonstrate JaxMe JS usage in practice.

A weakness of JaxMe JS is that it can only parse and generate Java 1.4 source code files. As of version 2, JaxMe JS cannot parse/generate Java 5 source code that uses Java generics and Java annotations features.

        JavaSourceFactory jsf = new JavaSourceFactory();
        JavaParser jp = new JavaParser(jsf);
        jp.parse(file);
        Iterator<JavaSource> javaSources = jsf.getJavaSources();
        JavaSource javaSource = javaSources.next();
        ObjectModel model = new ObjectModel(javaSource.getPackageName(), javaSource.getClassName());
        try {
            for (JavaField field : javaSource.getFields()) {
                log.log(Level.INFO, "Processing " + field.asString());
                model.addProperty(field.getName(), Class.forName(field
                        .getType().toString()));
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            throw new ParserException(e);
        }
        return model; 
Put the following on your Maven project's pom.xml to specify the JaxME JS depency. ANTLR must be specified too.
    <dependencies>
        <dependency>
            <groupId>org.apache.ws.jaxme</groupId>
            <artifactId>jaxmejs</artifactId>
            <version>0.5.2</version>
        </dependency>
        <dependency>
         <groupId>antlr</groupId>
         <artifactId>antlr</artifactId>
         <version>2.7.7</version>
        </dependency>
    </dependencies>
For more information on grammar/language parsing and code generation with Java (and ANTLR), get the book The Definitive Antlr Reference: Building Domain-Specific Languages (Pragmatic Programmers).

2 comments:

  1. I was playing with this today for a maven generate-sources plugin.

    Unfortunately, it's also unable to correctly parse arrays: http://mail-archives.apache.org/mod_mbox//ws-jaxme-dev/200510.mbox/%3COFADE79BC8.3C9FFFCE-ONC1257099.00083D38-C1257099.000AE063@de.ibm.com%3E.

    Apparently broken since 2005. Would have been nice library if it actually worked.

    ReplyDelete
  2. I'm working on a library that will support this type of thing and more for Java 1.5. I'll post here when I have it ready.

    ReplyDelete