[plugin] provide a simple way for starters to contribute BND instructions
diff --git a/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/maven/GenerateMojo.java b/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/maven/GenerateMojo.java
index f15dad3..d7fcdcb 100644
--- a/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/maven/GenerateMojo.java
+++ b/karaf-boot-tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/maven/GenerateMojo.java
@@ -14,6 +14,12 @@
 import org.codehaus.plexus.util.xml.Xpp3DomBuilder;
 
 import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.StringReader;
+import java.nio.file.Files;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
 
 @Mojo(name = "generate", threadSafe = true, defaultPhase = LifecyclePhase.PROCESS_CLASSES, requiresDependencyResolution = ResolutionScope.COMPILE_PLUS_RUNTIME, inheritByDefault = false)
 public class GenerateMojo extends AbstractMojo {
@@ -58,9 +64,59 @@
             felixBundlePlugin.setVersion("3.0.0");
             felixBundlePlugin.setInherited(true);
             felixBundlePlugin.setExtensions(true);
-            // TODO check if a osgi.bnd file is present in the project base directory
-            // TODO if jpa-start is provided as persistence.xml location
-            configuration = Xpp3DomBuilder.build(new ByteArrayInputStream(("<configuration>" +
+
+
+            //
+            // Bundle plugin
+            //
+
+            Map<String, String> instructions = new LinkedHashMap<>();
+            instructions.put("Private-Package", "org.apache.karaf.util.tracker");
+            instructions.put("_dsannotations", "*");
+
+            //
+            // Starters supplied instructions
+            //
+            File bndInst = new File(mavenProject.getBasedir(), "target/classes/META-INF/org.apache.karaf.boot.bnd");
+            if (bndInst.isFile()) {
+                List<String> lines =  Files.readAllLines(bndInst.toPath());
+                for (String line : lines) {
+                    if (!line.contains(":")) {
+                        continue;
+                    }
+                    String name = line.substring(0, line.indexOf(':')).trim();
+                    String value = line.substring(line.indexOf(':') + 1).trim();
+                    if (instructions.containsKey(name)) {
+                        instructions.put(name, instructions.get(name) + "," + value);
+                    } else {
+                        instructions.put(name, value);
+                    }
+                }
+                bndInst.delete();
+            }
+
+            //
+            // User supplied instructions
+            //
+            bndInst = new File(mavenProject.getBasedir(), "osgi.bnd");
+            if (bndInst.isFile()) {
+                List<String> lines =  Files.readAllLines(bndInst.toPath());
+                for (String line : lines) {
+                    if (!line.contains(":")) {
+                        continue;
+                    }
+                    String name = line.substring(0, line.indexOf(':')).trim();
+                    String value = line.substring(line.indexOf(':') + 1).trim();
+                    if (instructions.containsKey(name)) {
+                        instructions.put(name, instructions.get(name) + "," + value);
+                    } else {
+                        instructions.put(name, value);
+                    }
+                }
+            }
+
+            StringBuilder config = new StringBuilder();
+            config.append("<configuration>" +
                     "<finalName>${project.build.finalName}</finalName>" +
                     "<outputDirectory>${project.build.outputDirectory}</outputDirectory>" +
                     "<m_mavenSession>${session}</m_mavenSession>" +
@@ -71,11 +127,15 @@
                     "<supportedProjectType>bundle</supportedProjectType>" +
                     "<supportedProjectType>war</supportedProjectType>" +
                     "</supportedProjectTypes>" +
-                    "<instructions>" +
-                    "<Private-Package>org.apache.karaf.util.tracker</Private-Package>" +
-                    "<_dsannotations>*</_dsannotations>" +
-                    "</instructions>" +
-                    "</configuration>").getBytes()), "UTF-8");
+                    "<instructions>");
+            for (Map.Entry<String, String> entry : instructions.entrySet()) {
+                config.append("<").append(entry.getKey()).append(">")
+                        .append(entry.getValue())
+                        .append("</").append(entry.getKey()).append(">");
+            }
+            config.append("</instructions>" +
+                    "</configuration>");
+            configuration = Xpp3DomBuilder.build(new StringReader(config.toString()));
             PluginDescriptor felixBundlePluginDescriptor = pluginManager.loadPlugin(felixBundlePlugin, mavenProject.getRemotePluginRepositories(), mavenSession.getRepositorySession());
             MojoDescriptor felixBundleMojoDescriptor = felixBundlePluginDescriptor.getMojo("bundle");
             execution = new MojoExecution(felixBundleMojoDescriptor, configuration);