<!--
 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">
 <parent>
    <groupId>org.apache.felix</groupId>
    <artifactId>felix-parent</artifactId>
    <version>2.1</version>
    <relativePath>../pom/pom.xml</relativePath>
  </parent>
  <modelVersion>4.0.0</modelVersion>
  <packaging>bundle</packaging>
  <name>Apache Felix Main</name>
  <artifactId>org.apache.felix.main</artifactId>
  <version>4.1.0-SNAPSHOT</version>
    <scm>
      <connection>scm:svn:http://svn.apache.org/repos/asf/felix/trunk/main</connection>
      <developerConnection>scm:svn:https://svn.apache.org/repos/asf/felix/trunk/main</developerConnection>
      <url>http://svn.apache.org/repos/asf/felix/main</url>
    </scm>
  <dependencies>
    <dependency>
      <groupId>${pom.groupId}</groupId>
      <artifactId>org.apache.felix.framework</artifactId>
      <version>${framework.version}</version>
    </dependency>
  </dependencies>
  <properties>
    <log.level>4</log.level>
    <dollar>$</dollar>
    <framework.version>4.1.0-SNAPSHOT</framework.version>
    <gogo.runtime.version>0.10.0</gogo.runtime.version>
    <gogo.shell.version>0.10.0</gogo.shell.version>
    <gogo.command.version>0.12.0</gogo.command.version>
    <obr.version>1.6.6</obr.version>
  </properties>
  <profiles>
    <profile>
      <id>release</id>
      <properties>
        <log.level>1</log.level>
        <dollar>$</dollar>
      </properties>
    </profile>
  </profiles>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.felix</groupId>
        <artifactId>maven-bundle-plugin</artifactId>
        <version>2.3.5</version>
        <extensions>true</extensions>
        <configuration>
          <instructions>
            <_donotcopy>(CVS|.svn|config.properties)</_donotcopy>
            <Main-Class>org.apache.felix.main.Main</Main-Class>
            <Bundle-SymbolicName>org.apache.felix.main</Bundle-SymbolicName>
            <Bundle-Name>Apache Felix</Bundle-Name>
            <Bundle-Description>OSGi R4 framework.</Bundle-Description>
            <Bundle-Vendor>The Apache Software Foundation</Bundle-Vendor>
            <Embed-Dependency>*;artifactId=org.apache.felix.framework;inline=true</Embed-Dependency>
            <Private-Package>org.apache.felix.main.*</Private-Package>
            <Export-Package>!org.osgi.service.log, !org.osgi.service.obr, org.osgi.*</Export-Package>
            <Import-Package>!*</Import-Package>
          </instructions>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <executions>
          <execution>
            <id>copy</id>
            <phase>package</phase>
            <goals>
              <goal>copy</goal>
            </goals>
            <configuration>
                <artifactItems>
                  <artifactItem>
                     <groupId>${pom.groupId}</groupId>
                     <artifactId>org.apache.felix.gogo.runtime</artifactId>
                     <version>${gogo.runtime.version}</version>
                     <type>jar</type>
                     <overWrite>true</overWrite>
                     <outputDirectory>${project.basedir}/bundle</outputDirectory>
                   </artifactItem>
                   <artifactItem>
                     <groupId>${pom.groupId}</groupId>
                     <artifactId>org.apache.felix.gogo.shell</artifactId>
                     <version>${gogo.shell.version}</version>
                     <type>jar</type>
                     <overWrite>true</overWrite>
                     <outputDirectory>${project.basedir}/bundle</outputDirectory>
                   </artifactItem>
                   <artifactItem>
                     <groupId>${pom.groupId}</groupId>
                     <artifactId>org.apache.felix.gogo.command</artifactId>
                     <version>${gogo.command.version}</version>
                     <type>jar</type>
                     <overWrite>true</overWrite>
                     <outputDirectory>${project.basedir}/bundle</outputDirectory>
                   </artifactItem>
                   <artifactItem>
                     <groupId>${pom.groupId}</groupId>
                     <artifactId>org.apache.felix.bundlerepository</artifactId>
                     <version>${obr.version}</version>
                     <type>jar</type>
                     <overWrite>true</overWrite>
                     <outputDirectory>${project.basedir}/bundle</outputDirectory>
                   </artifactItem>
                 </artifactItems>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <artifactId>maven-antrun-plugin</artifactId>
        <executions>
          <execution>
            <phase>package</phase>
            <configuration>
              <tasks>
                <delete dir="${basedir}/bin" />
                <mkdir dir="${basedir}/bin" />
                <delete dir="${basedir}/conf" />
                <mkdir dir="${basedir}/conf" />
                <copy file="${basedir}/target/org.apache.felix.main-${pom.version}.jar" tofile="${basedir}/bin/felix.jar" />
                <copy file="${basedir}/target/classes/config.properties" todir="${basedir}/conf" />
              </tasks>
            </configuration>
            <goals>
              <goal>run</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
    <resources>
      <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
      </resource>
    </resources> 
  </build>
</project>
