Preparing assembly of Karaf and ONOS artifacts for off-line deployments.

Change-Id: I113490bc6735f5372e33bb671ad5adec640b2e36
diff --git a/pom.xml b/pom.xml
index 0cde33f..738fb4d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,7 +39,6 @@
     <description>Open Network Operating System root project</description>
 
     <modules>
-        <module>tools/package/maven-plugin</module>
         <module>utils</module>
         <module>core</module>
         <module>web</module>
@@ -55,6 +54,8 @@
 
         <module>tools/package/archetypes</module>
         <module>tools/package/branding</module>
+        <module>tools/package/karaf-assembly</module>
+        <module>tools/package/maven-plugin</module>
         <module>tools/build/conf</module>
     </modules>
 
diff --git a/tools/build/onos-package b/tools/build/onos-package
index 5566e60..5500208 100755
--- a/tools/build/onos-package
+++ b/tools/build/onos-package
@@ -50,16 +50,21 @@
         $ONOS_ROOT/tools/package/bin/onos-client > bin/onos
     chmod a+x bin/onos-service bin/onos
 
-    # Stage the ONOS bundles, but only those that match the version
-    mkdir -p $ONOS_STAGE/$KARAF_DIST/system/org/onosproject
-    find $M2_REPO/org/onosproject -type f -path "*/$ONOS_POM_VERSION/*" \
-        \( -name '*.jar' -o -name '*.pom' -o -name '*-features.xml' \) \
-            | grep -v -Ee '-tests.jar|-[0-9]{8}.[0-9]{6}-' \
-            | while read src; do
-        dst=$ONOS_STAGE/$KARAF_DIST/system/${src#$M2_REPO/*}
-        mkdir -p $(dirname $dst)
-        cp $src $dst
-    done
+    if [ -d $ONOS_ROOT/tools/package/karaf-assembly/target/repo ]; then
+        cp -r $ONOS_ROOT/tools/package/karaf-assembly/target/repo/* $ONOS_STAGE/$KARAF_DIST/system
+    else
+        # TODO: Deprecated so remove when confident staging works.
+        # Stage the ONOS bundles, but only those that match the version
+        mkdir -p $ONOS_STAGE/$KARAF_DIST/system/org/onosproject
+        find $M2_REPO/org/onosproject -type f -path "*/$ONOS_POM_VERSION/*" \
+            \( -name '*.jar' -o -name '*.pom' -o -name '*-features.xml' \) \
+                | grep -v -Ee '-tests.jar|-[0-9]{8}.[0-9]{6}-' \
+                | while read src; do
+            dst=$ONOS_STAGE/$KARAF_DIST/system/${src#$M2_REPO/*}
+            mkdir -p $(dirname $dst)
+            cp $src $dst
+        done
+    fi
 
     # ONOS Patching ----------------------------------------------------------------
 
diff --git a/tools/package/karaf-assembly/onos-assembly b/tools/package/karaf-assembly/onos-assembly
new file mode 100755
index 0000000..ece4409
--- /dev/null
+++ b/tools/package/karaf-assembly/onos-assembly
@@ -0,0 +1,35 @@
+#!/bin/bash
+# -----------------------------------------------------------------------------
+# Assembles together all bundles required to run ONOS off-line.
+# -----------------------------------------------------------------------------
+
+mkdir -p target
+
+features=target/features-list.xml
+repos=target/staged-repos.xml
+
+echo "<features>" > $repos
+echo "    <repository>mvn:org.onosproject/onos-features/1.4.0-SNAPSHOT/xml/features</repository>" >> $repos
+
+# Find all app feature files
+find $ONOS_ROOT -name '*-features.xml' | grep -v features-repo > $features
+
+# Produce repository entry for each file
+cat $features | while read feature; do
+    echo "    <repository>file:$feature</repository>" >> $repos
+done
+
+# Create a synthetic feature that depends on all other ONOS features
+echo "   <feature name=\"foo\">" >> $repos
+grep "feature name=" $ONOS_ROOT/features/features.xml | cut -d\" -f2 | while read f; do
+    echo "        <feature>$f</feature>" >> $repos
+done
+
+cat $features | while read feature; do
+    grep "feature name=" $feature | cut -d\" -f2 | while read f; do
+        echo "        <feature>$f</feature>" >> $repos
+    done
+done
+echo "   </feature>" >> $repos
+
+echo "</features>" >> $repos
\ No newline at end of file
diff --git a/tools/package/karaf-assembly/pom.xml b/tools/package/karaf-assembly/pom.xml
new file mode 100644
index 0000000..5dcf539
--- /dev/null
+++ b/tools/package/karaf-assembly/pom.xml
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  ~ Copyright 2014-2015 Open Networking Laboratory
+  ~
+  ~ 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.
+  -->
+<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.onosproject</groupId>
+        <artifactId>onos</artifactId>
+        <version>1.4.0-SNAPSHOT</version>
+        <relativePath>../../../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>onos-assembly</artifactId>
+    <packaging>pom</packaging>
+
+    <description>ONOS Apache Karaf assembly definitions</description>
+
+    <build>
+        <plugins>
+            <plugin>
+                <artifactId>maven-antrun-plugin</artifactId>
+                <version>1.8</version>
+                <executions>
+                    <execution>
+                        <phase>generate-sources</phase>
+                        <configuration>
+                            <target>
+                                <exec executable="bash">
+                                    <arg value="${basedir}/onos-assembly"/>
+                                </exec>
+                            </target>
+                        </configuration>
+                        <goals>
+                            <goal>run</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.karaf.tooling</groupId>
+                <artifactId>karaf-maven-plugin</artifactId>
+                <version>3.0.3</version>
+
+                <executions>
+                    <execution>
+                        <id>features-add-to-repo</id>
+                        <phase>generate-resources</phase>
+                        <goals>
+                            <goal>features-add-to-repository</goal>
+                        </goals>
+                        <configuration>
+                            <descriptors>
+                                <descriptor>file:${basedir}/target/staged-repos.xml</descriptor>
+                            </descriptors>
+                            <features>
+                                <feature>foo</feature>
+                            </features>
+                            <repository>target/repo</repository>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>