You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by cs...@apache.org on 2016/05/25 15:25:39 UTC

karaf-boot git commit: Convert other starters to new plugin system

Repository: karaf-boot
Updated Branches:
  refs/heads/boot-plugin ec9ee4f81 -> 56d97e249


Convert other starters to new plugin system


Project: http://git-wip-us.apache.org/repos/asf/karaf-boot/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf-boot/commit/56d97e24
Tree: http://git-wip-us.apache.org/repos/asf/karaf-boot/tree/56d97e24
Diff: http://git-wip-us.apache.org/repos/asf/karaf-boot/diff/56d97e24

Branch: refs/heads/boot-plugin
Commit: 56d97e24961a4b5e0c5dcb919ef6cb71942f1d69
Parents: ec9ee4f
Author: Christian Schneider <ch...@die-schneider.net>
Authored: Wed May 25 17:25:26 2016 +0200
Committer: Christian Schneider <ch...@die-schneider.net>
Committed: Wed May 25 17:25:26 2016 +0200

----------------------------------------------------------------------
 starters/karaf-boot-starter-blueprint/pom.xml   |  46 ++----
 .../boot/blueprint/impl/BlueprintProcessor.java |  88 +++--------
 .../javax.annotation.processing.Processor       |   1 -
 starters/karaf-boot-starter-cdi/pom.xml         |  48 +++---
 .../karaf/boot/cdi/impl/CdiProcessor.java       |  94 +++--------
 .../javax.annotation.processing.Processor       |   1 -
 starters/karaf-boot-starter-karaf/pom.xml       |  57 -------
 .../karaf/boot/karaf/impl/KarafProcessor.java   | 154 -------------------
 .../javax.annotation.processing.Processor       |   1 -
 starters/karaf-boot-starter-shell/pom.xml       |  48 +++---
 .../karaf/boot/shell/impl/ShellProcessor.java   |  93 +++--------
 .../javax.annotation.processing.Processor       |   1 -
 starters/karaf-boot-starter-web/pom.xml         |   5 +
 .../karaf/boot/plugin/api/StreamFactory.java    |   3 +-
 starters/pom.xml                                |   2 +-
 .../apache/karaf/boot/maven/GenerateMojo.java   |  10 +-
 16 files changed, 139 insertions(+), 513 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/56d97e24/starters/karaf-boot-starter-blueprint/pom.xml
----------------------------------------------------------------------
diff --git a/starters/karaf-boot-starter-blueprint/pom.xml b/starters/karaf-boot-starter-blueprint/pom.xml
index e958058..06f0948 100644
--- a/starters/karaf-boot-starter-blueprint/pom.xml
+++ b/starters/karaf-boot-starter-blueprint/pom.xml
@@ -1,23 +1,17 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<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">
+<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">
 
-    <!--
-
-        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.
-    -->
+    <!-- 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. -->
 
     <modelVersion>4.0.0</modelVersion>
 
@@ -61,17 +55,11 @@
             <artifactId>geronimo-atinject_1.0_spec</artifactId>
             <version>1.0</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.boot</groupId>
+            <artifactId>karaf-boot-plugin-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
     </dependencies>
 
-    <build>
-        <plugins>
-            <plugin>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <configuration>
-                    <compilerArgument>-proc:none</compilerArgument>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
 </project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/56d97e24/starters/karaf-boot-starter-blueprint/src/main/java/org/apache/karaf/boot/blueprint/impl/BlueprintProcessor.java
----------------------------------------------------------------------
diff --git a/starters/karaf-boot-starter-blueprint/src/main/java/org/apache/karaf/boot/blueprint/impl/BlueprintProcessor.java b/starters/karaf-boot-starter-blueprint/src/main/java/org/apache/karaf/boot/blueprint/impl/BlueprintProcessor.java
index aebcfca..9a8829e 100644
--- a/starters/karaf-boot-starter-blueprint/src/main/java/org/apache/karaf/boot/blueprint/impl/BlueprintProcessor.java
+++ b/starters/karaf-boot-starter-blueprint/src/main/java/org/apache/karaf/boot/blueprint/impl/BlueprintProcessor.java
@@ -1,77 +1,37 @@
 package org.apache.karaf.boot.blueprint.impl;
 
