<?xml version="1.0" encoding="UTF-8"?>
<!--
  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.stanbol</groupId>
    <artifactId>org.apache.stanbol.data.parent</artifactId>
    <version>1.2.0-SNAPSHOT</version>
    <relativePath>../../../parent</relativePath>
  </parent>

  <groupId>org.apache.stanbol</groupId>
  <artifactId>org.apache.stanbol.data.opennlp.lang.pt</artifactId>
  <version>1.2.0-SNAPSHOT</version>
  <packaging>bundle</packaging>

  <name>Apache Stanbol Data: OpenNLP Models for Portuguese</name>
  <description>
    Bundle containing all necessary/available models for parsing Portuguese language texts. This does not include Models for named entity recocnition (NER).
  </description>
  <inceptionYear>2011</inceptionYear>

  <scm>
    <connection>
      scm:svn:http://svn.apache.org/repos/asf/stanbol/trunk/data/opennlp/lang/pt
    </connection>
    <developerConnection>
      scm:svn:https://svn.apache.org/repos/asf/stanbol/trunk/data/opennlp/lang/pt
    </developerConnection>
    <url>http://stanbol.apache.org/</url>
  </scm>

  <properties>
    <downloadWarning>
*                  
* WARNING - this build downloads some OpenNLP files that are *not*
* licensed under the Apache License, and have more restrictive usage
* terms than the Apache Stanbol code. See STANBOL-545 for more
* information: https://issues.apache.org/jira/browse/STANBOL-545
*
    </downloadWarning>
    <!-- define the path to/home of the OpenNLP modles-->
    <opennlp.model.path>org/apache/stanbol/data/opennlp</opennlp.model.path>
    <opennlp.model.home>http://dev.iks-project.eu/downloads/opennlp/models-1.5</opennlp.model.home>
  </properties>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.felix</groupId>
        <artifactId>maven-bundle-plugin</artifactId>
        <configuration>
          <instructions>
            <_versionpolicy>$${version;===;${@}}</_versionpolicy>

            <!-- 
              Extension used to provide files in that directory to the
              DataFileProvider
              -->
            <Data-Files>${opennlp.model.path}</Data-Files>
            <!-- 
              Use a priority lower than 0 to allow providers without a
              defined ranking to override this default data.
             -->
            <Data-Files-Priority>
              -100
            </Data-Files-Priority>
          </instructions>
        </configuration>
      </plugin>
      <plugin>
        <!-- 
          Ant is used to download the models from the
          http://opennlp.sourceforge.net site.
        -->
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
        <executions>
          <execution>
            <id>download</id>
            <phase>generate-resources</phase>
            <configuration>
              <!--
                TODO: I would like to add an "unless" constraint to the
                target that prevents execution if Maven operates in offline
                mode. However I was not able to find out how to obtain this
                information. ${settings.offline} (as noted by several
                resources) does not work.
                Until fixed builds will fail if no internetconnection is
                available!
              -->
              <target>
                <property name="target.directory" value="${project.basedir}/downloads/resources/${opennlp.model.path}" />
                <property name="model.url" value="${opennlp.model.home}" />
                                
                <echo message="copy OpenNLP models" />
                <echo message=" FROM ${model.url} " />
                <echo message=" TO ${target.directory}" />

                <ant antfile="${basedir}/download_models.xml">
                  <target name="download" />
                </ant>
              </target>
            </configuration>
            <goals>
              <goal>run</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.rat</groupId>
        <artifactId>apache-rat-plugin</artifactId>
        <configuration>
          <excludes><!-- exclude OpenNLP model files -->
              <exclude>**/*.bin</exclude>
          </excludes>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>
