<!--
	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>
	<groupId>org.apache.uima</groupId>
	<artifactId>OpenCalaisAnnotatorGroovy</artifactId>
	<packaging>jar</packaging>
	<version>2.2.2-incubating</version>
	<name>OpenCalais UIMA Annotator Wrapper - Groovy version</name>
	<url>http://incubator.apache.org/uima</url>
	<dependencies>
		<dependency>
			<groupId>org.apache.uima</groupId>
			<artifactId>uimaj-core</artifactId>
			<version>2.2.2-incubating</version>
			<scope>compile</scope>
		</dependency>
		<!--dependency>
			<groupId>org.apache.uima</groupId>
			<artifactId>PearPackagingMavenPlugin</artifactId>
			<version>2.2.2-incubating</version>
			<scope>provided</scope>
		</dependency-->
		<dependency>
			<groupId>org.apache.uima</groupId>
			<artifactId>uimaj-test-util</artifactId>
			<version>2.2.2-incubating</version>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.uima</groupId>
			<artifactId>uimaj-component-test-util</artifactId>
			<version>2.2.2-incubating</version>
			<scope>compile</scope>
		</dependency>
    <dependency>
      <groupId>org.codehaus.groovy</groupId>
      <artifactId>groovy</artifactId>
      <version>1.5.6</version>
      <scope>compile</scope>
    </dependency>
    
    <dependency>
      <groupId>org.codehaus.groovy.maven</groupId>
                <artifactId>gmaven-mojo</artifactId>
                <version>1.0-rc-2</version>
            </dependency>
            <dependency>
                <groupId>org.codehaus.groovy.maven.runtime</groupId>
                <artifactId>gmaven-runtime-default</artifactId>
                <version>1.0-rc-2</version>
            </dependency>

	</dependencies>
	<build>
		<finalName>uima-an-calais-groovy</finalName>
		<resources>
			<resource>
				<directory>desc</directory>
				<excludes>
        	  		<exclude>**</exclude>
		        </excludes>
			</resource>
		</resources>
		<plugins>
   
      <plugin>
        <groupId>org.codehaus.groovy.maven</groupId>
        <artifactId>gmaven-plugin</artifactId>
        <version>1.0-rc-2</version>
        <executions>
          <execution>
            <goals>
              <goal>generateStubs</goal>
              <goal>compile</goal>
              <goal>generateTestStubs</goal>
              <goal>testCompile</goal>
            </goals>
          </execution>
       </executions>
     </plugin>
      
		   <plugin>
          <groupId>org.apache.maven.plugins</groupId>
	        <artifactId>maven-compiler-plugin</artifactId>
	        <configuration>
	          <source>1.5</source>
	          <target>1.5</target>
	        </configuration>
	      </plugin>
	        
	      <plugin>
		      <groupId>org.codehaus.mojo</groupId>
          <artifactId>buildnumber-maven-plugin</artifactId>
	        <executions>
		        <execution>
		          <phase>process-classes</phase>
		          <goals>
		            <goal>create</goal>
		          </goals>
		        </execution>
		      </executions>
		      <configuration>
		        <format>{0,date,yyyy-MM-dd HH:mm:ss}</format>
		        <items>
		          <item>timestamp</item>
		        </items>
		      </configuration>
	    	</plugin>
      
    		<plugin>
		  		<artifactId>maven-antrun-plugin</artifactId>
			  	<executions>
				  	<execution>
					  	<id>CopyLicenseNoticeDisclaimer</id>
				  		<phase>process-resources</phase>
					  	<configuration>
						  	<tasks>                    
              		<copy todir="src/main/resources/META-INF">
              			<fileset dir="." includes="LICENSE NOTICE DISCLAIMER"/>
              		</copy>
              		<copy todir="target/classes/META-INF">
              			<fileset dir="." includes="LICENSE.txt NOTICE.txt DISCLAIMER"/>
              		</copy>
							  </tasks>
						  </configuration>
						  <goals>
							  <goal>run</goal>
						  </goals>
					  </execution>
					  <!-- after compilation has been done and the files have been copied to the
						     target directory, delete them from the source directory. -->
					  <execution>
						  <id>DeleteLicenseNoticeDisclaimer</id>
					  	<phase>package</phase>
					  	<configuration>
                <tasks>
                  <delete dir="src/main/resources/META-INF" deleteOnExit="true" quiet="true"
                    failOnError="false">
                    <fileset dir="src/main/resources/META-INF" includes="LICENSE NOTICE DISCLAIMER"/>
                  </delete>
                </tasks>
						  </configuration>
						  <goals>
							  <goal>run</goal>
						  </goals>
					  </execution>	
					  <!-- also delete on clean. -->
					  <execution>
				  		<id>CleanLicenseNoticeDisclaimer</id>
				  		<phase>clean</phase>
					  	<configuration>
                <tasks>
                  <delete dir="src/main/resources/META-INF" deleteOnExit="true" quiet="true"
                          failOnError="false">
                    <fileset dir="src/main/resources/META-INF" includes="LICENSE NOTICE DISCLAIMER"/>
                  </delete>
                </tasks>
						  </configuration>
						  <goals>
							  <goal>run</goal>
						  </goals>
					  </execution>	
				  </executions>
			  </plugin>
              
	      <plugin>
		      <groupId>org.apache.maven.plugins</groupId>
		      <artifactId>maven-jar-plugin</artifactId>
		      <configuration>
		        <archive>
              <manifestEntries>
                <Project-Title>Apache UIMA</Project-Title>
                <Implementation-Title>${pom.name}</Implementation-Title>
                <Implementation-Version>${pom.version}</Implementation-Version>
                <Implementation-Vendor>Apache Software Foundation</Implementation-Vendor>
                <Implementation-Url>${pom.url}</Implementation-Url>
                <Implementation-License>
                  http://www.apache.org/licenses/LICENSE-2.0.txt</Implementation-License>
                <Build-Date>${buildNumber}</Build-Date>
              </manifestEntries>
		        </archive>
		      </configuration>
       	</plugin> 
      		
      	<plugin>
				  <groupId>org.apache.uima</groupId>
		  		<artifactId>PearPackagingMavenPlugin</artifactId>
				  <extensions>true</extensions>
				  <executions>
					  <execution>
				  		<phase>package</phase>
					  	<configuration>
					  	  <classpath></classpath>
						    <mainComponentDesc>src/main/descriptors/OpenCalaisAnnotator.xml</mainComponentDesc>
						    <componentId>OpenCalaisAnnotatorG</componentId>
						  </configuration>
						  <goals>
							  <goal>package</goal>
						  </goals>
					  </execution>	
				  </executions>
			  </plugin>
      		
		</plugins>
	</build>
	<repositories>
		<repository>
			<id>ApacheIncubatorRepository</id>
			<url>
				http://people.apache.org/repo/m2-incubating-repository/
			</url>
		</repository>
	</repositories>
</project>