-import javax.annotation.processing.AbstractProcessor;
-import javax.annotation.processing.RoundEnvironment;
-import javax.lang.model.element.TypeElement;
-import javax.tools.Diagnostic.Kind;
-import javax.tools.FileObject;
-import javax.tools.StandardLocation;
-
-import org.apache.aries.blueprint.annotation.Bean;
-
-import java.io.ByteArrayOutputStream;
-import java.io.CharArrayWriter;
+import java.io.File;
 import java.io.IOException;
-import java.io.InputStream;
-import java.io.PrintWriter;
-import java.io.Reader;
-import java.io.Writer;
-import java.util.HashSet;
-import java.util.Set;
+import java.io.OutputStream;
+import java.lang.annotation.Annotation;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
-public class BlueprintProcessor extends AbstractProcessor {
-
-    boolean hasRun;
-
-    public BlueprintProcessor() {
-    }
+import org.apache.aries.blueprint.annotation.Bean;
+import org.apache.karaf.boot.plugin.api.BootPlugin;
+import org.apache.karaf.boot.plugin.api.StreamFactory;
 
+public class BlueprintProcessor implements BootPlugin {
+    
     @Override
-    public Set<String> getSupportedAnnotationTypes() {
-        Set<String> set = new HashSet<String>();
-        set.add(Bean.class.getName());
-        return set;
+    public Class<? extends Annotation> getAnnotation() {
+        return Bean.class;
     }
 
     @Override
-    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
-        if (!hasRun) {
-            hasRun = true;
-            // Add the blueprint requirement
-            try (PrintWriter w = appendResource("META-INF/org.apache.karaf.boot.bnd")) {
-                w.println("Bundle-Blueprint-Annotation: true");
-            } catch (Exception e) {
-                processingEnv.getMessager().printMessage(Kind.ERROR, "Error: " + e.getMessage());
-            }
-        }
-        return true;
-    }
-
-    private PrintWriter appendResource(String resource) throws IOException {
+    public Map<String, List<String>> enhance(List<Class<?>> annotated, File generatedDir,
+                                             StreamFactory streamFactory) {
+        OutputStream beansOS = streamFactory.create(new File (generatedDir, "META-INF/beans.xml"));
         try {
-            FileObject o = processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "", resource);
-            return new PrintWriter(o.openWriter());
-        } catch (Exception e) {
-            try {
-                FileObject o = processingEnv.getFiler().getResource(StandardLocation.CLASS_OUTPUT, "", resource);
-                CharArrayWriter baos = new CharArrayWriter();
-                try (Reader r = o.openReader(true)) {
-                    char[] buf = new char[4096];
-                    int l;
-                    while ((l = r.read(buf)) > 0) {
-                        baos.write(buf, 0, l);
-                    }
-                }
-                o.delete();
-                o = processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "", resource);
-                Writer w = o.openWriter();
-                w.write(baos.toCharArray());
-                return new PrintWriter(w);
-            } catch (Exception e2) {
-                e2.addSuppressed(e);
-                e2.printStackTrace();
-                throw e2;
-            }
+            beansOS.close();
+        } catch (IOException e) {
+            throw new RuntimeException("Error closing stream", e);
         }
+        Map<String, List<String>> headers = new HashMap<>();
+        headers.put("Bundle-Blueprint-Annotation", Arrays.asList("true"));
+        return headers;
     }
+
 }

http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/56d97e24/starters/karaf-boot-starter-blueprint/src/main/resources/META-INF/services/javax.annotation.processing.Processor
----------------------------------------------------------------------
diff --git a/starters/karaf-boot-starter-blueprint/src/main/resources/META-INF/services/javax.annotation.processing.Processor b/starters/karaf-boot-starter-blueprint/src/main/resources/META-INF/services/javax.annotation.processing.Processor
deleted file mode 100644
index fab44d1..0000000
--- a/starters/karaf-boot-starter-blueprint/src/main/resources/META-INF/services/javax.annotation.processing.Processor
+++ /dev/null
@@ -1 +0,0 @@
-org.apache.karaf.boot.blueprint.impl.BlueprintProcessor

