<!--
    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/xsd/maven-4.0.0.xsd">
	<parent>
		<artifactId>felix-parent</artifactId>
		<groupId>org.apache.felix</groupId>
        <version>6</version>
        <relativePath />
	</parent>
    <modelVersion>4.0.0</modelVersion>
    <packaging>bundle</packaging>
    <name>Apache Felix User Admin</name>
    <description>
        Provides an implementation for the UserAdmin OSGi
        compendium service.
    </description>
	<artifactId>org.apache.felix.useradmin</artifactId>
    <version>1.0.4</version>
    <scm>
        <connection>scm:svn:https://svn.apache.org/repos/asf/felix/releases/org.apache.felix.useradmin-1.0.4</connection>
        <developerConnection>scm:svn:https://svn.apache.org/repos/asf/felix/releases/org.apache.felix.useradmin-1.0.4</developerConnection>
        <url>scm:svn:https://svn.apache.org/repos/asf/felix/releases/org.apache.felix.useradmin-1.0.4</url>
    </scm>
	<dependencies>
		<dependency>
			<groupId>org.osgi</groupId>
			<artifactId>org.osgi.compendium</artifactId>
			<version>4.0.0</version>
		</dependency>
		<dependency>
            <groupId>org.apache.felix</groupId>
			<artifactId>org.apache.felix.framework</artifactId>
			<version>4.0.2</version>
		</dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
	</dependencies>
	<build>
		<plugins>
            <plugin>
                <groupId>org.apache.rat</groupId>
                <artifactId>apache-rat-plugin</artifactId>
                <configuration>
                    <includes>
                        <include>src/**</include>
                    </includes>
                    <excludes>
                        <exclude>src/main/resources/**</exclude>
                    </excludes>
                </configuration>
            </plugin>
			<plugin>
				<groupId>org.apache.felix</groupId>
				<artifactId>maven-bundle-plugin</artifactId>
                <version>3.2.0</version>
				<extensions>true</extensions>
				<configuration>
					<instructions>
						<Bundle-Name>Apache Felix User Admin Service</Bundle-Name>
						<Bundle-Description>
							An implementation of the OSGi User Admin Compendium Service
						</Bundle-Description>
						<Bundle-Activator>
							${project.artifactId}.osgi.Activator
						</Bundle-Activator>
						<Bundle-SymbolicName>
							${project.artifactId}
						</Bundle-SymbolicName>
						<Bundle-Vendor>The Apache Software Foundation</Bundle-Vendor>
						<Import-Package>
							org.osgi.framework;version="[1.5,2.0)",
						    org.osgi.service.useradmin; version="[1.1,1.2)",
						    org.osgi.service.event; version="[1.0,2)"; resolution:=optional,
						    *
						</Import-Package>
						<Export-Package>
					        org.osgi.service.useradmin; version="1.1",
							${project.artifactId}; version="1.0.0"
						</Export-Package>
						<Private-Package>
							${project.artifactId}.*
						</Private-Package>
                                                <Provide-Capability>
					                osgi.service;objectClass:List&lt;String&gt;="org.osgi.service.useradmin.UserAdmin"
						</Provide-Capability>
					</instructions>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>
