<?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.
-->

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <parent>
     <groupId>org.apache.maven.its.it0140</groupId>
     <artifactId>parent</artifactId>
     <version>1.0</version>
  </parent>

  <groupId>org.apache.maven.its.it0140.child</groupId>
  <artifactId>child</artifactId>
  <version>2.0-alpha-1</version>
  <packaging>jar</packaging>

  <name>child-name</name>
  <description>child-desc</description>
  <url>http://child.org/</url>
  <inceptionYear>2008</inceptionYear>
  <organization>
    <name>child-org-name</name>
  </organization>

  <prerequisites>
    <maven>2.0.0</maven>
  </prerequisites>

  <scm>
    <url>http://scm.org/</url>
  </scm>
  <issueManagement>
    <url>http://issue.org/</url>
  </issueManagement>
  <ciManagement>
    <url>http://ci.org/</url>
  </ciManagement>
  <distributionManagement>
    <repository>
      <id>maven-core-it</id>
      <name>child-dist-repo</name>
      <url>http://dist.org/</url>
    </repository>
  </distributionManagement>

  <properties>
    <!-- this is where we collect all the interpolated values for the POM dump -->
    <projectDir>${basedir}</projectDir>
    <projectGroupId>${pom.groupId}</projectGroupId>
    <projectArtifactId>${pom.artifactId}</projectArtifactId>
    <projectVersion>${pom.version}</projectVersion>
    <projectPackaging>${pom.packaging}</projectPackaging>
    <projectName>${pom.name}</projectName>
    <projectDesc>${pom.description}</projectDesc>
    <projectUrl>${pom.url}</projectUrl>
    <projectYear>${pom.inceptionYear}</projectYear>
    <projectOrgName>${pom.organization.name}</projectOrgName>
    <projectPrereqMvn>${pom.prerequisites.maven}</projectPrereqMvn>
    <projectScmUrl>${pom.scm.url}</projectScmUrl>
    <projectIssueUrl>${pom.issueManagement.url}</projectIssueUrl>
    <projectCiUrl>${pom.ciManagement.url}</projectCiUrl>
    <projectDistRepoName>${pom.distributionManagement.repository.name}</projectDistRepoName>
    <projectBuildOut>${pom.build.outputDirectory}</projectBuildOut>
    <projectSiteOut>${pom.reporting.outputDirectory}</projectSiteOut>
    <parentGroupId>${pom.parent.groupId}</parentGroupId>
    <parentArtifactId>${pom.parent.artifactId}</parentArtifactId>
    <parentVersion>${pom.parent.version}</parentVersion>
  </properties>

  <build>
    <outputDirectory>target/bin</outputDirectory>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.its.plugins</groupId>
        <artifactId>maven-it-plugin-expression</artifactId>
        <version>2.1-SNAPSHOT</version>
        <executions>
          <execution>
            <phase>initialize</phase>
            <goals>
              <goal>eval</goal>
            </goals>
            <configuration>
              <outputFile>target/interpolated.properties</outputFile>
              <expressions>
                <expression>project/properties</expression>
              </expressions>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

  <reporting>
    <outputDirectory>target/doc</outputDirectory>
  </reporting>

</project>