http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/56d97e24/starters/karaf-boot-starter-cdi/pom.xml
----------------------------------------------------------------------
diff --git a/starters/karaf-boot-starter-cdi/pom.xml b/starters/karaf-boot-starter-cdi/pom.xml
index 3f33d28..3d46fe7 100644
--- a/starters/karaf-boot-starter-cdi/pom.xml
+++ b/starters/karaf-boot-starter-cdi/pom.xml
@@ -1,23 +1,17 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<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">
-
-    <!--
-
-        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">
+
+    <!-- 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. -->
 
     <modelVersion>4.0.0</modelVersion>
 
@@ -51,17 +45,11 @@
             <artifactId>geronimo-atinject_1.0_spec</artifactId>
             <version>1.0</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.boot</groupId>
+            <artifactId>karaf-boot-plugin-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
     </dependencies>
 
-    <build>
-        <plugins>
-            <plugin>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <configuration>
-                    <compilerArgument>-proc:none</compilerArgument>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
 </project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/56d97e24/starters/karaf-boot-starter-cdi/src/main/java/org/apache/karaf/boot/cdi/impl/CdiProcessor.java
----------------------------------------------------------------------
diff --git a/starters/karaf-boot-starter-cdi/src/main/java/org/apache/karaf/boot/cdi/impl/CdiProcessor.java b/starters/karaf-boot-starter-cdi/src/main/java/org/apache/karaf/boot/cdi/impl/CdiProcessor.java
index 44cc571..8c6d0ed 100644
--- a/starters/karaf-boot-starter-cdi/src/main/java/org/apache/karaf/boot/cdi/impl/CdiProcessor.java
+++ b/starters/karaf-boot-starter-cdi/src/main/java/org/apache/karaf/boot/cdi/impl/CdiProcessor.java
@@ -1,82 +1,38 @@
 package org.apache.karaf.boot.cdi.impl;
 
-import javax.annotation.processing.AbstractProcessor;
-import javax.annotation.processing.RoundEnvironment;
-import javax.lang.model.element.TypeElement;
-import javax.tools.Diagnostic.Kind;
-import javax.tools.FileObject;
-import javax.tools.StandardLocation;
-import java.io.ByteArrayOutputStream;
-import java.io.CharArrayWriter;
+import java.io.File;
 import java.io.IOException;
-import java.io.InputStream;
-import java.io.PrintWriter;
-import java.io.Reader;
-import java.io.Writer;
-import java.util.HashSet;
-import java.util.Set;
-
+import java.io.OutputStream;
+import java.lang.annotation.Annotation;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.karaf.boot.plugin.api.BootPlugin;
+import org.apache.karaf.boot.plugin.api.StreamFactory;
 import org.ops4j.pax.cdi.api.OsgiServiceProvider;
 
