<?xml version="1.0" encoding="UTF-8"?>

<!--
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you under the Apache License, Version 2.0 (the
  "License"); you may not use this file except in compliance
  with the License.  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing,
  software distributed under the License is distributed on an
  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  KIND, either express or implied.  See the License for the
  specific language governing permissions and limitations
  under the License.
-->

<model xmlns="https://codehaus-plexus.github.io/MODELLO/1.8.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="https://codehaus-plexus.github.io/MODELLO/1.8.0 https://codehaus-plexus.github.io/modello/xsd/https://codehaus-plexus.github.io/modello/xsd/modello-1.8.0.xsd"
  xml.namespace="http://maven.apache.org/DOCUMENT/${version}"
  xml.schemaLocation="http://maven.apache.org/xsd/document-${version}.xsd">
  <id>document</id>
  <name>Document</name>
  <description><![CDATA[
    <p>This is a reference for the Document descriptor model used in Doxia, also known as <code>pdf.xml</code>.</p>
    <p>It is composed of 3 parts:</p>
    <ol>
      <li>document metadata, mostly inspired by the
        <a href="http://docs.oasis-open.org/office/v1.1/">Open Document Format Specification v. 1.1</a></li>
      <li>table of content,</li>
      <li>cover description.</li>
    </ol>
    <p>An XSD is available at:</p>
    <ul>
      <li><a href="http://maven.apache.org/xsd/document-1.0.1.xsd">http://maven.apache.org/xsd/document-1.0.1.xsd</a>.</li>
    </ul>
  ]]></description>
  <defaults>
    <default>
      <key>package</key>
      <value>org.apache.maven.doxia.document</value>
    </default>
  </defaults>

  <classes>
    <class rootElement="true" xml.tagName="document">
      <name>DocumentModel</name>
      <description>Describes the overall document model.</description>
      <version>1.0.0+</version>
      <fields>
        <field xml.attribute="true">
          <name>outputName</name>
          <description><![CDATA[
            The name of the generated document, without extension.
          ]]></description>
          <version>1.0.0+</version>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>meta</name>
          <description><![CDATA[
            The Meta information properties.
          ]]></description>
          <version>1.0.0+</version>
          <association>
            <type>DocumentMeta</type>
          </association>
          <identifier>true</identifier>
        </field>
        <field xdoc.separator="blank">
          <name>toc</name>
          <description><![CDATA[
            The TOC (Table of Contents) information properties.
          ]]></description>
          <version>1.0.0+</version>
          <association>
            <type>DocumentTOC</type>
          </association>
          <identifier>true</identifier>
        </field>
        <field xdoc.separator="blank">
          <name>cover</name>
          <description><![CDATA[
            The meta data to construct a cover page for the document.
          ]]></description>
          <version>1.0.0+</version>
          <association>
            <type>DocumentCover</type>
          </association>
          <identifier>true</identifier>
        </field>
      </fields>
    </class>

    <class>
      <name>DocumentMeta</name>
      <description><![CDATA[
        <p>
          Metadata is general information about a document.
        </p>

        <p>
          The metadata elements used here were mostly inspired by the
          <a href="http://docs.oasis-open.org/office/v1.1/">Open Document Format Specification v. 1.1</a>,
          which in turn borrows heavily upon the metadata standards developed by the
          <a href="http://www.dublincore.org">Dublin Core Metadata Initiative</a>.
        </p>
      ]]></description>
      <version>1.0.0+</version>
      <fields>
        <field>
          <name>title</name>
          <version>1.0.0+</version>
          <description><![CDATA[
            The title of the document.
          ]]></description>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>author</name>
          <version>1.0.0+</version>
          <description><![CDATA[
            The unique author of the document, usually as a String of "firstName lastName". For
            more authors, you could use the &lt;authors/&gt; tag.
          ]]></description>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>authors</name>
          <version>1.0.0+</version>
          <description><![CDATA[
            The authors of the document. The names of the entities that
            are primarily responsible for the content of the document.
          ]]></description>
          <association xml.itemsStyle="wrapped" xml.tagName="author">
            <type>DocumentAuthor</type>
            <multiplicity>*</multiplicity>
          </association>
          <identifier>true</identifier>
        </field>
        <field>
          <name>subject</name>
          <version>1.0.0+</version>
          <description><![CDATA[
            The subject of the document.
          ]]></description>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>keywords</name>
          <version>1.0.0+</version>
          <description><![CDATA[
            The keywords for the document, usually as a String of comma separated keywords.
            @deprecated use the &lt;keyWords/&gt; tag instead of.
          ]]></description>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>keyWords</name>
          <version>1.0.0+</version>
          <description><![CDATA[
            A keyword pertaining to the document. The metadata can contain any
            number of keyword elements, each element specifying one keyword.
          ]]></description>
          <association xml.itemsStyle="wrapped" xml.tagName="keyWord">
            <type>String</type>
            <multiplicity>*</multiplicity>
          </association>
          <identifier>true</identifier>
        </field>
        <field>
          <name>pageSize</name>
          <version>1.0.0+</version>
          <description><![CDATA[
            The pagesize of the document.
            At least "US", "USLetter" and "A4" should be supported.
          ]]></description>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>generator</name>
          <version>1.0.0+</version>
          <description><![CDATA[
             A string that identifies the application or tool that was
             used to create or last modify the document.
          ]]></description>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>description</name>
          <version>1.0.0+</version>
          <description><![CDATA[
             A brief description of the document.
          ]]></description>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>initialCreator</name>
          <version>1.0.0+</version>
          <description><![CDATA[
            The name of the person who created the document initially.
          ]]></description>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>creator</name>
          <version>1.0.0+</version>
          <description><![CDATA[
            The name of the person who last modified the document.
          ]]></description>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>printedBy</name>
          <version>1.0.0+</version>
          <description><![CDATA[
            The name of the person who last printed the document.
          ]]></description>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>creationDate</name>
          <version>1.0.0+</version>
          <description><![CDATA[
            The date and time when the document was created initially.
            Use the ISO 8601 format "yyyy-MM-dd'T'HH:mm:ss.SSS" in xml.
          ]]></description>
          <type>Date</type>
          <identifier>true</identifier>
        </field>
        <field java.getter="false">
          <name>creationdate</name>
          <version>1.0.1+</version>
          <description><![CDATA[
            The date as String (recommended format is ISO 8601) when the document was created initially.
            Only used if <code>creationDate</code> is not set.
            @since 1.1.1
          ]]></description>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>date</name>
          <version>1.0.0+</version>
          <description><![CDATA[
            The date and time when the document was last modified.
            Use the ISO 8601 format "yyyy-MM-dd'T'HH:mm:ss.SSS" in xml.
          ]]></description>
          <type>Date</type>
          <identifier>true</identifier>
        </field>
        <field java.getter="false">
          <name>modifydate</name>
          <version>1.0.1+</version>
          <description><![CDATA[
            The date as String (recommended format is ISO 8601) when the document was last modified.
            Only used if <code>date</code> is not set.
            @since 1.1.1
          ]]></description>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>printDate</name>
          <version>1.0.0+</version>
          <description><![CDATA[
            The date and time when the document was last printed.
            Use the ISO 8601 format "yyyy-MM-dd'T'HH:mm:ss.SSS" in xml.
          ]]></description>
          <type>Date</type>
          <identifier>true</identifier>
        </field>
        <field java.getter="false">
          <name>printdate</name>
          <version>1.0.1+</version>
          <description><![CDATA[
            The date as String (recommended format is ISO 8601) when the document was last printed.
            Only used if <code>printDate</code> is not set.
            @since 1.1.1
          ]]></description>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>template</name>
          <version>1.0.0+</version>
          <description><![CDATA[
            A template that was used to create the document.
          ]]></description>
          <association>
            <type>DocumentTemplate</type>
          </association>
          <identifier>true</identifier>
        </field>
        <!--
        <field>
          <name>autoReload</name>
          <version>1.0.0+</version>
          <description><![CDATA[
            The auto-reload element specifies whether a document is reloaded
            or replaced by another document after a certain period of time
            has elapsed.
          ]]></description>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        -->
        <field>
          <name>hyperlinkBehaviour</name>
          <version>1.0.0+</version>
          <description><![CDATA[
            The hyperlink-behaviour element specifies the default behavior
            for hyperlinks in the document.
          ]]></description>
          <association>
            <type>DocumentHyperlinkBehaviour</type>
          </association>
          <identifier>true</identifier>
        </field>
        <field>
          <name>language</name>
          <version>1.0.0+</version>
          <description><![CDATA[
            The default language of the document. The language is represented by
            a two or three letter Language Code taken from the ISO 639 standard,
            optionally followed by a hyphen (-) and a two-letter Country Code
            taken from the ISO 3166 standard.
          ]]></description>
          <type>String</type>
          <defaultValue>en-US</defaultValue>
          <identifier>true</identifier>
        </field>
        <field>
          <name>editingCycles</name>
          <version>1.0.0+</version>
          <description><![CDATA[
            The number of editing cycles the document has been through.
          ]]></description>
          <type>long</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>editingDuration</name>
          <version>1.0.0+</version>
          <description><![CDATA[
            The total time spent editing the document.
          ]]></description>
          <type>long</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>documentStatistic</name>
          <version>1.0.0+</version>
          <description><![CDATA[
            The statistics of the document, for example, the page count,
            word count, etc.
          ]]></description>
          <association>
            <type>DocumentStatistic</type>
          </association>
          <identifier>true</identifier>
        </field>
        <field>
          <name>confidential</name>
          <version>1.0.0+</version>
          <description><![CDATA[
            whether the content of the document is in some sense confidential.
          ]]></description>
          <type>boolean</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>draft</name>
          <version>1.0.0+</version>
          <description><![CDATA[
            whether the content of the document is in some sense preliminary.
          ]]></description>
          <type>boolean</type>
          <identifier>true</identifier>
        </field>
      </fields>
      <codeSegments>
        <codeSegment>
          <code>
            <![CDATA[
    /**
     * @return a comma separated String of all defined keyWords.
     * @see #getKeywords()
     * @see #getKeyWords()
     * @since 1.1.1
     */
    public String getAllKeyWords()
    {
        StringBuffer sb = new StringBuffer();
        boolean hasKeywords = false;
        if ( getKeywords() != null && getKeywords().trim().length() > 0 )
        {
            java.util.StringTokenizer st = new java.util.StringTokenizer( getKeywords().trim(), "," );
            while ( st.hasMoreTokens() )
            {
                String s = st.nextToken();

                sb.append( s.trim() );

                if ( st.hasMoreTokens() )
                {
                    sb.append( ", " );
                }

                hasKeywords = true;
            }
        }
        if ( getKeyWords() != null )
        {
            for ( java.util.Iterator it = getKeyWords().iterator(); it.hasNext(); )
            {
                String keyword = (String) it.next();

                if ( hasKeywords )
                {
                    sb.append( ", " );
                    hasKeywords = false;
                }

                if ( keyword.trim().length() > 0 )
                {
                    sb.append( keyword.trim() );

                    if ( it.hasNext() )
                    {
                        sb.append( ", " );
                    }
                }
            }
        }

        String ret = sb.toString().trim();
        if ( ret.endsWith( "," ) )
        {
            return ret.substring( 0, ret.length() - 1 );
        }

        return ret;
    }

    /**
     * @return {@link #getAuthor()} if the unique author name is defined. Otherwise, return all authors full names
     * comma separated.
     * @see #getAuthor()
     * @see #getAuthors()
     * @since 1.1.1
     */
    public String getAllAuthorNames()
    {
        StringBuffer sb = new StringBuffer();
        if ( getAuthor() != null && getAuthor().trim().length() > 0 )
        {
            return getAuthor().trim();
        }

        if ( getAuthors() != null )
        {
            for ( java.util.Iterator it = getAuthors().iterator(); it.hasNext(); )
            {
                DocumentAuthor author = (DocumentAuthor) it.next();

                sb.append( author.getFullName().trim() );

                if ( it.hasNext() )
                {
                    sb.append( ", " );
                }
            }
        }

        return sb.toString();
    }

    /** ISO 8601 date format, i.e. <code>yyyy-MM-dd</code> **/
    private static final java.text.DateFormat ISO_8601_FORMAT = new java.text.SimpleDateFormat( "yyyy-MM-dd", java.util.Locale.ENGLISH );

    /**
     * Get the date and time when the document was created initially.
     *
     * @return the <code>getCreationDate()</code> if setted, formatted using ISO-8601 English format, otherwise return
     * the <code>creationdate</code>.
     * @since 1.1.1
     * @see #getCreationDate()
     */
    public String getCreationdate()
    {
        if ( getCreationDate() != null )
        {
            return ISO_8601_FORMAT.format( getCreationDate() );
        }

        return this.creationdate;
    }

    /**
     * Get the date and time when the document was last modified.
     *
     * @return the <code>getDate()</code> if setted, formatted using ISO-8601 English format, otherwise return
     * the <code>modifydate</code>.
     * @since 1.1.1
     * @see #getDate()
     */
    public String getModifydate()
    {
        if ( getDate() != null )
        {
            return ISO_8601_FORMAT.format( getDate() );
        }

        return this.modifydate;
    }

    /**
     * Get the date and time when the document was last printed.
     *
     * @return the <code>getPrintDate()</code> if setted, formatted using ISO-8601 English format, otherwise return
     * the <code>printdate</code>.
     * @since 1.1.1
     * @see #getPrintDate()
     */
    public String getPrintdate()
    {
        if ( getPrintDate() != null )
        {
            return ISO_8601_FORMAT.format( getPrintDate() );
        }

        return this.printdate;
    }
            ]]>
          </code>
        </codeSegment>
      </codeSegments>
    </class>

    <class>
      <name>DocumentAuthor</name>
      <description>An author of the document.</description>
      <version>1.0.0+</version>
      <fields>
        <field>
          <name>firstName</name>
          <description><![CDATA[
             The first name of the author.
          ]]></description>
          <version>1.0.0+</version>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>lastName</name>
          <description><![CDATA[
            The last name of the author.
          ]]></description>
          <version>1.0.0+</version>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>name</name>
          <description><![CDATA[
            The full name of the author, usually as a String of "firstName lastName".
            @since 1.1.1
          ]]></description>
          <version>1.0.1+</version>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>initials</name>
          <description><![CDATA[
             The initials of the author.
          ]]></description>
          <version>1.0.0+</version>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>title</name>
          <description><![CDATA[
             The title of the author.
          ]]></description>
          <version>1.0.0+</version>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>position</name>
          <description><![CDATA[
             The position of the author.
          ]]></description>
          <version>1.0.0+</version>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>email</name>
          <description><![CDATA[
            The email address of the author.
          ]]></description>
          <version>1.0.0+</version>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>phoneNumber</name>
          <description><![CDATA[
            The telephone number of the author.
          ]]></description>
          <version>1.0.0+</version>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>faxNumber</name>
          <description><![CDATA[
            The fax number of the author.
          ]]></description>
          <version>1.0.0+</version>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>companyName</name>
          <description><![CDATA[
            The name of the company that employs the author.
          ]]></description>
          <version>1.0.0+</version>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>street</name>
          <description><![CDATA[
             The street name of the address of the author.
          ]]></description>
          <version>1.0.0+</version>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>city</name>
          <description><![CDATA[
            The city name of the address of the author.
          ]]></description>
          <version>1.0.0+</version>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>postalCode</name>
          <description><![CDATA[
            The postal code of the address of the author.
          ]]></description>
          <version>1.0.0+</version>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>country</name>
          <description><![CDATA[
            The country of the address of the author.
          ]]></description>
          <version>1.0.0+</version>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>state</name>
          <description><![CDATA[
            The state or province of the address of the author, if applicable.
          ]]></description>
          <version>1.0.0+</version>
          <type>String</type>
          <identifier>true</identifier>
        </field>
      </fields>
      <codeSegments>
        <codeSegment>
          <code>
            <![CDATA[
    /**
     * Get the full name of the author.
     *
     * @return <code>name</code> if defined, <code>firsName lastName</code> otherwise.
     * @see #getName()
     * @see #getFirstName()
     * @see #getLastName()
     * @since 1.1.1
     */
    public String getFullName()
    {
        if ( getName() != null && getName().trim().length() > 0 )
        {
            return getName().trim();
        }

        return ( getFirstName() != null ? getFirstName().trim() : "null" ) + " "
            + ( getLastName() != null ? getLastName().trim() : "null" );
    }
            ]]>
          </code>
        </codeSegment>
      </codeSegments>
    </class>

    <class>
      <name>DocumentTemplate</name>
      <description>A template that was used to create the document.</description>
      <version>1.0.0+</version>
      <fields>
        <field xml.attribute="true">
          <name>href</name>
          <description><![CDATA[
            The location of the document template.
          ]]></description>
          <version>1.0.0+</version>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field xml.attribute="true">
          <name>title</name>
          <description><![CDATA[
            The name of the document template.
          ]]></description>
          <version>1.0.0+</version>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field xml.attribute="true">
          <name>date</name>
          <description><![CDATA[
            The date and time when the template was last modified, prior
            to being used to create the current document.
            Use the ISO 8601 format "yyyy-MM-dd'T'HH:mm:ss.SSS" in xml.
          ]]></description>
          <version>1.0.0+</version>
          <type>Date</type>
          <identifier>true</identifier>
        </field>
        <field java.getter="false" xml.attribute="true">
          <name>modifydate</name>
          <version>1.0.1+</version>
          <description><![CDATA[
            The date as String (recommended format is ISO 8601) when the template was last modified.
            Only used if <code>date</code> is not set.
            @since 1.1.1
          ]]></description>
          <type>String</type>
          <identifier>true</identifier>
        </field>
      </fields>
      <codeSegments>
        <codeSegment>
          <code>
            <![CDATA[
    /** ISO 8601 date format, i.e. <code>yyyy-MM-dd</code> **/
    private static final java.text.DateFormat ISO_8601_FORMAT = new java.text.SimpleDateFormat( "yyyy-MM-dd", java.util.Locale.ENGLISH );

    /**
     * Get the date and time when the template was last modified.
     *
     * @return the <code>getDate()</code> if setted, formatted using ISO-8601 English format, otherwise return
     * the <code>modifydate</code>.
     * @since 1.1.1
     * @see #getDate()
     */
    public String getModifydate()
    {
        if ( getDate() != null )
        {
            return ISO_8601_FORMAT.format( getDate() );
        }

        return this.modifydate;
    }
            ]]>
          </code>
        </codeSegment>
      </codeSegments>
    </class>

    <class>
      <name>DocumentHyperlinkBehaviour</name>
      <description>Specifies the default behavior for hyperlinks in the document.</description>
      <version>1.0.0+</version>
      <fields>
        <field xml.attribute="true">
          <name>targetFrame</name>
          <description><![CDATA[
            The name of the default target frame.
            <p>
              Specifies the name of the default target frame in which to display
              a document referenced by a hyperlink.
            </p>

            <p>
              This attribute can have one of the following values:
            </p>

            <dl>
              <dd>_self</dd>
              <dt>
                The referenced document replaces the content
                of the current frame.
              </dt>

              <dd>_blank</dd>
              <dt>
                The referenced document is displayed in a new frame.
              </dt>

              <dd>_parent</dd>
              <dt>
                The referenced document is displayed in the parent frame
                of the current frame.
              </dt>

              <dd>_top</dd>
              <dt>
                The referenced document is displayed in the topmost frame,
                that is the frame that contains the current frame as a child
                or descendent but is not contained within another frame.
              </dt>

              <dd>A frame name</dd>
              <dt>
                The referenced document is displayed in the named frame.
                If the named frame does not exist, a new frame with that
                name is created.
              </dt>
            </dl>
          ]]></description>
          <version>1.0.0+</version>
          <type>String</type>
          <defaultValue>_self</defaultValue>
          <identifier>true</identifier>
        </field>
      </fields>
    </class>

    <class>
      <name>DocumentStatistic</name>
      <description>Statistical attributes of the document.</description>
      <version>1.0.0+</version>
      <fields>
        <field xml.attribute="true">
          <name>pageCount</name>
          <description><![CDATA[
            The number of pages in the document.
          ]]></description>
          <version>1.0.0+</version>
          <type>long</type>
          <identifier>true</identifier>
        </field>
        <field xml.attribute="true">
          <name>tableCount</name>
          <description><![CDATA[
            The number of tabels in the document.
          ]]></description>
          <version>1.0.0+</version>
          <type>long</type>
          <identifier>true</identifier>
        </field>
        <field xml.attribute="true">
          <name>drawCount</name>
          <description><![CDATA[
            The number of drawings in the document.
          ]]></description>
          <version>1.0.0+</version>
          <type>long</type>
          <identifier>true</identifier>
        </field>
        <field xml.attribute="true">
          <name>imageCount</name>
          <description><![CDATA[
            The number of images in the document.
          ]]></description>
          <version>1.0.0+</version>
          <type>long</type>
          <identifier>true</identifier>
        </field>
        <field xml.attribute="true">
          <name>objectCount</name>
          <description><![CDATA[
            The number of objects in the document.
          ]]></description>
          <version>1.0.0+</version>
          <type>long</type>
          <identifier>true</identifier>
        </field>
        <field xml.attribute="true">
          <name>oleObjectCount</name>
          <description><![CDATA[
            The number of ole-objects in the document.
          ]]></description>
          <version>1.0.0+</version>
          <type>long</type>
          <identifier>true</identifier>
        </field>
        <field xml.attribute="true">
          <name>paragraphCount</name>
          <description><![CDATA[
            The number of paragraphs in the document.
          ]]></description>
          <version>1.0.0+</version>
          <type>long</type>
          <identifier>true</identifier>
        </field>
        <field xml.attribute="true">
          <name>wordCount</name>
          <description><![CDATA[
            The number of words in the document.
          ]]></description>
          <version>1.0.0+</version>
          <type>long</type>
          <identifier>true</identifier>
        </field>
        <field xml.attribute="true">
          <name>characterCount</name>
          <description><![CDATA[
            The number of characters in the document.
          ]]></description>
          <version>1.0.0+</version>
          <type>long</type>
          <identifier>true</identifier>
        </field>
        <field xml.attribute="true">
          <name>rowCount</name>
          <description><![CDATA[
            The number of rows in the document.
          ]]></description>
          <version>1.0.0+</version>
          <type>long</type>
          <identifier>true</identifier>
        </field>
        <field xml.attribute="true">
          <name>frameCount</name>
          <description><![CDATA[
            The number of frames in the document.
          ]]></description>
          <version>1.0.0+</version>
          <type>long</type>
          <identifier>true</identifier>
        </field>
        <field xml.attribute="true">
          <name>sentenceCount</name>
          <description><![CDATA[
            The number of sentences in the document.
          ]]></description>
          <version>1.0.0+</version>
          <type>long</type>
          <identifier>true</identifier>
        </field>
        <field xml.attribute="true">
          <name>syllableCount</name>
          <description><![CDATA[
            The number of syllables in the document.
          ]]></description>
          <version>1.0.0+</version>
          <type>long</type>
          <identifier>true</identifier>
        </field>
        <field xml.attribute="true">
          <name>nonWhitespaceCharacterCount</name>
          <description><![CDATA[
            The number of non-whitespace-characters in the document.
          ]]></description>
          <version>1.0.0+</version>
          <type>long</type>
          <identifier>true</identifier>
        </field>
      </fields>
    </class>

    <class>
      <name>DocumentCover</name>
      <description>Contains meta-data information for the document cover page.</description>
      <version>1.0.0+</version>
      <fields>
        <field>
          <name>coverTitle</name>
          <description><![CDATA[
            The title to appear on the cover.
          ]]></description>
          <version>1.0.0+</version>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>coverSubTitle</name>
          <description><![CDATA[
            a sub-title to appear on the cover.
          ]]></description>
          <version>1.0.0+</version>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>coverVersion</name>
          <description><![CDATA[
            The version of the project that appears on the cover page.
          ]]></description>
          <version>1.0.0+</version>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>coverType</name>
          <description><![CDATA[
            The type of the document. This might be used on the cover page to
            specify the type of information contained in the document
            (eg 'User Guide', 'Manual', etc.).
          ]]></description>
          <version>1.0.0+</version>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>coverDate</name>
          <description><![CDATA[
            The date to appear on the cover.
            Use the ISO 8601 format "yyyy-MM-dd'T'HH:mm:ss.SSS" in xml.
          ]]></description>
          <version>1.0.0+</version>
          <type>Date</type>
          <identifier>true</identifier>
        </field>
        <field java.getter="false">
          <name>coverdate</name>
          <description><![CDATA[
            The date as String (recommended format is ISO 8601) to appear on the cover.
            Only used if <code>coverDate</code> is not set.
            @since 1.1.1
          ]]></description>
          <version>1.0.1+</version>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>authors</name>
          <description><![CDATA[
            The authors that appear on the cover page.
            Only used if author is not given.
          ]]></description>
          <version>1.0.0+</version>
          <association xml.itemsStyle="wrapped" xml.tagName="author">
            <type>DocumentAuthor</type>
            <multiplicity>*</multiplicity>
          </association>
          <identifier>true</identifier>
        </field>
        <field>
          <name>author</name>
          <description><![CDATA[
            A shortcut for the unique author that appears on the cover page.
            For more authors, you could use the &lt;authors/&gt; tag.
            @since 1.1.1
          ]]></description>
          <version>1.0.1+</version>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>projectName</name>
          <description><![CDATA[
            The name of the project.
          ]]></description>
          <version>1.0.0+</version>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>projectLogo</name>
          <description><![CDATA[
            The location of an image file that represents the project logo.
          ]]></description>
          <version>1.0.0+</version>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>companyName</name>
          <description><![CDATA[
            The name of the entity that is responsible for the content of the
            document, or a copyright holder.
          ]]></description>
          <version>1.0.0+</version>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>companyLogo</name>
          <description><![CDATA[
            The location of an image file that represents the company logo.
          ]]></description>
          <version>1.0.0+</version>
          <type>String</type>
          <identifier>true</identifier>
        </field>
      </fields>
      <codeSegments>
        <codeSegment>
          <code>
            <![CDATA[
    /**
     * @return {@link #getAuthor()} if the unique author name is defined. Otherwise, return all authors full names
     * comma separated.
     * @see #getAuthor()
     * @see #getAuthors()
     * @since 1.1.1
     */
    public String getAllAuthorNames()
    {
        StringBuffer sb = new StringBuffer();
        if ( getAuthor() != null && getAuthor().trim().length() > 0 )
        {
            return getAuthor().trim();
        }

        if ( getAuthors() != null )
        {
            for ( java.util.Iterator it = getAuthors().iterator(); it.hasNext(); )
            {
                DocumentAuthor author = (DocumentAuthor) it.next();

                sb.append( author.getFullName().trim() );

                if ( it.hasNext() )
                {
                    sb.append( ", " );
                }
            }
        }

        return sb.toString();
    }

    /** ISO 8601 date format, i.e. <code>yyyy-MM-dd</code> **/
    private static final java.text.DateFormat ISO_8601_FORMAT = new java.text.SimpleDateFormat( "yyyy-MM-dd", java.util.Locale.ENGLISH );

    /**
     * Get the date to appear on the cover.
     *
     * @return the <code>getCoverDate()</code> if setted, formatted using ISO-8601 English format, otherwise return
     * the <code>coverdate</code>.
     * @since 1.1.1
     * @see #getCoverDate()
     */
    public String getCoverdate()
    {
        if ( getCoverDate() != null )
        {
            return ISO_8601_FORMAT.format( getCoverDate() );
        }

        return this.coverdate;
    }
            ]]>
          </code>
        </codeSegment>
      </codeSegments>
    </class>

    <class xsd.compositor="sequence">
      <name>DocumentTOC</name>
      <description>A Table Of Content for the document.</description>
      <version>1.0.0+</version>
      <fields>
        <field xml.attribute="true">
          <name>name</name>
          <description><![CDATA[
            The name to use for the Table of Contents.
          ]]></description>
          <version>1.0.0+</version>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field xml.attribute="true">
          <name>depth</name>
          <description><![CDATA[
            The level up to which toc items are included by default.
            Defaults to 0 which means only top-level element entries are included.
            A depth of 1 includes one level of sub-items (sub-sections), etc.
            This may be overridden for individual entries by using the collapse
            attribute of the corresponding toc item.
          ]]></description>
          <version>1.0.0+</version>
          <type>int</type>
          <identifier>true</identifier>
          <defaultValue>0</defaultValue>
        </field>
        <field>
          <name>items</name>
          <description><![CDATA[
            TOC item.
          ]]></description>
          <version>1.0.0+</version>
          <association xml.itemsStyle="flat">
            <type>DocumentTOCItem</type>
            <multiplicity>*</multiplicity>
          </association>
          <identifier>true</identifier>
        </field>
      </fields>
    </class>

    <class xsd.compositor="sequence">
      <name>DocumentTOCItem</name>
      <description>A menu item.</description>
      <version>1.0.0+</version>
      <fields>
        <field xml.attribute="true">
          <name>name</name>
          <description><![CDATA[
            The name to use for the toc.
          ]]></description>
          <version>1.0.0+</version>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field xml.attribute="true">
          <name>ref</name>
          <description><![CDATA[
            The ref to use for the item.
          ]]></description>
          <version>1.0.0+</version>
          <type>String</type>
          <identifier>true</identifier>
        </field>
        <field xml.attribute="true">
          <name>collapse</name>
          <description><![CDATA[
           Whether to show any child elements of a TOCItem, overriding
           the depth given in DocumentTOC. By default, all children
           are expanded up to the depth given in DocumentTOC.
          ]]></description>
          <version>1.0.0+</version>
          <type>boolean</type>
          <identifier>true</identifier>
        </field>
        <field>
          <name>items</name>
          <description><![CDATA[
           A table of content item containing sub-items.
          ]]></description>
          <version>1.0.0+</version>
          <association xml.itemsStyle="flat">
            <type>DocumentTOCItem</type>
            <multiplicity>*</multiplicity>
          </association>
          <identifier>true</identifier>
        </field>
      </fields>
    </class>
  </classes>
</model>
