<!--
  ~ 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.
  -->

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">

    <id>distribution</id>

    <formats>
        <format>zip</format>
        <format>tar.gz</format>
    </formats>

    <dependencySets>
        <!-- unpack Felix distribution -->
        <dependencySet>
            <includes>
                <include>*:org.apache.felix.main.distribution:*</include>
            </includes>
            <unpack>true</unpack>
            <outputDirectory>.</outputDirectory>
            <unpackOptions>
                <excludes>
                    <exclude>**/doc/**</exclude>
                </excludes>
            </unpackOptions>
        </dependencySet>

        <dependencySet>
            <includes>
                <include>*:org.apache.felix.*:jar</include>
                <include>javax.servlet:com.springsource.javax.servlet:*</include>
                <include>org.osgi:org.osgi.compendium:*</include>
                <include>org.json:org.ow2.chameleon.commons.json:*</include>
                <include>commons-io:commons-io:*</include>
                <include>commons-fileupload:*:*</include>
            </includes>
            <unpack>false</unpack>
            <outputDirectory>./felix-framework-${felix.version}/bundle</outputDirectory>
        </dependencySet>
    </dependencySets>

</assembly>