<!--

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-violations-viewer</artifactId>
	<packaging>swf</packaging>

	<name>Adobe Flex PMD Violations viewer</name>
	<description>Adobe Flex PMD Violations viewer</description>

	<dependencies>

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

		<!--  Cairngorm -->
		<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.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>

    </dependencies>

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

		<plugins>

			<plugin>
				<groupId>net.flexmojos.oss</groupId>
				<artifactId>flexmojos-maven-plugin</artifactId>
				<version>${flex-mojos-plugin.version}</version>
				<extensions>true</extensions>
				<configuration>
                    <!-- It seems the wrapper needs 3 segments of a version number -->
					<targetPlayer>${flash-player.version}.0</targetPlayer>
					<defaultSizeWidth>1000</defaultSizeWidth>
					<defaultSizeHeight>700</defaultSizeHeight>
					<useNetwork>false</useNetwork>
				</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>
				</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>
