<!-- 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.felix</groupId>
		<artifactId>felix-parent</artifactId>
		<version>1.2.0</version>
		<relativePath>../../../pom/pom.xml</relativePath>
	</parent>

	<artifactId>org.apache.felix.webconsole.plugins.deppack</artifactId>
	<packaging>bundle</packaging>
	<version>1.0.0-SNAPSHOT</version>

	<name>Apache Felix Web Console Deployment Packages Plugin</name>
	<description>
        This is a plugin for the Apache Felix OSGi web console for displaying Deployment Packages.
    </description>

	<scm>
		<connection>scm:svn:http://svn.apache.org/repos/asf/felix/trunk/webconsole-plugins/deppack</connection>
		<developerConnection>scm:svn:https://svn.apache.org/repos/asf/felix/trunk/webconsole-plugins/deppack</developerConnection>
		<url>http://svn.apache.org/viewvc/felix/trunk/webconsole-plugins/deppack</url>
	</scm>

	<build>
		<!-- add UTF-8-to-ISO translated resources -->
		<resources>
			<resource>
				<directory>${basedir}/src/main/resources</directory>
			</resource>
			<resource>
				<directory>target/classes</directory>
				<includes>
					<include>OSGI-INF/**</include>
				</includes>
				<filtering>false</filtering>
			</resource>
		</resources>

		<plugins>
			<!-- translate UTF-8 encoded properties files to ISO-8859-1 -->
			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>native2ascii-maven-plugin</artifactId>
                <version>1.0-beta-1</version>
				<executions>
					<execution>
						<goals>
							<goal>native2ascii</goal>
						</goals>
						<configuration>
							<encoding>UTF-8</encoding>
						</configuration>
					</execution>
				</executions>
			</plugin>

			<plugin>
				<groupId>org.apache.felix</groupId>
				<artifactId>maven-bundle-plugin</artifactId>
				<version>2.0.1</version>
				<extensions>true</extensions>
				<configuration>
					<instructions>
						<Bundle-SymbolicName>
							${artifactId}
                        </Bundle-SymbolicName>
						<Bundle-Activator>
							org.apache.felix.webconsole.plugins.deppack.internal.Activator
                        </Bundle-Activator>
					</instructions>
				</configuration>
			</plugin>
		</plugins>
	</build>

	<dependencies>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.4</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.1.1</version>
			<scope>provided</scope>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.osgi</groupId>
			<artifactId>org.osgi.core</artifactId>
			<version>4.0.0</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.osgi</groupId>
			<artifactId>org.osgi.compendium</artifactId>
			<version>4.1.0</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.felix</groupId>
			<artifactId>org.apache.felix.webconsole</artifactId>
			<version>3.0.0</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.json</groupId>
			<artifactId>json</artifactId>
			<version>20070829</version>
			<scope>compile</scope>
			<optional>true</optional>
		</dependency>
	</dependencies>
</project>
