<!--

    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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>org.apache.apex</groupId>
    <artifactId>malhar</artifactId>
    <version>3.3.2-incubating-SNAPSHOT</version>
  </parent>

  <artifactId>malhar-kafka</artifactId>
  <name>Apache Apex Malhar (incubating) Kafka Support</name>
  <packaging>jar</packaging>

  <build>
    <plugins>
      <!-- Publish tests jar -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.4</version>
        <executions>
          <execution>
            <goals>
              <goal>test-jar</goal>
            </goals>
            <phase>package</phase>
          </execution>
        </executions>
      </plugin>
     <!-- create resource directory for xml javadoc-->
     <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-antrun-plugin</artifactId>
         <executions>
           <execution>
               <id>createJavadocDirectory</id>
               <phase>generate-resources</phase>
               <configuration>
                   <tasks>
                     <delete dir="${project.build.directory}/generated-resources/xml-javadoc"/>
                     <mkdir dir="${project.build.directory}/generated-resources/xml-javadoc"/>
                   </tasks>
               </configuration>
               <goals>
                   <goal>run</goal>
               </goals>
           </execution>
         </executions>
      </plugin>
     <!-- generate javdoc -->
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-javadoc-plugin</artifactId>
       <executions>
         <!-- generate xml javadoc -->
         <execution>
           <id>xml-doclet</id>
           <phase>generate-resources</phase>
           <goals>
             <goal>javadoc</goal>
           </goals>
           <configuration>
             <doclet>com.github.markusbernhardt.xmldoclet.XmlDoclet</doclet>
             <additionalparam>-d ${project.build.directory}/generated-resources/xml-javadoc -filename ${project.artifactId}-${project.version}-javadoc.xml</additionalparam>
             <useStandardDocletOptions>false</useStandardDocletOptions>
             <docletArtifact>
               <groupId>com.github.markusbernhardt</groupId>
               <artifactId>xml-doclet</artifactId>
               <version>1.0.4</version>
             </docletArtifact>
           </configuration>
         </execution>
         <!-- generate default javadoc jar with custom tags -->
         <execution>
           <id>attach-sources</id>
           <goals>
             <goal>jar</goal>
           </goals>
           <configuration>
             <skip>true</skip>
             <tags>
               <tag>
                 <name>customTag1</name>
                 <placement>a</placement>
                 <head>Custom Tag One:</head>
               </tag>
               <tag>
                 <name>customTag2</name>
                 <placement>a</placement>
                 <head>Custom Tag two:</head>
               </tag>
               <tag>
                 <name>customTag3</name>
                 <placement>a</placement>
                 <head>Custom Tag three:</head>
               </tag>
             </tags>
           </configuration>
         </execution>
       </executions>
     </plugin>
     <!-- Transform xml javadoc to stripped down version containing only class/interface comments and tags-->
     <plugin>
       <groupId>org.codehaus.mojo</groupId>
       <artifactId>xml-maven-plugin</artifactId>
       <version>1.0</version>
       <executions>
         <execution>
           <id>transform-xmljavadoc</id>
           <phase>generate-resources</phase>
           <goals>
             <goal>transform</goal>
           </goals>
         </execution>
       </executions>
       <configuration>
         <transformationSets>
           <transformationSet>
             <dir>${project.build.directory}/generated-resources/xml-javadoc</dir>
             <includes>
               <include>${project.artifactId}-${project.version}-javadoc.xml</include>
             </includes>
             <stylesheet>XmlJavadocCommentsExtractor.xsl</stylesheet>
             <outputDir>${project.build.directory}/generated-resources/xml-javadoc</outputDir>
           </transformationSet>
         </transformationSets>
       </configuration>
     </plugin>
     <!-- copy xml javadoc to class jar -->
     <plugin>
       <artifactId>maven-resources-plugin</artifactId>
       <version>2.6</version>
       <executions>
         <execution>
           <id>copy-resources</id>
           <phase>process-resources</phase>
           <goals>
             <goal>copy-resources</goal>
           </goals>
           <configuration>
             <outputDirectory>${basedir}/target/classes</outputDirectory>
             <resources>
               <resource>
                 <directory>${project.build.directory}/generated-resources/xml-javadoc</directory>
                 <includes>
                   <include>${project.artifactId}-${project.version}-javadoc.xml</include>
                 </includes>
                 <filtering>true</filtering>
               </resource>
             </resources>
           </configuration>
         </execution>
       </executions>
     </plugin>
     <plugin>
       <artifactId>maven-surefire-plugin</artifactId>
       <configuration>
         <argLine>-Xmx2048m</argLine>
       </configuration>
     </plugin>
    </plugins>
  </build>

  <dependencies>
    <dependency>
      <groupId>org.apache.kafka</groupId>
      <artifactId>kafka_2.11</artifactId>
      <version>0.9.0.0</version>
      <optional>true</optional>
      <exclusions>
        <exclusion>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
        <exclusion>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-simple</artifactId>
        </exclusion>
        <exclusion>
          <groupId>log4j</groupId>
          <artifactId>log4j</artifactId>
        </exclusion>
        <exclusion>
          <groupId>org.apache.zookeeper</groupId>
          <artifactId>zookeeper</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>org.apache.kafka</groupId>
      <artifactId>kafka-clients</artifactId>
      <version>0.9.0.0</version>
    </dependency>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>malhar-library</artifactId>
      <version>${project.version}</version>
    </dependency>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>malhar-library</artifactId>
      <version>${project.version}</version>
      <scope>test</scope>
      <classifier>tests</classifier>
    </dependency>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>apex-common</artifactId>
      <version>${apex.core.version}</version>
      <type>jar</type>
    </dependency>
  </dependencies>
</project>
