<?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</groupId>
		<artifactId>apache</artifactId>
		<version>9</version>
		<relativePath />
	</parent>

	<groupId>org.apache.opennlp</groupId>
	<artifactId>tagging-server</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>bundle</packaging>

	<name>OpenNLP Tagging Server</name>

	<prerequisites>
		<maven>3.0</maven>
	</prerequisites>

	<repositories>
		<repository>
		    <id>maven2-repository.java.net</id>
		    <name>Java.net Repository for Maven</name>
		    <url>http://download.java.net/maven/2/</url>
		    <layout>default</layout>
		</repository>
	</repositories>
	
	<dependencies>
	
		<dependency>
		  <groupId>org.apache.opennlp</groupId>
		  <artifactId>opennlp-tools</artifactId>
		  <version>1.5.2-incubating</version>
		</dependency>
		
	    <dependency>
      		<groupId>javax.servlet</groupId>
      		<artifactId>servlet-api</artifactId>
      		<version>2.5</version>
    	</dependency>
    
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.core</artifactId>
            <version>4.2.0</version>
        </dependency>
        
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.compendium</artifactId>
            <version>4.2.0</version>
        </dependency>

		<dependency>
			<groupId>com.sun.jersey</groupId>
			<artifactId>jersey-servlet</artifactId>
			<version>1.12</version>
		</dependency>
		
		<dependency>
		    <groupId>com.sun.jersey</groupId>
		    <artifactId>jersey-json</artifactId>
		    <version>1.12</version>
		</dependency>

		<dependency>
		    <groupId>com.sun.jersey</groupId>
		    <artifactId>jersey-client</artifactId>
		    <version>1.12</version>
		    <scope>test</scope>
		</dependency>

		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.8.1</version>
			<scope>test</scope>
		</dependency>
	</dependencies>
	
	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.6</source>
					<target>1.6</target>
          			<compilerArgument>-Xlint</compilerArgument>
				</configuration>
			</plugin>
			
			<!-- to generate the MANIFEST-FILE required by the bundle -->
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <version>2.3.7</version>
                <extensions>true</extensions>
                <executions>
                    <execution>
                        <id>bundle-manifest</id>
                        <phase>process-classes</phase>
                        <goals>
                            <goal>manifest</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <manifestLocation>${project.build.directory}/META-INF</manifestLocation>
                    <instructions>
                        <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
                        <Import-Package>
                        	!javax.persistence.*,
                        	!javax.servlet.annotation,
                        	!javax.servlet.jsp.*,
                        	!javax.microedition.*,
                        	!javax.mail.*,
                        	!javax.transaction.xa,
                        	!javax.jms,
                        	!javax.interceptor,!javax.inject,
                        	!javax.enterprise.*,
                        	!javax.annotation.security,
                        	!javax.ejb,
                        	!com.sun.xml.fastinfoset.*,
                        	!org.jvnet.*,
                        	!org.apache.derby.impl.drda,
                        	!com.ibm.jvm,
                        	!com.sun.jdmk.comm,
                        	!com.sun.net.httpserver,
                        	!sun.misc,
                        	javax.servlet,
                        	*,
                        	com.sun.jersey.json.impl.provider.entity.*,
                        	com.sun.jersey.json.*,
                        	org.codehaus.jackson.*,
                        	org.codehaus.jackson.xc,
                        	com.sun.jersey.api.core,
                        	com.sun.jersey.spi.container.servlet</Import-Package>
                        <!-- Import-Package>!com.ibm.jvm,!com.sun.jdmk.comm,!com.sun.net.httpserver,*,com.sun.jersey.api.core,com.sun.jersey.spi.container.servlet</Import-Package-->
                        <Export-Package>org.apache.opennlp.tagging_server.*</Export-Package>
                        <Webapp-Context>rest</Webapp-Context>
                        <Web-ContextPath>rest</Web-ContextPath>
                        <Bundle-Activator>org.apache.opennlp.tagging_server.TaggingServerBundle</Bundle-Activator>
                    </instructions>
                </configuration>
            </plugin>
	      </plugins>
	</build>
</project>