<!--

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-flex-lib</artifactId>
	<packaging>swc</packaging>

	<name>Adobe Flex PMD Flex lib</name>
	<description>Adobe Flex PMD Flex library containing shared classes</description>

	<dependencies>

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

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

        <dependency>
            <groupId>com.adobe.cairngorm</groupId>
            <artifactId>event-source</artifactId>
            <version>${event-source.version}</version>
            <type>swc</type>
            <scope>test</scope>
        </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>org.apache.flex.framework.themes</groupId>
            <artifactId>spark</artifactId>
            <version>${flex.version}</version>
            <type>swc</type>
            <scope>theme</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>
				<artifactId>maven-antrun-plugin</artifactId>
				<version>${ant-run-plugin.version}</version>
				<executions>
					<execution>
						<id>copy-version-as</id>
						<phase>process-resources</phase>
						<configuration>
							<tasks>
								<tstamp>
									<format property="last.updated.date" pattern="yyyy-MM-dd" />
									<format property="last.updated.time" pattern="HH:mm:ss" />
								</tstamp>
								<echo message="Generating Version.as..." />
								<echo file="${basedir}/src/main/flex/Version.as" append="false" message="package" />
								<echo file="${basedir}/src/main/flex/Version.as" append="true" message="{" />
								<echo file="${basedir}/src/main/flex/Version.as" append="true" message=" public class Version" />
								<echo file="${basedir}/src/main/flex/Version.as" append="true" message=" {" />
								<echo file="${basedir}/src/main/flex/Version.as" append="true" message=" public static const BUILD_NUMBER : String = '${project.version}';" />
								<echo file="${basedir}/src/main/flex/Version.as" append="true" message=" public static const BUILD_TIME : String = '${last.updated.time}';" />
								<echo file="${basedir}/src/main/flex/Version.as" append="true" message=" public static const BUILD_DATE : String = '${last.updated.date}';" />
								<echo file="${basedir}/src/main/flex/Version.as" append="true" message=" }" />
								<echo file="${basedir}/src/main/flex/Version.as" append="true" message="}" />
							</tasks>
						</configuration>
						<goals>
							<goal>run</goal>
						</goals>
					</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}</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>
		</plugins>
	</build>

	<reporting>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-surefire-report-plugin</artifactId>
				<configuration>
					<reportsDirectory>surefire-reports</reportsDirectory>
				</configuration>
			</plugin>

			<!--plugin>
				<groupId>${project.groupId}</groupId>
				<artifactId>flex-pmd-maven-plugin</artifactId>
				<version>${project.parent.version}</version>
				<configuration>
					<failOnError>true</failOnError>
				</configuration>
			</plugin-->
		</plugins>
	</reporting>

</project>
