<?xml version="1.0" encoding="UTF-8"?>
<!--
  ============LICENSE_START=======================================================
  ONAP Policy Engine - Drools PDP
  ================================================================================
  Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
  ================================================================================
  Licensed 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.
  ============LICENSE_END=========================================================
  -->

<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.onap.policy.drools-pdp</groupId>
    <artifactId>drools-pdp</artifactId>
    <version>1.1.0-SNAPSHOT</version>
  </parent>

  <artifactId>policy-management</artifactId>

  <name>policy-management</name>
  <description>Policy Management</description>

  <properties>
          <maven.compiler.source>1.8</maven.compiler.source>
          <maven.compiler.target>1.8</maven.compiler.target>
          <jetty.version>9.3.14.v20161028</jetty.version>
          <gson.version>2.8.0</gson.version>
  </properties>


  <build>
    <plugins>
			<plugin>
				<artifactId>maven-assembly-plugin</artifactId>
				<version>2.6</version>
				<executions>
					<execution>
						<id>zipfile</id>
						<goals>
							<goal>single</goal>
						</goals>
						<phase>package</phase>
						<configuration>
							<attach>true</attach>
							<finalName>${project.artifactId}-${project.version}</finalName>
							<descriptors>
								<descriptor>src/assembly/assemble_zip.xml</descriptor>
							</descriptors>
							<appendAssemblyId>false</appendAssemblyId>
						</configuration>
					</execution>
				</executions>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-dependency-plugin</artifactId>
				<version>2.8</version>
				<executions>
					<execution>
						<id>copy-dependencies</id>
						<goals>
							<goal>copy-dependencies</goal>
						</goals>
						<phase>prepare-package</phase>
						<configuration>
							<transitive>false</transitive>
							<outputDirectory>${project.build.directory}/assembly/lib</outputDirectory>
							<overWriteReleases>false</overWriteReleases>
							<overWriteSnapshots>true</overWriteSnapshots>
							<overWriteIfNewer>true</overWriteIfNewer>
							<useRepositoryLayout>false</useRepositoryLayout>
							<addParentPoms>false</addParentPoms>
							<copyPom>false</copyPom>
							<excludeGroupIds>javax.inject</excludeGroupIds>
							<excludeScope>provided</excludeScope>
						</configuration>
					</execution>
				</executions>
			</plugin>
			<plugin>
				<artifactId>maven-resources-plugin</artifactId>
				<version>2.6</version>
				<executions>
					<execution>
						<id>copy-version</id>
						<goals>
							<goal>copy-resources</goal>
						</goals>
						<phase>validate</phase>
						<configuration>
							<outputDirectory>${basedir}/target/versions</outputDirectory>
							<resources>
								<resource>
									<directory>src/main/resources/versions</directory>
									<includes>
										<include>version.properties</include>
									</includes>
									<filtering>true</filtering>
								</resource>
							</resources>
						</configuration>
					</execution>
					<execution>
						<id>copy-resources</id>
						<goals>
							<goal>copy-resources</goal>
						</goals>
						<phase>validate</phase>
						<configuration>
							<outputDirectory>${basedir}/target/etc/bvc-extensions</outputDirectory>
							<resources>
								<resource>
									<directory>src/main/resources/etc/bvc-extensions</directory>
									<includes>
										<include>feature_config_template.cfg</include>
										<include>feature_custom.install</include>
									</includes>
									<filtering>true</filtering>
								</resource>
							</resources>
						</configuration>
					</execution>
				</executions>
			</plugin>
    </plugins>
  </build>

  <dependencies>
    
    <dependency>
      <groupId>org.onap.policy.drools-pdp</groupId>
      <artifactId>policy-core</artifactId>
      <version>${project.version}</version>
    </dependency>
    
    <dependency>
      <groupId>org.onap.policy.drools-pdp</groupId>
      <artifactId>policy-endpoints</artifactId>
      <version>${project.version}</version>
    </dependency>

	<dependency>
		<groupId>org.eclipse.jetty</groupId>
		<artifactId>jetty-server</artifactId>
		<version>${jetty.version}</version>
	</dependency>

	<dependency>
		<groupId>org.eclipse.jetty</groupId>
		<artifactId>jetty-servlet</artifactId>
		<version>${jetty.version}</version>
	</dependency>
			
	<dependency>
		<groupId>org.glassfish.jersey.core</groupId>
		<artifactId>jersey-server</artifactId>
		<version>${jersey.version}</version>
	</dependency>
	
	<dependency>
		<groupId>org.glassfish.jersey.containers</groupId>
		<artifactId>jersey-container-servlet-core</artifactId>
	</dependency>
	
	<dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>${jersey.version}</version>
    </dependency>
    
   	<dependency>
		<groupId>org.glassfish.jersey.containers</groupId>
		<artifactId>jersey-container-jetty-http</artifactId>
		<version>${jersey.version}</version>
		<exclusions>
			<exclusion>
				<groupId>org.eclipse.jetty</groupId>
				<artifactId>jetty-util</artifactId>
			</exclusion>
		</exclusions>
	</dependency>
	
	<dependency>
	    <groupId>io.swagger</groupId>
	    <artifactId>swagger-jersey2-jaxrs</artifactId>
	</dependency>
	
	<dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>${jackson.version}</version>
	</dependency>
	
	<dependency>
	  <groupId>com.fasterxml.jackson.datatype</groupId>
	  <artifactId>jackson-datatype-jsr310</artifactId>
	  <version>${jackson.version}</version>
	</dependency> 
	
	<dependency>
	    <groupId>com.fasterxml.jackson.core</groupId>
	    <artifactId>jackson-annotations</artifactId>
	    <version>${jackson.version}</version>
	</dependency>
	
	<dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>${gson.version}</version>
	</dependency>
	
	<dependency>
	  <groupId>com.fatboyindustrial.gson-javatime-serialisers</groupId>
	  <artifactId>gson-javatime-serialisers</artifactId>
	  <version>1.1.1</version>
	</dependency>
	
	<dependency>
		<groupId>org.apache.commons</groupId>
		<artifactId>commons-collections4</artifactId>
		<version>4.1</version>
	</dependency>
	
	<!-- This entry is necessary to support import "org.apache.commons.lang3.time.DateUtils" 
		 reference in StandbyStateManagementTest.java -->
	<dependency>
		<groupId>org.apache.commons</groupId>
		<artifactId>commons-lang3</artifactId>
		<version>3.4</version>
	</dependency>
	
	<dependency>
		<groupId>ch.qos.logback</groupId>
		<artifactId>logback-classic</artifactId>
	</dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

  </dependencies>

</project>
