<!--

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.flex.pmd</groupId>
        <artifactId>flex-pmd</artifactId>
        <version>1.3-SNAPSHOT</version>
    </parent>

	<artifactId>flex-pmd-hybrid</artifactId>
	<packaging>pom</packaging>

	<name>Adobe Flex PMD Flex/Java Parent</name>

	<modules>
		<module>flex-pmd-automator</module>
		<module>flex-pmd-bundles</module>
	</modules>

	<build>
		<pluginManagement>
			<plugins>
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-dependency-plugin</artifactId>
					<version>${dependency.version}</version>
				</plugin>
				<plugin>
					<groupId>org.apache.maven.plugins</groupId>
					<artifactId>maven-assembly-plugin</artifactId>
					<version>${assembly.version}</version>
				</plugin>
			</plugins>
		</pluginManagement>

		<plugins>

			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-release-plugin</artifactId>
				<version>${release-plugin.version}</version>
			</plugin>

			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>${compileSource}</source>
					<target>${compileSource}</target>
				</configuration>
			</plugin>

			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>cobertura-maven-plugin</artifactId>
				<version>${cobertura.version}</version>
				<configuration>
					<format>xml</format>
				</configuration>
			</plugin>

			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>findbugs-maven-plugin</artifactId>
				<version>${findbugs.version}</version>
				<configuration>
					<xmlOutput>true</xmlOutput>
				</configuration>
			</plugin>

			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-checkstyle-plugin</artifactId>
				<version>${checkstyle.version}</version>
				<configuration>
					<configLocation>checkstyle.xml</configLocation>
				</configuration>
			</plugin>

			<!--plugin>
				<groupId>com.google.code.maven-license-plugin</groupId>
				<artifactId>maven-license-plugin</artifactId>
				<version>${license.version}</version>
				<configuration>
					<header>../flex-pmd-parent/src/etc/header.txt</header>
					<includes>
						<include>**/src/**</include>
						<include>**/test/**</include>
					</includes>
					<excludes>
						<exclude>**/Simple.as</exclude>
						<exclude>**/Empty.*</exclude>
						<exclude>**/Version.as</exclude>
						<exclude>**/FlexPMD60.as</exclude>
						<exclude>**/header.txt</exclude>
						<exclude>**/MainWithNoCopyright.mxml</exclude>
					</excludes>
					<aggregate>true</aggregate>
					<properties>
						<year>${project.inceptionYear}</year>
						<company>${project.organization.name}</company>
					</properties>
					<mapping>
						<mxml>XML_STYLE</mxml>
						<xsl>XML_STYLE</xsl>
						<as>JAVADOC_STYLE</as>
					</mapping>
				</configuration>
				<executions>
					<execution>
						<phase>package</phase>
						<goals>
							<goal>check</goal>
						</goals>
					</execution>
				</executions>
			</plugin-->
		</plugins>

	</build>

	<repositories>
		<repository>
			<id>maven2-repository.dev.java.net</id>
			<name>Java.net Repository for Maven</name>
			<url>http://download.java.net/maven/2/</url>
		</repository>
		<repository>
			<id>central</id>
			<name>maven-central</name>
			<url>http://repo1.maven.org/maven2</url>
			<releases>
				<enabled>true</enabled>
			</releases>
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
		</repository>
		<repository>
			<id>dist.codehaus.org</id>
			<layout>legacy</layout>
			<url>http://dist.codehaus.org/</url>
		</repository>
		<repository>
			<id>apache</id>
			<name>Apache repository</name>
			<layout>legacy</layout>
			<url>http://cvs.apache.org/repository/</url>
		</repository>
		<repository>
			<id>flex-mojos</id>
			<url>http://repository.sonatype.org/content/groups/flexgroup</url>
			<snapshots>
				<enabled>false</enabled>
				<checksumPolicy>ignore</checksumPolicy>
			</snapshots>
			<releases>
				<enabled>true</enabled>
				<checksumPolicy>ignore</checksumPolicy>
			</releases>
		</repository>
	</repositories>

	<pluginRepositories>
		<pluginRepository>
			<id>dist.codehaus.org</id>
			<releases>
				<enabled>true</enabled>
			</releases>
			<snapshots>
				<enabled>true</enabled>
			</snapshots>
			<name>XDoclet central repository on codehaus</name>
			<url>http://dist.codehaus.org</url>
			<layout>legacy</layout>
		</pluginRepository>
		<pluginRepository>
			<id>repository.codehaus.org</id>
			<releases>
				<enabled>true</enabled>
			</releases>
			<snapshots>
				<enabled>true</enabled>
			</snapshots>
			<name>Central repository on codehaus</name>
			<url>http://repository.codehaus.org</url>
		</pluginRepository>
		<pluginRepository>
			<id>mc-release</id>
			<name>Local Maven repository of releases</name>
			<url>http://mc-repo.googlecode.com/svn/maven2/releases</url>
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
			<releases>
				<enabled>true</enabled>
			</releases>
		</pluginRepository>
	</pluginRepositories>

	<reporting>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-site-plugin</artifactId>
				<version>2.0-beta-5</version>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-project-info-reports-plugin</artifactId>
				<version>2.1.1</version>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-surefire-report-plugin</artifactId>
				<inherited>true</inherited>
				<version>2.4.3</version>
			</plugin>
			<plugin>
				<artifactId>maven-pmd-plugin</artifactId>
				<version>${maven-pmd-plugin.version}</version>
				<configuration>
					<linkXref>true</linkXref>
					<minimumTokens>100</minimumTokens>
					<targetJdk>${compileSource}</targetJdk>
					<rulesets>
						<ruleset>pmd.xml</ruleset>
					</rulesets>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>javancss-maven-plugin</artifactId>
				<version>2.0-beta-2</version>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-javadoc-plugin</artifactId>
				<version>2.5</version>
			</plugin>
		</plugins>
	</reporting>
	
	<profiles>
		<profile>
			<id>hudson</id>
			<distributionManagement>
				<repository>
					<id>txi_releases</id>
					<url>http://txici.can.adobe.com:9999/nexus/content/repositories/txi</url>
				</repository>
				<snapshotRepository>
					<id>txi_snapshot</id>
					<url>http://txici.can.adobe.com:9999/nexus/content/repositories/txi_snapshots/</url>
				</snapshotRepository>
			</distributionManagement>
		</profile>
	</profiles>
	
</project>