-public class CdiProcessor extends AbstractProcessor {
-
-    boolean hasRun;
-
-    public CdiProcessor() {
-    }
-
+public class CdiProcessor implements BootPlugin {
+    
     @Override
-    public Set<String> getSupportedAnnotationTypes() {
-        Set<String> set = new HashSet<String>();
-        set.add(OsgiServiceProvider.class.getName());
-        return set;
+    public Class<? extends Annotation> getAnnotation() {
+        return OsgiServiceProvider.class;
     }
 
     @Override
-    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
-        if (!hasRun) {
-            hasRun = true;
-            // Make sure we have a META-INF/beans.xml file present
-            try (PrintWriter w = appendResource("META-INF/beans.xml")) {
-                processingEnv.getMessager().printMessage(Kind.NOTE, "Generated META-INF/beans.xml");
-            } catch (Exception e) {
-                processingEnv.getMessager().printMessage(Kind.ERROR, "Error: " + e.getMessage());
-            }
-            // Add the CDI requirement
-            try (PrintWriter w = appendResource("META-INF/org.apache.karaf.boot.bnd")) {
-                w.println("Require-Capability: osgi.extender; filter:=\"(osgi.extender=pax.cdi)\"");
-            } catch (Exception e) {
-                processingEnv.getMessager().printMessage(Kind.ERROR, "Error: " + e.getMessage());
-            }
-        }
-        return true;
-    }
-
-    private PrintWriter appendResource(String resource) throws IOException {
+    public Map<String, List<String>> enhance(List<Class<?>> annotated, File generatedDir,
+                                             StreamFactory streamFactory) {
+        OutputStream beansOS = streamFactory.create(new File (generatedDir, "META-INF/beans.xml"));
         try {
-            FileObject o = processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "", resource);
-            return new PrintWriter(o.openWriter());
-        } catch (Exception e) {
-            try {
-                FileObject o = processingEnv.getFiler().getResource(StandardLocation.CLASS_OUTPUT, "", resource);
-                CharArrayWriter baos = new CharArrayWriter();
-                try (Reader r = o.openReader(true)) {
-                    char[] buf = new char[4096];
-                    int l;
-                    while ((l = r.read(buf)) > 0) {
-                        baos.write(buf, 0, l);
-                    }
-                }
-                o.delete();
-                o = processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "", resource);
-                Writer w = o.openWriter();
-                w.write(baos.toCharArray());
-                return new PrintWriter(w);
-            } catch (Exception e2) {
-                e2.addSuppressed(e);
-                e2.printStackTrace();
-                throw e2;
-            }
+            beansOS.close();
+        } catch (IOException e) {
+            throw new RuntimeException("Error closing stream", e);
         }
+        Map<String, List<String>> headers = new HashMap<>();
+        headers.put("Require-Capability", Arrays.asList("osgi.extender; filter:=\"(osgi.extender=pax.cdi)\""));
+        return headers;
     }
+
+
 }

http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/56d97e24/starters/karaf-boot-starter-cdi/src/main/resources/META-INF/services/javax.annotation.processing.Processor
----------------------------------------------------------------------
diff --git a/starters/karaf-boot-starter-cdi/src/main/resources/META-INF/services/javax.annotation.processing.Processor b/starters/karaf-boot-starter-cdi/src/main/resources/META-INF/services/javax.annotation.processing.Processor
deleted file mode 100644
index a6cd494..0000000
--- a/starters/karaf-boot-starter-cdi/src/main/resources/META-INF/services/javax.annotation.processing.Processor
+++ /dev/null
@@ -1 +0,0 @@
-org.apache.karaf.boot.cdi.impl.CdiProcessor

