Search code examples
javaantcode-generationbuildingprecompile

Java - Using Ant to automatically generate boilerplate code


Intro: I'm asking this before I try, fail and get frustrated as I have 0 experience with Apache Ant. A simple 'yes this will work' may suffice, or if it won't please tell me what will.

Situation: I'm working on a project that uses JavaFX to create a GUI. JavaFX relies on Java Bean-like objects that require a lot of boilerplate code for it's properties. For example, all functionality I want to have is a String called name with default value "Unnamed", or in a minimal Java syntax:

String name = "Unnamed";

In JavaFX the minimum amount of code increases a lot to give the same functionality (where functionality in this case means to me that I can set and get a certain variable to use in my program):

private StringProperty name = new StringProperty("Unnamed");
public final String getName() { return name.get(); }
public final void setName(String value) { name.set(value); }

Question: Can I use Ant to generate this boilerplate code?

It seems possible to make Ant scripts that function as (Java) preprocessors. For instance by using the regex replace (https://ant.apache.org/manual/Tasks/replaceregexp.html) functions. I'm thinking of lines of code similar to this in my code, which then will be auto-replaced:

<TagToSignifyReplaceableLine> StringProperty person "Unnamed"

Final remark: As I've said before I have never used Ant before, so I want to check with you if 1) this can be done and 2) if this is a good way to do it or if there are better ways.

Thanks!


Solution

  • Yes, possible. You can even implement your own Ant task, that does this job very easily.

    Something like so in ant:

    <taskdef name="codegen" classpath="bin/" classname="com.example.CodeGen" />
    

    and then

    <codegen className="Test.java">
       <Property name="StringProperty.name" value="Unnamed"/>
    </codegen>
    

    The CodeGen.java then like so:

    public class CodeGen extends Task {
        private String className = null;
        private List properties = new ArrayList();
    
        public void setClassName(String className) {
            this.className = className;
        }
    
        /**
         * Called by ant for every &lt;property&gt; tag of the task.
         *  
         * @param property The property.
         */
        public void addConfiguredProperty(Property property) {
          properties.add(property);
        }
    
        public void execute() throws BuildException {
            // here we go!
        }
    
    }