<!--

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

	<artifactId>flex-pmd-ruleset-creator</artifactId>
	<packaging>swf</packaging>

	<name>Adobe Flex PMD Ruleset creator</name>
	<description>Adobe Flex PMD Ruleset creator</description>

	<dependencies>

		<dependency>
			<groupId>${project.groupId}</groupId>
			<artifactId>flex-pmd-ruleset</artifactId>
			<version>${project.parent.version}</version>
		</dependency>

		<dependency>
			<groupId>${project.groupId}</groupId>
			<artifactId>flex-pmd-flex-lib</artifactId>
			<version>${project.parent.version}</version>
			<type>swc</type>
		</dependency>

		<dependency>
			<groupId>com.adobe.cairngorm</groupId>
			<artifactId>cairngorm</artifactId>
			<version>${cairngorm.version}</version>
			<type>swc</type>
		</dependency>

		<!-- flex sdk dependencies -->

		<dependency>
			<groupId>org.apache.flex</groupId>
			<artifactId>framework</artifactId>
			<version>${flex.version}</version>
			<type>pom</type>
		</dependency>

		<dependency>
			<groupId>com.adobe.flash.framework</groupId>
			<artifactId>playerglobal</artifactId>
			<version>${flash-player.version}</version>
			<type>swc</type>
		</dependency>

        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>flexunit-theme</artifactId>
            <version>${project.parent.version}</version>
            <type>swc</type>
            <scope>theme</scope>
        </dependency>

        <dependency>
			<groupId>com.adobe.cairngorm</groupId>
			<artifactId>event-source</artifactId>
			<version>${event-source.version}</version>
			<type>swc</type>
			<scope>test</scope>
		</dependency>

        <dependency>
            <groupId>org.apache.flex.flexunit</groupId>
            <artifactId>flexunit-flex</artifactId>
            <version>${flexunit.version}</version>
            <type>swc</type>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.adobe.flexunit</groupId>
            <artifactId>flexunit</artifactId>
            <version>1.0.0</version>
            <type>swc</type>
            <scope>test</scope>
        </dependency>

	</dependencies>

	<build>
		<sourceDirectory>src/main/flex</sourceDirectory>
		<!--testSourceDirectory>src/test/flex</testSourceDirectory-->
		<resources>
			<resource>
				<directory>src/main/resources</directory>
			</resource>
		</resources>
		<testResources>
			<testResource>
				<directory>src/test/resources</directory>
			</testResource>
		</testResources>

		<plugins>

			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-dependency-plugin</artifactId>
				<version>${maven-dependency-plugin.version}</version>
				<executions>
					<execution>
						<id>unpack-binary-resources</id>
						<phase>process-sources</phase>
						<goals>
							<goal>unpack-dependencies</goal>
						</goals>
						<configuration>
							<includeGroupIds>${project.groupId}</includeGroupIds>
							<includes>**/*.xml</includes>
							<outputDirectory>target/rulesets</outputDirectory>
							<excludeTransitive>true</excludeTransitive>
						</configuration>
					</execution>
				</executions>
			</plugin>

			<plugin>
				<groupId>net.flexmojos.oss</groupId>
				<artifactId>flexmojos-maven-plugin</artifactId>
				<version>${flex-mojos-plugin.version}</version>
				<extensions>true</extensions>
				<configuration>
					<targetPlayer>${flash-player.version}.0.0</targetPlayer>
				</configuration>
                <dependencies>
                    <!-- This handles a bug in maven which causes problems with flex resources -->
                    <dependency>
                        <groupId>net.flexmojos.oss</groupId>
                        <artifactId>flexmojos-threadlocaltoolkit-wrapper</artifactId>
                        <version>${flex-mojos-plugin.version}</version>
                    </dependency>
                    <!-- Without this FM will use the compiler configured in its
                    master pom, which will result in version conflicts -->
                    <dependency>
                        <groupId>org.apache.flex</groupId>
                        <artifactId>compiler</artifactId>
                        <version>${flex.version}</version>
                        <type>pom</type>
                    </dependency>
                </dependencies>
			</plugin>

			<plugin>
				<groupId>net.flexmojos.oss</groupId>
				<artifactId>flexmojos-maven-plugin</artifactId>
				<version>${flex-mojos-plugin.version}</version>
				<extensions>true</extensions>
				<executions>
					<execution>
						<goals>
							<goal>wrapper</goal>
						</goals>
					</execution>
				</executions>
				<configuration>
					<templateURI>folder:html-template</templateURI>
					<htmlName>${project.artifactId}</htmlName>
				</configuration>
                <dependencies>
                    <!-- This handles a bug in maven which causes problems with flex resources -->
                    <dependency>
                        <groupId>net.flexmojos.oss</groupId>
                        <artifactId>flexmojos-threadlocaltoolkit-wrapper</artifactId>
                        <version>${flex-mojos-plugin.version}</version>
                    </dependency>
                    <!-- Without this FM will use the compiler configured in its
                    master pom, which will result in version conflicts -->
                    <dependency>
                        <groupId>org.apache.flex</groupId>
                        <artifactId>compiler</artifactId>
                        <version>${flex.version}</version>
                        <type>pom</type>
                    </dependency>
                </dependencies>
			</plugin>
			
		</plugins>
	</build>

</project>
