<?xml version="1.0" encoding="UTF-8"?>
<!--
  ~ Copyright 2006 The Apache Software Foundation.
  ~
  ~ Licensed 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>
    <id>archetype-common</id>
    <name>ArchetypeCommon</name>

    <defaults>
        <default>
            <key>package</key>
            <value>org.codehaus.mojo.archetypeng</value>
        </default>
    </defaults>

    <classes>

        <class rootElement="true">
            <name>Archetype</name>
            <fields>
                <field>
                    <name>GroupId</name>
                    <type>String</type>
                </field>
                <field>
                    <name>ArtifactId</name>
                    <type>String</type>
                </field>
                <field>
                    <name>Version</name>
                    <type>String</type>
                </field>
                <field>
                    <name>Name</name>
                    <type>String</type>
                </field>
                <field>
                    <name>Prefix</name>
                    <type>String</type>
                </field>
            </fields>
            <codeSegments>
                <codeSegment>
                    <code><![CDATA[
    public boolean equals( Object o )
    {
        if ( this == o )
        {
            return true;
        }

        if ( !( o instanceof Archetype ) )
        {
            return false;
        }

        Archetype a = (Archetype) o;

        if ( !a.getArtifactId().equals( getArtifactId() ) )
        {
            return false;
        }
        else if ( !a.getGroupId().equals( getGroupId() ) )
        {
            return false;
        }
        /*
        else if ( !a.getPrefix().equals( getPrefix() ) )
        {
            return false;
        }
        else if ( !a.getName().equals( getName() ) )
        {
            return false;
        }*/
        return true;
    }

    public int hashCode()
    {
        int result = 17;
        result = 37 * result + getArtifactId().hashCode();
        result = 37 * result + getGroupId().hashCode();
        return result;
    }
                    ]]></code>
                </codeSegment>
            </codeSegments>
        </class>

        <class>
            <name>ArchetypeDefinition</name>
            <fields>
                <field>
                    <name>GroupId</name>
                    <type>String</type>
                </field>
                <field>
                    <name>ArtifactId</name>
                    <type>String</type>
                </field>
                <field>
                    <name>Version</name>
                    <type>String</type>
                </field>
                <field>
                    <name>Name</name>
                    <type>String</type>
                </field>
            </fields>
            <codeSegments>
                <codeSegment>
                    <code><![CDATA[
    public void reset ()
    {
        setGroupId ( null );
        setArtifactId ( null );
        setVersion ( null );
    }

    public java.util.Properties toProperties ()
    {
        java.util.Properties properties = new java.util.Properties ();
        properties.setProperty (
            Constants.ARCHETYPE_GROUP_ID,
            (org.codehaus.plexus.util.StringUtils.isNotEmpty( getGroupId () ) ? getGroupId () : "" )
        );
        properties.setProperty (
            Constants.ARCHETYPE_ARTIFACT_ID,
            (org.codehaus.plexus.util.StringUtils.isNotEmpty( getArtifactId () ) ? getArtifactId () : "" )
        );
        properties.setProperty (
            Constants.ARCHETYPE_VERSION,
            (org.codehaus.plexus.util.StringUtils.isNotEmpty( getVersion () ) ? getVersion () : "" )
        );
        return properties;
    }

    public boolean isArtifactDefined ()
    {
        return org.codehaus.plexus.util.StringUtils.isNotEmpty( getArtifactId () );
    }

    public boolean isDefined ()
    {
        return isPartiallyDefined () && isVersionDefined ();
    }

    public boolean isGroupDefined ()
    {
        return org.codehaus.plexus.util.StringUtils.isNotEmpty( getGroupId () );
    }

    public boolean isPartiallyDefined ()
    {
        return isGroupDefined () && isArtifactDefined ();
    }

    public boolean isVersionDefined ()
    {
        return org.codehaus.plexus.util.StringUtils.isNotEmpty( getVersion () );
    }
                    ]]></code>
                </codeSegment>
            </codeSegments>
        </class>

        <class>
            <name>ArchetypeConfiguration</name>
            <fields>
                <field>
                    <name>GroupId</name>
                    <type>String</type>
                </field>
                <field>
                    <name>ArtifactId</name>
                    <type>String</type>
                </field>
                <field>
                    <name>Version</name>
                    <type>String</type>
                </field>
                <field>
                    <name>Name</name>
                    <type>String</type>
                </field>
                <field>
                    <name>RequiredProperties</name>
                    <association>
                        <type>String</type>
                        <multiplicity>*</multiplicity>
                    </association>
                </field>
            </fields>
            <codeSegments>
                <codeSegment>
                    <code><![CDATA[
    public void reset ()
    {
        properties.clear ();
    }

    private java.util.Properties properties = new java.util.Properties ();

    public void setProperty ( String requiredProperty, String propertyValue )
    {
        properties.setProperty ( requiredProperty, propertyValue );
    }

    public String getProperty (String property)
    {
        return properties.getProperty ( property, null );
    }

    public java.util.Properties getProperties ()
    {
        return properties;
    }

    public java.util.Properties toProperties ()
    {
        java.util.Properties result = new java.util.Properties ();
        result.putAll ( properties );
        result.setProperty (
            Constants.ARCHETYPE_GROUP_ID,
            (org.codehaus.plexus.util.StringUtils.isNotEmpty( getGroupId () ) ? getGroupId () : "" )
        );
        result.setProperty (
            Constants.ARCHETYPE_ARTIFACT_ID,
            (org.codehaus.plexus.util.StringUtils.isNotEmpty( getArtifactId () ) ? getArtifactId () : "" )
        );
        result.setProperty (
            Constants.ARCHETYPE_VERSION,
            (org.codehaus.plexus.util.StringUtils.isNotEmpty( getVersion () ) ? getVersion () : "" )
        );
        return result;
    }

    public boolean isConfigured ()
    {
        boolean configured = true;

        java.util.Iterator requiredProperties = getRequiredProperties().iterator();
        while ( configured && requiredProperties.hasNext () )
        {
            String requiredProperty = (String) requiredProperties.next ();

            configured = configured &&
                org.codehaus.plexus.util.StringUtils.isNotEmpty(
                    properties.getProperty ( requiredProperty )
                );
        }

        return configured;
    }

    public boolean isConfigured ( String requiredProperties )
    {
        return org.codehaus.plexus.util.StringUtils.isNotEmpty (
                    properties.getProperty ( requiredProperties )
                );
    }

    private java.util.Properties defaultProperties = new java.util.Properties ();

    public void setDefaultProperty ( String requiredProperty, String propertyValue )
    {
        defaultProperties.setProperty ( requiredProperty, propertyValue );
    }

    public String getDefaultValue (String requiredProperty)
    {
        return defaultProperties.getProperty ( requiredProperty, null );
    }

    public java.util.Properties getDefaultValues ()
    {
        return defaultProperties;
    }
                    ]]></code>
                </codeSegment>
            </codeSegments>
        </class>
