<!--

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

    <artifactId>${project.parent.artifactId}-all-in-one-bundle</artifactId>
	<packaging>pom</packaging>

    <name>Adobe Flex PMD All-in-one bundle</name>

    <dependencies>

		<dependency>
			<groupId>com.martiansoftware</groupId>
			<artifactId>jsap</artifactId>
			<version>${jsap.version}</version>
		</dependency>
		
		<!-- FlexPMD -->
	
		<dependency>
			<groupId>${project.parent.groupId}</groupId>
			<artifactId>flex-pmd-ant-task</artifactId>
			<version>${project.parent.version}</version>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>${project.parent.groupId}</groupId>
			<artifactId>flex-pmd-command-line</artifactId>
			<version>${project.parent.version}</version>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>${project.parent.groupId}</groupId>
			<artifactId>flex-pmd-automator-workflow</artifactId>
			<version>${project.parent.version}</version>
			<type>pom</type>
			<scope>compile</scope>
		</dependency>

		<!-- FlexCPD -->

		<dependency>
			<groupId>${project.parent.groupId}</groupId>
			<artifactId>flex-pmd-cpd-ant-task</artifactId>
			<version>${project.parent.version}</version>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>${project.parent.groupId}</groupId>
			<artifactId>flex-pmd-cpd-command-line</artifactId>
			<version>${project.parent.version}</version>
			<scope>compile</scope>
		</dependency>

		<!-- FlexMetrics -->
		
	    <dependency>
			<groupId>${project.parent.groupId}</groupId>
			<artifactId>flex-pmd-metrics-ant-task</artifactId>
			<version>${project.parent.version}</version>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>${project.parent.groupId}</groupId>
			<artifactId>flex-pmd-metrics-command-line</artifactId>
			<version>${project.parent.version}</version>
			<scope>compile</scope>
		</dependency>

	</dependencies>

	<build>
		<plugins>

			<plugin>
				<artifactId>maven-antrun-plugin</artifactId>
				<version>${maven-antrun-plugin.version}</version>
				<executions>
					<execution>
						<id>package-ant-task</id>
						<phase>install</phase>
						<configuration>
							<tasks>
								<mkdir dir="${project.build.directory}/release" />
								<unzip src="${project.build.directory}/../../../flex-pmd-java/flex-pmd-ant-task/target/flex-pmd-ant-task-${project.parent.version}.zip" dest="${project.build.directory}/release" />
								<unzip src="${project.build.directory}/../../../flex-pmd-java/flex-pmd-cpd-ant-task/target/flex-pmd-cpd-ant-task-${project.parent.version}.zip" dest="${project.build.directory}/release" />
								<unzip src="${project.build.directory}/../../../flex-pmd-java/flex-pmd-metrics-ant-task/target/flex-pmd-metrics-ant-task-${project.parent.version}.zip" dest="${project.build.directory}/release" />
								<unzip src="${project.build.directory}/../../../flex-pmd-java/flex-pmd-command-line/target/flex-pmd-command-line-${project.parent.version}.zip" dest="${project.build.directory}/release" />
								<unzip src="${project.build.directory}/../../../flex-pmd-java/flex-pmd-cpd-command-line/target/flex-pmd-cpd-command-line-${project.parent.version}.zip" dest="${project.build.directory}/release" />
								<unzip src="${project.build.directory}/../../../flex-pmd-java/flex-pmd-metrics-command-line/target/flex-pmd-metrics-command-line-${project.parent.version}.zip" dest="${project.build.directory}/release" />
								<unzip src="${project.build.directory}/../../flex-pmd-automator/target/flex-pmd-automator-${project.parent.version}-workflow.zip" dest="${project.build.directory}/release" />
								<delete dir="${project.build.directory}/release/command-line" />
								<zip destfile="${project.build.directory}/${project.build.finalName}.zip" basedir="${project.build.directory}/release" excludes="*.zip" />
							</tasks>
						</configuration>
						<goals>
							<goal>run</goal>
						</goals>
					</execution>
				</executions>
			</plugin>

		</plugins>
	</build>

</project>