<!--
  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.activemq</groupId>
      <artifactId>artemis-pom</artifactId>
      <version>1.3.0</version>
   </parent>

   <artifactId>artemis-dto</artifactId>
   <packaging>jar</packaging>
   <name>ActiveMQ Artemis DTO</name>

   <properties>
     <activemq.basedir>${project.basedir}/..</activemq.basedir>
   </properties>

   <dependencies>
      <dependency>
         <groupId>org.apache.activemq</groupId>
         <artifactId>artemis-commons</artifactId>
         <version>${project.version}</version>
      </dependency>
   </dependencies>

   <build>
     <resources>
       <resource>
         <directory>target/schema</directory>
         <includes>
           <include>**/*</include>
         </includes>
       </resource>
       <resource>
         <directory>src/main/resources</directory>
         <includes>
           <include>**/*</include>
         </includes>
         <filtering>true</filtering>
       </resource>
     </resources>

     <plugins>
       <plugin>
         <artifactId>maven-antrun-plugin</artifactId>
         <version>1.7</version>
         <executions>
           <execution>
             <phase>generate-resources</phase>
             <configuration>
               <target>
                 <taskdef name="schemagen" classname="com.sun.tools.jxc.SchemaGenTask" />
                 <mkdir dir="${project.build.directory}/schema/org.apache.activemq/dto" />
                 <echo message="Generating XSD to: ${project.build.directory}/schema/org.apache.activemq/dto" />
                 <schemagen srcdir="${basedir}/.." destdir="${project.build.directory}/schema/org.apache.activemq/dto" includeantruntime="false">
                   <schema namespace="http://activemq.org/schema" file="activemq.xsd" />
                   <classpath refid="maven.compile.classpath" />
                   <include name="**/package-info.java" />
                   <include name="**/*DTO.java" />
                   <exclude name="**/.git/**" />
                   <exclude name="**/.svn/**" />
                 </schemagen>
                 <copy todir="${project.build.directory}/classes">
                   <fileset dir="${project.build.directory}/schema" />
                 </copy>
               </target>
             </configuration>
             <goals>
               <goal>run</goal>
             </goals>
           </execution>
         </executions>
         <dependencies>
            <dependency>
               <groupId>javax.xml.bind</groupId>
               <artifactId>jaxb-api</artifactId>
               <version>2.2.7</version>
            </dependency>
            <dependency>
               <groupId>com.sun.xml.bind</groupId>
               <artifactId>jaxb-impl</artifactId>
               <version>2.2.7</version>
            </dependency>
            <dependency>
               <groupId>com.sun.xml.bind</groupId>
               <artifactId>jaxb-jxc</artifactId>
               <version>2.2.7</version>
            </dependency>
         </dependencies>
       </plugin>
     </plugins>
     <pluginManagement>
     	<plugins>
     		<!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
     		<plugin>
     			<groupId>org.eclipse.m2e</groupId>
     			<artifactId>lifecycle-mapping</artifactId>
     			<version>1.0.0</version>
     			<configuration>
     				<lifecycleMappingMetadata>
     					<pluginExecutions>
     						<pluginExecution>
     							<pluginExecutionFilter>
     								<groupId>org.apache.maven.plugins</groupId>
     								<artifactId>maven-antrun-plugin</artifactId>
     								<versionRange>[1.7,)</versionRange>
     								<goals>
     									<goal>run</goal>
     								</goals>
     							</pluginExecutionFilter>
     							<action>
     								<ignore />
     							</action>
     						</pluginExecution>
     					</pluginExecutions>
     				</lifecycleMappingMetadata>
     			</configuration>
     		</plugin>
     	</plugins>
     </pluginManagement>
   </build>

   <profiles>
     <profile>
       <id>jdk-1.5</id>
       <activation>
         <jdk>1.5</jdk>
       </activation>
       <dependencies>
         <dependency>
           <groupId>javax.xml.bind</groupId>
           <artifactId>jaxb-api</artifactId>
           <version>${jaxb-api-version}</version>
         </dependency>
         <dependency>
           <groupId>com.sun.xml.bind</groupId>
           <artifactId>jaxb-impl</artifactId>
           <version>${jaxb-version}</version>
         </dependency>
       </dependencies>
     </profile>

    <profile>
       <id>ibmjdk</id>
       <activation>
         <file>
           <exists>${java.home}/../lib/tools.jar</exists>
         </file>
       </activation>
       <build>
         <pluginManagement>
           <plugins>
             <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-antrun-plugin</artifactId>
               <dependencies>
                 <dependency>
                   <groupId>com.sun</groupId>
                   <artifactId>tools</artifactId>
                   <!--the real JDK version could be 1.5 or 1.6-->
                   <version>1.5.0</version>
                   <scope>system</scope>
                   <optional>true</optional>
                   <systemPath>${java.home}/../lib/tools.jar</systemPath>
                 </dependency>
               </dependencies>
             </plugin>
           </plugins>
         </pluginManagement>
       </build>
     </profile>
   </profiles>

</project>
