You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by gn...@apache.org on 2014/02/19 17:26:34 UTC

git commit: [KARAF-2763] Improvements to the scr plugin to not scan classes in dependencies and to handle lifecycle methods correctly Also remove System.out.println() calls.

Repository: karaf
Updated Branches:
  refs/heads/master 99585cf3b -> b546fdf23


[KARAF-2763] Improvements to the scr plugin to not scan classes in dependencies and to handle lifecycle methods correctly
Also remove System.out.println() calls.

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

Branch: refs/heads/master
Commit: b546fdf237f4b1314ec4426257da0c5325261abe
Parents: 99585cf
Author: Guillaume Nodet <gn...@gmail.com>
Authored: Wed Feb 19 17:25:52 2014 +0100
Committer: Guillaume Nodet <gn...@gmail.com>
Committed: Wed Feb 19 17:25:52 2014 +0100

----------------------------------------------------------------------
 .../karaf/tooling/scr/ScrCommandMojo.java       | 69 ++++++++++++++++----
 1 file changed, 58 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/b546fdf2/tooling/karaf-scr-maven-plugin/src/main/java/org/apache/karaf/tooling/scr/ScrCommandMojo.java
----------------------------------------------------------------------
diff --git a/tooling/karaf-scr-maven-plugin/src/main/java/org/apache/karaf/tooling/scr/ScrCommandMojo.java b/tooling/karaf-scr-maven-plugin/src/main/java/org/apache/karaf/tooling/scr/ScrCommandMojo.java
index 377dd60..046554c 100644
--- a/tooling/karaf-scr-maven-plugin/src/main/java/org/apache/karaf/tooling/scr/ScrCommandMojo.java
+++ b/tooling/karaf-scr-maven-plugin/src/main/java/org/apache/karaf/tooling/scr/ScrCommandMojo.java
@@ -13,6 +13,7 @@ import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -26,6 +27,8 @@ import org.apache.felix.service.command.Function;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.CommandWithAction;
 import org.apache.karaf.shell.console.CompletableFunction;
+import org.apache.karaf.shell.inject.Destroy;
+import org.apache.karaf.shell.inject.Init;
 import org.apache.karaf.shell.inject.Reference;
 import org.apache.karaf.shell.inject.Service;
 import org.apache.maven.artifact.DependencyResolutionRequiredException;
@@ -77,7 +80,7 @@ public class ScrCommandMojo extends AbstractMojo {
 
                 Command cmd = clazz.getAnnotation(Command.class);
                 if (cmd != null) {
-                    System.out.println("\nFound command: " + clazz.getName() + "\n\t" + cmd.scope() + ":" + cmd.name() + "\n");
+//                    System.out.println("\nFound command: " + clazz.getName() + "\n\t" + cmd.scope() + ":" + cmd.name() + "\n");
 
                     StringBuilder sb = new StringBuilder();
                     sb.append("<?xml version='1.1'?>\n");
@@ -111,13 +114,21 @@ public class ScrCommandMojo extends AbstractMojo {
                     w.close();
                     hasCommand = true;
                 } else {
-                    System.out.println("\nFound service: " + clazz.getName() + "\n");
+//                    System.out.println("\nFound service: " + clazz.getName() + "\n");
 
                     StringBuilder sb = new StringBuilder();
                     sb.append("<?xml version='1.1'?>\n");
+
+                    String[] lf = getLifecycleMethods(clazz);
                     sb.append("<scr:component xmlns:scr=\"http://www.osgi.org/xmlns/scr/v1.1.0\" name=\"")
-                            .append(clazz.getName())
-                            .append("\" activate=\"activate\" deactivate=\"deactivate\">\n");
+                            .append(clazz.getName()).append("\"");
+                    if (lf[0] != null) {
+                        sb.append(" activate=\"activate\"");
+                    }
+                    if (lf[1] != null) {
+                        sb.append(" deactivate=\"deactivate\"");
+                    }
+                    sb.append(">\n");
                     sb.append("  <implementation class=\"").append(clazz.getName()).append("\"/>\n");
                     sb.append("  <service>\n");
                     List<Class> allClasses = new ArrayList<Class>();
@@ -176,6 +187,31 @@ public class ScrCommandMojo extends AbstractMojo {
         }
     }
 
+    private String[] getLifecycleMethods(Class<?> clazz) {
+        Method activate = null;
+        Method deactivate = null;
+        for (Method method : clazz.getMethods()) {
+            if (method.getAnnotation(Init.class) != null) {
+                if (activate == null) {
+                    activate = method;
+                } else {
+                    throw new IllegalArgumentException("Multiple methods annotated with @Init found");
+                }
+            }
+            if (method.getAnnotation(Destroy.class) != null) {
+                if (deactivate == null) {
+                    deactivate = method;
+                } else {
+                    throw new IllegalArgumentException("Multiple methods annotated with @Destroy found");
+                }
+            }
+        }
+        return new String[] {
+                activate != null ? activate.getName() : null,
+                deactivate != null ? deactivate.getName() : null
+        };
+    }
+
     private String[] getBindMethods(Class<?> clazz, String key, Class type) {
         String cap = key.substring(0, 1).toUpperCase() + key.substring(1);
         Method bind = null;
@@ -225,12 +261,23 @@ public class ScrCommandMojo extends AbstractMojo {
     }
 
     private ClassLoader getClassLoader() throws MojoFailureException, DependencyResolutionRequiredException, MalformedURLException {
-        List<URL> urls = new ArrayList<URL>();
-        for (Object object : project.getCompileClasspathElements()) {
-            String path = (String) object;
-            urls.add(new File(path).toURL());
+        List<String> roots = Arrays.asList(project.getBuild().getOutputDirectory());
+        List<String> paths = project.getCompileClasspathElements();
+        List<URL> parentUrls = new ArrayList<URL>();
+        List<URL> childUrls = new ArrayList<URL>();
+
+//        System.out.println("Roots: " + roots);
+//        System.out.println("Paths: " + paths);
+        for (String path : paths) {
+            URL url = new File(path).toURL();
+            if (roots.contains(path)) {
+                childUrls.add(url);
+            } else {
+                parentUrls.add(url);
+            }
         }
-        ClassLoader classLoader = new URLClassLoader(urls.toArray(new URL[] {}), getClass().getClassLoader());
+        ClassLoader classLoader = new URLClassLoader(childUrls.toArray(new URL[] {}),
+                new URLClassLoader(parentUrls.toArray(new URL[] {}), getClass().getClassLoader()));
         return classLoader;
     }
 
@@ -242,7 +289,7 @@ public class ScrCommandMojo extends AbstractMojo {
             header = pkg;
         }
         project.getProperties().setProperty("Private-Package", header);
-        System.out.println("\nPrivate-Package: " + header + "\n");
+//        System.out.println("\nPrivate-Package: " + header + "\n");
     }
 
     /**
@@ -274,7 +321,7 @@ public class ScrCommandMojo extends AbstractMojo {
                 sb.append(entry);
             }
             project.getProperties().setProperty("Service-Component", sb.toString());
-            System.out.println("\nService-Component: " + sb.toString() + "\n");
+//            System.out.println("\nService-Component: " + sb.toString() + "\n");
         }
     }