<!--
        <class>
            <name>Template</name>
            <fields>
                <field>
                    <name>Directory</name>
                    <type>String</type>
                </field>
                <field>
                    <name>InnerPath</name>
                    <type>String</type>
                </field>
                <field>
                    <name>Language</name>
                    <type>String</type>
                </field>
                <field>
                    <name>Main</name>
                    <type>boolean</type>
                </field>
                <field>
                    <name>Pom</name>
                    <type>boolean</type>
                </field>
                <field>
                    <name>Resource</name>
                    <type>boolean</type>
                </field>
                <field>
                    <name>SiteResource</name>
                    <type>boolean</type>
                </field>
                <field>
                    <name>Source</name>
                    <type>boolean</type>
                </field>
                <field>
                    <name>TemplateName</name>
                    <type>String</type>
                </field>
                <field>
                    <name>TemplatePath</name>
                    <type>String</type>
                </field>
                <field>
                    <name>Test</name>
                    <type>boolean</type>
                </field>
            </fields>
            <codeSegments>
                <codeSegment>
                    <code><![CDATA[
        public Template (  String relativePath )
        throws org.codehaus.mojo.archetypeng.exception.TemplateCreationException
        {
            if ( relativePath.equals ( Constants.ARCHETYPE_POM ) )
            {
                setTemplatePath ( relativePath );
                setPom ( true );
            }
            else
            {
                setTemplatePath ( relativePath );

                String srcLevel =
                    org.codehaus.plexus.util.StringUtils.prechomp (
                        relativePath,
                        Constants.SRC + "/"
                    );

                String firstLevel =
                    org.codehaus.plexus.util.StringUtils.getPrechomp (
                        srcLevel,
                        "/"
                    ).replace (
                        "/",
                        ""
                    );
                String afterFirstLevel = org.codehaus.plexus.util.StringUtils.prechomp (
                    srcLevel,
                    "/"
                );
                String secondLevel =
                    org.codehaus.plexus.util.StringUtils.getPrechomp (
                        afterFirstLevel,
                        "/"
                    ).replace (
                        "/",
                        ""
                    );
                String aftersecondLevel = org.codehaus.plexus.util.StringUtils.prechomp (
                    afterFirstLevel,
                    "/"
                );
                String afterLevel;

                if ( Constants.MAIN.equals ( firstLevel ) )
                {
                    setMain ( true );
                }
                else if ( Constants.TEST.equals ( firstLevel ) )
                {
                    setTest ( true );
                }
                else if ( Constants.SITE.equals ( firstLevel ) )
                {
                    setSiteResource ( true );
                }
                else
                {
                    throw new org.codehaus.mojo.archetypeng.exception.TemplateCreationException (
                        "Unknown directory " + firstLevel
                    );
                }

                if ( isMain () || isTest () )
                {
                    if ( Constants.LANGUAGES.contains ( secondLevel ) )
                    {
                        setSource ( true );
                        setLanguage ( secondLevel );
                    }
                    else
                    {
                        setResource ( true );
                        setDirectory ( secondLevel );
                    }
                    afterLevel = aftersecondLevel;
                }
                else
                { // isSiteResource
                    afterLevel = afterFirstLevel;
                }

                if ( org.codehaus.plexus.util.StringUtils.countMatches ( afterLevel, "/" ) > 0 )
                {
                    setInnerPath (
                        org.codehaus.plexus.util.StringUtils.chomp ( afterLevel, "/" )
                    );
                    setTemplateName (
                        org.codehaus.plexus.util.StringUtils.getChomp (
                            afterLevel,
                            "/"
                        ).replace (
                            "/",
                            ""
                        )
                    );
                }
                else
                {
                    setInnerPath ( "" );
                    setTemplateName ( afterLevel );
                }
            } // end if
        }

        public String toString ()
        {
            return
                ( isPom ()
                    ? "POM"
                    : ( isMain ()
                        ? ( "MAIN"
                            + ( isSource () ? ( "-SOURCE(" + getLanguage () + ")" )
                                            : ( "-RESOURCE(" + getDirectory () + ")" ) )
                            + ( "".equals ( getInnerPath () ) ? "" : ( "-" + getInnerPath () ) )
                            + "-" + getTemplateName () )
                        : ( isTest ()
                            ? ( "TEST"
                                + ( isSource () ? ( "-SOURCE(" + getLanguage () + ")" )
                                                : ( "-RESOURCE(" + getDirectory () + ")" ) )
                                + ( "".equals ( getInnerPath () ) ? "" : ( "-" + getInnerPath () ) )
                                + "-" + getTemplateName () )
                            : ( "SITE"
                                + ( "".equals ( getInnerPath () ) ? "" : ( "-" + getInnerPath () ) )
                                + "-" + getTemplateName () ) ) ) );
        }
                    ]]></code>
                </codeSegment>
            </codeSegments>
        </class>
-->
    </classes>
</model>
