Guide to using Modello

Modello is a tool for generating resources from a simple model. From a simple model you can generate things like:

  • Java sources
  • XML serialization code for the model
  • XML deserialization code for model
  • Model documentation
  • XSD

A typical modello model looks like the following:

<model xmlns="http://modello.codehaus.org/MODELLO/1.4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://modello.codehaus.org/MODELLO/1.4.0 http://modello.codehaus.org/xsd/modello-1.4.0.xsd"
  xml.namespace="http://maven.apache.org/plugins/maven-archetype-plugin/archetype/${version}"
  xml.schemaLocation="http://maven.apache.org/xsd/archetype-${version}.xsd">
  <id>archetype</id>
  <name>Archetype</name>
  <description>
    <![CDATA[Maven's model for the old archetype descriptor (ie for Archetype 1.0.x).
    <p>The metadata about an archetype is stored in the <code>archetype.xml</code> file located
    in the <code>META-INF/maven</code> directory of its jar file.</p>]]>
  </description>

  <defaults>
    <default>
      <key>package</key>
      <value>org.apache.maven.archetype.model</value>
    </default>
  </defaults>

  <classes>
    <class rootElement="true" xml.tagName="archetype">
      <name>ArchetypeModel</name>
      <description>Describes the assembly layout and packaging.</description>
      <version>1.0.0</version>
      <fields>
        <field>
          <name>id</name>
          <version>1.0.0</version>
          <required>true</required>
          <type>String</type>
          <description><![CDATA[The value should be the same as the artifactId in the archetype <code>pom.xml</code>.]]></description>
        </field>
        <field>
          <name>allowPartial</name>
          <version>1.0.0</version>
          <type>boolean</type>
          <description><![CDATA[Setting this option to <code>true</code> makes it possible to run the
            <code>archetype:create</code> even on existing projects.]]></description>
        </field>

        <field xdoc.separator="blank">
          <name>sources</name>
          <version>1.0.0</version>
          <description><![CDATA[Files that will go into <code>src/main/java</code>.]]></description>
          <association>
            <type>Source</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field>
          <name>resources</name>
          <version>1.0.0</version>
          <description><![CDATA[Files that will go into <code>src/main/resources</code>.]]></description>
          <association>
            <type>Resource</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>

        <field xdoc.separator="blank">
          <name>testSources</name>
          <version>1.0.0</version>
          <description><![CDATA[Files that will go into <code>src/test/java</code>.]]></description>
          <association xml.tagName="source">
            <type>Source</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
        <field>
          <name>testResources</name>
          <version>1.0.0</version>
          <description><![CDATA[Files that will go into <code>src/test/resources</code>.]]></description>
          <association xml.tagName="resource">
            <type>Resource</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>

        <field xdoc.separator="blank">
          <name>siteResources</name>
          <version>1.0.0</version>
          <description><![CDATA[Files that will go into <code>src/site</code>.]]></description>
          <association xml.tagName="resource">
            <type>Resource</type>
            <multiplicity>*</multiplicity>
          </association>
        </field>
      </fields>
    </class>

    <class>
      <name>Source</name>
      <description>Describes a source file. Note that source files are always filtered, unlike resources that
        can be non-filtered.</description>
      <version>1.0.0</version>
      <fields>
        <field xml.content="true">
          <name>file</name>
          <version>1.0.0</version>
          <type>String</type>
          <description><![CDATA[The source file.]]></description>
        </field>
        <field xml.attribute="true">
          <name>encoding</name>
          <version>1.0.0</version>
          <type>String</type>
          <description><![CDATA[The encoding to be used when reading/writing this file.
            Platform encoding is used by default, or ISO-8859-1 when filename ends in <code>.properties</code>]]></description>
        </field>
      </fields>
    </class>
    <class>
      <name>Resource</name>
      <description>Describes a resource file.</description>
      <version>1.0.0</version>
      <fields>
        <field xml.content="true">
          <name>file</name>
          <version>1.0.0</version>
          <type>String</type>
          <description><![CDATA[The resource file.]]></description>
        </field>
        <field xml.attribute="true">
          <name>encoding</name>
          <version>1.0.0</version>
          <type>String</type>
          <description><![CDATA[The encoding to be used when reading/writing this file.
            Platform encoding is used by default, or ISO-8859-1 when filename ends in <code>.properties</code>]]></description>
        </field>
        <field xml.attribute="true">
          <name>filtered</name>
          <version>1.0.0</version>
          <type>boolean</type>
          <defaultValue>true</defaultValue>
          <description>A resource can be filtered, which means the file will be used as Velocity template.
          It can be non-filtered, which means the file will be copied without modification.</description>
        </field>
      </fields>
    </class>
  </classes>
</model>

To utilize Modello you would configure the maven-modello-plugin something like the following where you want to generate the Java sources for the model, the xpp3 serialization code and the xpp3 deserialization code:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.modello</groupId>
        <artifactId>modello-maven-plugin</artifactId>
        <version>1.8.3</version>
        <executions>
          <execution>
            <goals>
              <!-- Generate the xpp3 reader code -->
              <goal>xpp3-reader</goal>
              <!-- Generate the xpp3 writer code -->
              <goal>xpp3-writer</goal>
              <!-- Generate the Java sources for the model itself -->
              <goal>java</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <models>
            <model>src/main/mdo/descriptor.mdo</model>
          </models>
          <version>1.0.0</version>
          <useJava5>true</useJava5>
        </configuration>
      </plugin>
    </plugins>
  </build>
  ...
</project>