<!--
	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.uima</groupId>
    <artifactId>parent-pom-single-project</artifactId>
    <version>1-SNAPSHOT</version>
    <relativePath/>
  </parent>
  
	<artifactId>TikaAnnotator</artifactId>
	<version>2.3.1-SNAPSHOT</version>
  <name>UIMA Annotator: ${project.artifactId}</name>
<url>${uimaWebsiteUrl}</url>
  
  <!-- Special inheritance note
       even though the <scm> element that follows is exactly the 
       same as those in super poms, it cannot be inherited because 
       there is some special code that computes the connection elements
       from the chain of parent poms, if this is omitted. 
       
       Keeping this a bit factored allows cutting/pasting the <scm>
       element, and just changing the following two properties -->  
  <scm>
    <connection>
      scm:svn:http://svn.apache.org/repos/asf/uima/${uimaScmRoot}/trunk/${uimaScmProject}
    </connection>
    <developerConnection>
      scm:svn:https://svn.apache.org/repos/asf/uima/${uimaScmRoot}/trunk/${uimaScmProject}
    </developerConnection>
    <url>
      http://svn.apache.org/viewvc/uima/${uimaScmRoot}/trunk/${uimaScmProject}
    </url>
  </scm>
  
  <properties>
    <uimaScmRoot>sandbox</uimaScmRoot>
    <uimaScmProject>${project.artifactId}</uimaScmProject>
    <uimaDependencyVersion>2.3.1-SNAPSHOT</uimaDependencyVersion>
  </properties>
  
  <dependencies>
    <!-- versions from parent -->
    <dependency>
      <groupId>org.apache.uima</groupId>
      <artifactId>uimaj-core</artifactId>
      <version>${uimaDependencyVersion}</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.uima</groupId>
      <artifactId>uimaj-document-annotation</artifactId>
      <version>${uimaDependencyVersion}</version>
      <scope>provided</scope>
    </dependency>
    
    <dependency>
      <groupId>org.apache.tika</groupId>
      <artifactId>tika-core</artifactId>
      <version>0.4</version>
    </dependency>
    <dependency>
      <groupId>org.apache.tika</groupId>
      <artifactId>tika-parsers</artifactId>
      <version>0.4</version>
      <exclusions>
        <exclusion>
          <groupId>pdfbox</groupId>
          <artifactId>pdfbox</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    
  </dependencies>
  
	<build>
		<finalName>uima-an-tika</finalName>
    
    <plugins>
      <!-- Release Audit Tool checks -->
      <plugin>
        <groupId>org.apache.rat</groupId>
        <artifactId>apache-rat-plugin</artifactId>
        <executions>
          <execution>
            <id>default-cli</id>
            <configuration>
              <excludes>
                <exclude>src/main/java/org/apache/uima/tika/AttributeFS.java</exclude> <!-- generated -->
                <exclude>src/main/java/org/apache/uima/tika/AttributeFS_Type.java</exclude> <!-- generated -->
                <exclude>src/main/java/org/apache/uima/tika/FeatureValue.java</exclude> <!-- generated -->
                <exclude>src/main/java/org/apache/uima/tika/FeatureValue_Type.java</exclude> <!-- generated -->
                <exclude>src/main/java/org/apache/uima/tika/MarkupAnnotation.java</exclude> <!-- generated -->
                <exclude>src/main/java/org/apache/uima/tika/MarkupAnnotation_Type.java</exclude> <!-- generated -->
                <exclude>src/main/java/org/apache/uima/tika/SourceDocumentAnnotation.java</exclude> <!-- generated -->
                <exclude>src/main/java/org/apache/uima/tika/SourceDocumentAnnotation_Type.java</exclude> <!-- generated -->
              </excludes>
            </configuration>
          </execution>
        </executions>
      </plugin>            
    </plugins>

	</build>
</project>