http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/56d97e24/starters/karaf-boot-starter-karaf/pom.xml
----------------------------------------------------------------------
diff --git a/starters/karaf-boot-starter-karaf/pom.xml b/starters/karaf-boot-starter-karaf/pom.xml
deleted file mode 100644
index 32bec48..0000000
--- a/starters/karaf-boot-starter-karaf/pom.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<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">
-
-    <!--
-
-        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.
-    -->
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.apache.karaf.boot</groupId>
-        <artifactId>karaf-boot-starters</artifactId>
-        <version>1.0.0-SNAPSHOT</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <artifactId>karaf-boot-starter-karaf</artifactId>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>org.osgi.core</artifactId>
-            <version>${osgi.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.karaf</groupId>
-            <artifactId>org.apache.karaf.util</artifactId>
-            <version>${karaf.version}</version>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <configuration>
-                    <compilerArgument>-proc:none</compilerArgument>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/56d97e24/starters/karaf-boot-starter-karaf/src/main/java/org/apache/karaf/boot/karaf/impl/KarafProcessor.java
----------------------------------------------------------------------
diff --git a/starters/karaf-boot-starter-karaf/src/main/java/org/apache/karaf/boot/karaf/impl/KarafProcessor.java b/starters/karaf-boot-starter-karaf/src/main/java/org/apache/karaf/boot/karaf/impl/KarafProcessor.java
deleted file mode 100644
index e51380e..0000000
--- a/starters/karaf-boot-starter-karaf/src/main/java/org/apache/karaf/boot/karaf/impl/KarafProcessor.java
+++ /dev/null
@@ -1,154 +0,0 @@
-package org.apache.karaf.boot.karaf.impl;
-
-import javax.annotation.processing.AbstractProcessor;
-import javax.annotation.processing.RoundEnvironment;
-import javax.lang.model.element.AnnotationMirror;
-import javax.lang.model.element.AnnotationValue;
-import javax.lang.model.element.Element;
-import javax.lang.model.element.ExecutableElement;
-import javax.lang.model.element.TypeElement;
-import javax.tools.Diagnostic.Kind;
-import javax.tools.FileObject;
-import javax.tools.StandardLocation;
-import java.io.CharArrayWriter;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.io.Reader;
-import java.io.Writer;
-import java.lang.annotation.Annotation;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-
-import org.apache.karaf.util.tracker.annotation.Managed;
-import org.apache.karaf.util.tracker.annotation.ProvideService;
-import org.apache.karaf.util.tracker.annotation.RequireService;
-import org.apache.karaf.util.tracker.annotation.Services;
-
-public class KarafProcessor extends AbstractProcessor {
-
-    boolean hasRun;
-
-    public KarafProcessor() {
-    }
-
-    @Override
-    public Set<String> getSupportedAnnotationTypes() {
-        Set<String> set = new HashSet<String>();
-        set.add(Services.class.getName());
-        set.add(Managed.class.getName());
-        return set;
-    }
-
-    @Override
-    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
-        List<String> instructions = new ArrayList<>();
-        Properties props = new Properties();
-
-        for (Element elem : roundEnv.getElementsAnnotatedWith(Services.class)) {
-            for (AnnotationMirror mirror : elem.getAnnotationMirrors()) {
-                if (Services.class.getName().equals(((TypeElement) mirror.getAnnotationType().asElement()).getQualifiedName().toString())) {
-                    Map<String, Object> values = getAnnotationValues(mirror);
-                    if (values.containsKey("provides")) {
-                        for (AnnotationMirror p : (List<AnnotationMirror>) values.get("provides")) {
-                            Map<String, Object> pv = getAnnotationValues(p);
-                            String n = pv.get("value").toString();
-                            instructions.add("Provide-Capability: osgi.service;effective:=active;objectClass=" + n);
-                        }
-                    }
-                    if (values.containsKey("requires")) {
-                        for (AnnotationMirror r : (List<AnnotationMirror>) values.get("requires")) {
-                            Map<String, Object> rv = getAnnotationValues(r);
-                            String value = rv.get("value").toString();
-                            String filter = (String) rv.getOrDefault("filter", "");
-                            boolean opt = ((Boolean) rv.getOrDefault("optional", false));
-
-                            String fltWithClass = combine(filter, "(objectClass=" + value + ")");
-                            instructions.add("Require-Capability: osgi.service;effective:=active;filter:=\"" + fltWithClass + "\"");
-                            props.setProperty(value, filter);
-                        }
-                    }
-                }
-            }
-            instructions.add("Bundle-Activator: " + ((TypeElement) elem).getQualifiedName().toString());
-
-            Managed managed = elem.getAnnotation(Managed.class);
-            if (managed != null) {
-                props.setProperty("pid", managed.value());
-            }
-
-            String name = "OSGI-INF/karaf-tracker/" + ((TypeElement) elem).getQualifiedName().toString();
-            try (OutputStream os = processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "", name).openOutputStream()) {
-                props.store(os, null);
-            } catch (IOException e) {
-                processingEnv.getMessager().printMessage(Kind.ERROR, "Error writing to " + name + ": " + e.getMessage());
-            }
-        }
-
-        instructions.add("Private-Package: org.apache.karaf.util.tracker");
-        instructions.add("PREPEND-Import-Package: !org.apache.karaf.util.tracker.annotation");
-
-        if (!hasRun) {
-            hasRun = true;
-            // Add the Karaf embedded package
-            try (PrintWriter w = appendResource("META-INF/org.apache.karaf.boot.bnd")) {
-                for (String instr : instructions) {
-                    w.println(instr);
-                }
-            } catch (Exception e) {
-                processingEnv.getMessager().printMessage(Kind.ERROR, "Error writing to META-INF/org.apache.karaf.boot.bnd: " + e.getMessage());
-            }
-        }
-
-        return true;
-    }
-
-    private Map<String, Object> getAnnotationValues(AnnotationMirror mirror) {
-        Map<String, Object> map = new HashMap<>();
-        for (Map.Entry<? extends ExecutableElement, ? extends AnnotationValue> entry : mirror.getElementValues().entrySet()) {
-            map.put(entry.getKey().getSimpleName().toString(), entry.getValue().getValue());
-        }
-        return map;
-    }
-
-    private String combine(String filter1, String filter2) {
-        if (filter1!=null && !filter1.isEmpty()) {
-            return "(&" + filter2 + filter1 + ")";
-        } else {
-            return filter2;
-        }
-    }
-
-    private PrintWriter appendResource(String resource) throws IOException {
-        try {
-            FileObject o = processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "", resource);
-            return new PrintWriter(o.openWriter());
-        } catch (Exception e) {
-            try {
-                FileObject o = processingEnv.getFiler().getResource(StandardLocation.CLASS_OUTPUT, "", resource);
-                CharArrayWriter baos = new CharArrayWriter();
-                try (Reader r = o.openReader(true)) {
-                    char[] buf = new char[4096];
-                    int l;
-                    while ((l = r.read(buf)) > 0) {
-                        baos.write(buf, 0, l);
-                    }
-                }
-                o.delete();
-                o = processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "", resource);
-                Writer w = o.openWriter();
-                w.write(baos.toCharArray());
-                return new PrintWriter(w);
-            } catch (Exception e2) {
-                e2.addSuppressed(e);
-                e2.printStackTrace();
-                throw e2;
-            }
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/56d97e24/starters/karaf-boot-starter-karaf/src/main/resources/META-INF/services/javax.annotation.processing.Processor
----------------------------------------------------------------------
diff --git a/starters/karaf-boot-starter-karaf/src/main/resources/META-INF/services/javax.annotation.processing.Processor b/starters/karaf-boot-starter-karaf/src/main/resources/META-INF/services/javax.annotation.processing.Processor
deleted file mode 100644
index c45090b..0000000
--- a/starters/karaf-boot-starter-karaf/src/main/resources/META-INF/services/javax.annotation.processing.Processor
+++ /dev/null
@@ -1 +0,0 @@
-org.apache.karaf.boot.karaf.impl.KarafProcessor

