<?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>javax.servlet</groupId>
      		<artifactId>servlet-api</artifactId>
      		<version>2.5</version>
      		<scope>provided</scope>
    	</dependency>
    
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.core</artifactId>
            <version>4.2.0</version>
            <scope>provided</scope>
        </dependency>
        
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.compendium</artifactId>
            <version>4.2.0</version>
            <scope>provided</scope>
        </dependency>

		<dependency>
			<groupId>com.sun.jersey</groupId>
			<artifactId>jersey-servlet</artifactId>
			<version>1.12</version>
			<scope>provided</scope>
		</dependency>
		
		<dependency>
		    <groupId>com.sun.jersey</groupId>
		    <artifactId>jersey-json</artifactId>
		    <version>1.12</version>
		    <scope>provided</scope>
		</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>${pom.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,
                        	org.apache.opennlp.corpus_server,
                        	org.apache.derby.jdbc,
                        	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>