<?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/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<artifactId>ctakes-temporal</artifactId>
    <packaging>jar</packaging>
    <name>Apache cTAKES Temporal Information Extraction</name>	
	<parent>
		<groupId>org.apache.ctakes</groupId>
		<artifactId>ctakes</artifactId>
		<version>5.0.0-SNAPSHOT</version>
	</parent>
	<dependencies>
		<dependency>
			<groupId>org.apache.ctakes</groupId>
			<artifactId>ctakes-temporal-models</artifactId>
			<version>${ctakes.models.version}</version>
		</dependency>
        <!--  Relation extractor uses clinical-pipeline.  No need to redeclare all those dependencies.  -->
		<dependency>
			<groupId>org.apache.ctakes</groupId>
			<artifactId>ctakes-relation-extractor</artifactId>
		</dependency>
    <dependency>
      <groupId>org.cleartk</groupId>
      <artifactId>cleartk-timeml</artifactId>
    </dependency>
		<dependency>
			<groupId>org.cleartk</groupId>
			<artifactId>cleartk-ml-svmlight</artifactId>
		</dependency>
		<dependency>
			<groupId>org.cleartk</groupId>
			<artifactId>cleartk-ml-tksvmlight</artifactId>
		</dependency>
		<dependency>
			<groupId>org.cleartk</groupId>
			<artifactId>cleartk-type-system</artifactId>
		</dependency>
		<dependency>
			<groupId>org.cleartk</groupId>
			<artifactId>cleartk-ml-crfsuite</artifactId>
		</dependency>
		<dependency>
			<groupId>info.bethard</groupId>
			<artifactId>timenorm</artifactId>
			<version>${timenorm.version}</version>
		</dependency>
		<dependency>
			<groupId>com.googlecode.java-diff-utils</groupId>
			<artifactId>diffutils</artifactId>
			<version>${diffutils.version}</version>
		</dependency>
		<dependency>
			<groupId>org.cleartk</groupId>
			<artifactId>cleartk-ml-mallet</artifactId>
		</dependency>
		<dependency>
			<groupId>org.scala-lang</groupId>
			<artifactId>scala-library</artifactId>
		</dependency>
		<dependency>
			<groupId>com.rubiconproject.oss</groupId>
			<artifactId>jchronic</artifactId>
			<version>${jchronic.version}</version>
		</dependency>
	</dependencies>

	<!-- The below is all necessary to unpack the UMLS resources since they 
		can't be used from the classpath -->
<!--	<build>-->
<!--		<plugins>-->
<!--		</plugins>-->
<!--		<pluginManagement>-->
<!--			<plugins>-->
<!--				<plugin>-->
<!--					<groupId>org.eclipse.m2e</groupId>-->
<!--					<artifactId>lifecycle-mapping</artifactId>-->
<!--					<configuration>-->
<!--						<lifecycleMappingMetadata>-->
<!--							<pluginExecutions>-->
<!--								<pluginExecution>-->
<!--									<pluginExecutionFilter>-->
<!--										<groupId>org.apache.maven.plugins</groupId>-->
<!--										<artifactId>maven-dependency-plugin</artifactId>-->
<!--										<versionRange>[2.0,)</versionRange>-->
<!--										<goals>-->
<!--											<goal>unpack</goal>-->
<!--										</goals>-->
<!--									</pluginExecutionFilter>-->
<!--									<action>-->
<!--										<execute />-->
<!--									</action>-->
<!--								</pluginExecution>-->
<!--							</pluginExecutions>-->
<!--						</lifecycleMappingMetadata>-->
<!--					</configuration>-->
<!--				</plugin>-->
<!--			</plugins>-->
<!--		</pluginManagement>-->
<!--	</build>-->

	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-dependency-plugin</artifactId>
				<executions>
					<execution>
						<id>unpack-models</id>
						<phase>process-resources</phase>
						<goals>
							<goal>unpack-dependencies</goal>
						</goals>
						<configuration>
							<includeArtifactIds>ctakes-temporal-models</includeArtifactIds>
							<excludes>**/META-INF/**</excludes>
							<outputDirectory>${project.basedir}/../resources</outputDirectory>
						</configuration>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
</project>
