<?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>corpus-server</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>bundle</packaging>

	<name>OpenNLP Corpus 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>${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,
                        	org.apache.opennlp.corpus_server,
                        	com.sun.jersey.api.core,
                        	com.sun.jersey.spi.container.servlet</Import-Package>
                        <!-- Import-Package>org.apache.derby.jdbc, !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.corpus_server.*, org.apache.opennlp.corpus_server.search</Export-Package>
                        <Webapp-Context>rest</Webapp-Context>
                        <Web-ContextPath>rest</Web-ContextPath>
                        <Bundle-Activator>org.apache.opennlp.corpus_server.CorpusServerBundle</Bundle-Activator>
                    </instructions>
                </configuration>
            </plugin>
            
            <!-- plugin>
	        <groupId>org.apache.karaf.tooling</groupId>
	        <artifactId>features-maven-plugin</artifactId>
	        <version>2.2.4</version>
	        <executions>
	          <execution>
	            <id>generate-features-file</id>
	            <goals>
	              <goal>generate-features-file</goal>
	            </goals>
	            <configuration>
	              <karafVersion>2.2.4</karafVersion>
	            </configuration>
	          </execution>
	        </executions>
	      </plugin -->
      
		</plugins>
	</build>
</project>