http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/56d97e24/starters/karaf-boot-starter-shell/pom.xml
----------------------------------------------------------------------
diff --git a/starters/karaf-boot-starter-shell/pom.xml b/starters/karaf-boot-starter-shell/pom.xml
index 28523c7..e9734a3 100644
--- a/starters/karaf-boot-starter-shell/pom.xml
+++ b/starters/karaf-boot-starter-shell/pom.xml
@@ -1,23 +1,17 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<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">
-
-    <!--
-
-        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">
+
+    <!-- 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. -->
 
     <modelVersion>4.0.0</modelVersion>
 
@@ -36,17 +30,11 @@
             <artifactId>org.apache.karaf.shell.core</artifactId>
             <version>${karaf.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.boot</groupId>
+            <artifactId>karaf-boot-plugin-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
     </dependencies>
 
-    <build>
-        <plugins>
-            <plugin>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <configuration>
-                    <compilerArgument>-proc:none</compilerArgument>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
 </project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/56d97e24/starters/karaf-boot-starter-shell/src/main/java/org/apache/karaf/boot/shell/impl/ShellProcessor.java
----------------------------------------------------------------------
diff --git a/starters/karaf-boot-starter-shell/src/main/java/org/apache/karaf/boot/shell/impl/ShellProcessor.java b/starters/karaf-boot-starter-shell/src/main/java/org/apache/karaf/boot/shell/impl/ShellProcessor.java
index 3de3bfb..cd8f859 100644
--- a/starters/karaf-boot-starter-shell/src/main/java/org/apache/karaf/boot/shell/impl/ShellProcessor.java
+++ b/starters/karaf-boot-starter-shell/src/main/java/org/apache/karaf/boot/shell/impl/ShellProcessor.java
@@ -1,84 +1,37 @@
 package org.apache.karaf.boot.shell.impl;
 
-import javax.annotation.processing.AbstractProcessor;
-import javax.annotation.processing.RoundEnvironment;
-import javax.lang.model.element.Element;
-import javax.lang.model.element.TypeElement;
-import javax.tools.Diagnostic.Kind;
-import javax.tools.FileObject;
-import javax.tools.StandardLocation;
-import java.io.CharArrayWriter;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.Reader;
-import java.io.Writer;
-import java.util.HashSet;
+import static java.util.stream.Collectors.toCollection;
+
+import java.io.File;
+import java.lang.annotation.Annotation;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
 
+import org.apache.karaf.boot.plugin.api.BootPlugin;
+import org.apache.karaf.boot.plugin.api.StreamFactory;
 import org.apache.karaf.shell.api.action.lifecycle.Service;
 
-public class ShellProcessor extends AbstractProcessor {
-
-    boolean hasRun;
-
-    public ShellProcessor() {
-    }
-
+public class ShellProcessor implements BootPlugin {
+    
     @Override
-    public Set<String> getSupportedAnnotationTypes() {
-        Set<String> set = new HashSet<String>();
-        set.add(Service.class.getName());
-        return set;
+    public Class<? extends Annotation> getAnnotation() {
+        return Service.class;
     }
 
     @Override
-    public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
-        Set<String> packages = new TreeSet<>();
-        for (Element elem : roundEnv.getElementsAnnotatedWith(Service.class)) {
-            packages.add(elem.getEnclosingElement().toString());
-        }
-
-        if (!packages.isEmpty()) {
-            if (!hasRun) {
-                hasRun = true;
-                // Add the Karaf embedded package
-                try (PrintWriter w = appendResource("META-INF/org.apache.karaf.boot.bnd")) {
-                    w.println("Karaf-Commands: " + String.join(",", packages));
-                } catch (Exception e) {
-                    processingEnv.getMessager().printMessage(Kind.ERROR, "Error writing to META-INF/org.apache.karaf.boot.bnd: " + e.getMessage());
-                }
-            }
-        }
-
-        return true;
+    public Map<String, List<String>> enhance(List<Class<?>> annotated, File generatedDir,
+                                             StreamFactory streamFactory) {
+        Set<String> packages = annotated.stream() //
+            .map(clazz -> clazz.getPackage().getName()) //
+            .collect(toCollection(TreeSet::new)); 
+            new TreeSet<>();
+        Map<String, List<String>> headers = new HashMap<>();
+        headers.put("Require-Capability", new ArrayList<>(packages));
+        return headers;
     }
 
-    private PrintWriter appendResource(String resource) throws IOException {
-        try {
-            FileObject o = processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "", resource);
-            return new PrintWriter(o.openWriter());
-        } catch (Exception e) {
-            try {
-                FileObject o = processingEnv.getFiler().getResource(StandardLocation.CLASS_OUTPUT, "", resource);
-                CharArrayWriter baos = new CharArrayWriter();
-                try (Reader r = o.openReader(true)) {
-                    char[] buf = new char[4096];
-                    int l;
-                    while ((l = r.read(buf)) > 0) {
-                        baos.write(buf, 0, l);
-                    }
-                }
-                o.delete();
-                o = processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "", resource);
-                Writer w = o.openWriter();
-                w.write(baos.toCharArray());
-                return new PrintWriter(w);
-            } catch (Exception e2) {
-                e2.addSuppressed(e);
-                e2.printStackTrace();
-                throw e2;
-            }
-        }
-    }
 }

http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/56d97e24/starters/karaf-boot-starter-shell/src/main/resources/META-INF/services/javax.annotation.processing.Processor
----------------------------------------------------------------------
diff --git a/starters/karaf-boot-starter-shell/src/main/resources/META-INF/services/javax.annotation.processing.Processor b/starters/karaf-boot-starter-shell/src/main/resources/META-INF/services/javax.annotation.processing.Processor
deleted file mode 100644
index 3ebe726..0000000
--- a/starters/karaf-boot-starter-shell/src/main/resources/META-INF/services/javax.annotation.processing.Processor
+++ /dev/null
@@ -1 +0,0 @@
-org.apache.karaf.boot.shell.impl.ShellProcessor

http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/56d97e24/starters/karaf-boot-starter-web/pom.xml
----------------------------------------------------------------------
diff --git a/starters/karaf-boot-starter-web/pom.xml b/starters/karaf-boot-starter-web/pom.xml
index 54bc3c5..a249383 100644
--- a/starters/karaf-boot-starter-web/pom.xml
+++ b/starters/karaf-boot-starter-web/pom.xml
@@ -36,6 +36,11 @@
             <artifactId>javax.servlet-api</artifactId>
             <version>3.1.0</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.karaf.boot</groupId>
+            <artifactId>karaf-boot-plugin-api</artifactId>
+            <version>${project.version}</version>
+        </dependency>
     </dependencies>
 
 </project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/56d97e24/starters/plugin-api/src/main/java/org/apache/karaf/boot/plugin/api/StreamFactory.java
----------------------------------------------------------------------
diff --git a/starters/plugin-api/src/main/java/org/apache/karaf/boot/plugin/api/StreamFactory.java b/starters/plugin-api/src/main/java/org/apache/karaf/boot/plugin/api/StreamFactory.java
index b272d78..769ef82 100644
--- a/starters/plugin-api/src/main/java/org/apache/karaf/boot/plugin/api/StreamFactory.java
+++ b/starters/plugin-api/src/main/java/org/apache/karaf/boot/plugin/api/StreamFactory.java
@@ -1,9 +1,8 @@
 package org.apache.karaf.boot.plugin.api;
 
 import java.io.File;
-import java.io.IOException;
 import java.io.OutputStream;
 
 public interface StreamFactory {
-    OutputStream create(File file) throws IOException;
+    OutputStream create(File file);
 }

http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/56d97e24/starters/pom.xml
----------------------------------------------------------------------
diff --git a/starters/pom.xml b/starters/pom.xml
index f39b2b8..3d9d602 100644
--- a/starters/pom.xml
+++ b/starters/pom.xml
@@ -33,7 +33,7 @@
 
     <modules>
         <module>karaf-boot-starter</module>
-        <module>karaf-boot-starter-karaf</module>
+        
         <module>karaf-boot-starter-shell</module>
         <module>karaf-boot-starter-web</module>
         <module>karaf-boot-starter-jpa</module>

http://git-wip-us.apache.org/repos/asf/karaf-boot/blob/56d97e24/tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/maven/GenerateMojo.java
----------------------------------------------------------------------
diff --git a/tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/maven/GenerateMojo.java b/tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/maven/GenerateMojo.java
index 6fd7566..b6573f5 100644
--- a/tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/maven/GenerateMojo.java
+++ b/tools/karaf-boot-maven-plugin/src/main/java/org/apache/karaf/boot/maven/GenerateMojo.java
@@ -46,9 +46,13 @@ public class GenerateMojo extends AbstractMojo {
 
     private final class BuildStreamFactory implements StreamFactory {
         @Override
-        public OutputStream create(File file) throws IOException {
-            file.getParentFile().mkdirs();
-            return buildContext.newFileOutputStream(file);
+        public OutputStream create(File file) {
+            try {
+                file.getParentFile().mkdirs();
+                return buildContext.newFileOutputStream(file);
+            } catch (IOException e) {
+                throw new RuntimeException("Error creating file " + file, e);
+            }
         }
     }