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/18 23:39:23 UTC
[1/2] git commit: [KARAF-2763] Provide SCR support for the
annotations and use them
Repository: karaf
Updated Branches:
refs/heads/master 17c95881d -> 291d564eb
[KARAF-2763] Provide SCR support for the annotations and use them
Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/291d564e
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/291d564e
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/291d564e
Branch: refs/heads/master
Commit: 291d564eba4102a33ba79ff60a0777340ea07013
Parents: ee59ed7
Author: Guillaume Nodet <gn...@gmail.com>
Authored: Tue Feb 18 23:22:57 2014 +0100
Committer: Guillaume Nodet <gn...@gmail.com>
Committed: Tue Feb 18 23:24:07 2014 +0100
----------------------------------------------------------------------
pom.xml | 5 +
scr/command/pom.xml | 13 +
.../org/apache/karaf/scr/command/Commands.java | 84 ------
.../scr/command/action/ActivateAction.java | 2 +
.../scr/command/action/DeactivateAction.java | 4 +
.../karaf/scr/command/action/DetailsAction.java | 2 +
.../karaf/scr/command/action/ListAction.java | 2 +
.../scr/command/action/ScrActionSupport.java | 2 +
.../command/completer/ActivateCompleter.java | 2 +
.../command/completer/DeactivateCompleter.java | 2 +
.../scr/command/completer/DetailsCompleter.java | 2 +
.../command/completer/ScrCompleterSupport.java | 2 +
scr/pom.xml | 1 +
scr/support/pom.xml | 113 ++++++++
.../karaf/scr/support/InjectAnnotations.java | 279 +++++++++++++++++++
.../karaf/scr/support/ScrCommandSupport.java | 112 ++++++++
16 files changed, 543 insertions(+), 84 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/karaf/blob/291d564e/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 8cbb326..62c4d7f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -725,6 +725,11 @@
<dependency>
<groupId>org.apache.karaf.scr</groupId>
+ <artifactId>org.apache.karaf.scr.support</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.karaf.scr</groupId>
<artifactId>org.apache.karaf.scr.command</artifactId>
<version>${project.version}</version>
</dependency>
http://git-wip-us.apache.org/repos/asf/karaf/blob/291d564e/scr/command/pom.xml
----------------------------------------------------------------------
diff --git a/scr/command/pom.xml b/scr/command/pom.xml
index d702d05..4475bfc 100644
--- a/scr/command/pom.xml
+++ b/scr/command/pom.xml
@@ -69,6 +69,11 @@
<artifactId>bndlib</artifactId>
<scope>provided</scope>
</dependency>
+ <dependency>
+ <groupId>org.apache.karaf.scr</groupId>
+ <artifactId>org.apache.karaf.scr.support</artifactId>
+ <scope>provided</scope>
+ </dependency>
</dependencies>
<build>
@@ -94,8 +99,16 @@
<configuration>
<instructions>
<Service-Component>*</Service-Component>
+ <_plugin>org.apache.karaf.scr.support.InjectAnnotations</_plugin>
</instructions>
</configuration>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.karaf.scr</groupId>
+ <artifactId>org.apache.karaf.scr.support</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ </dependencies>
</plugin>
</plugins>
</build>
http://git-wip-us.apache.org/repos/asf/karaf/blob/291d564e/scr/command/src/main/java/org/apache/karaf/scr/command/Commands.java
----------------------------------------------------------------------
diff --git a/scr/command/src/main/java/org/apache/karaf/scr/command/Commands.java b/scr/command/src/main/java/org/apache/karaf/scr/command/Commands.java
deleted file mode 100644
index 70533e5..0000000
--- a/scr/command/src/main/java/org/apache/karaf/scr/command/Commands.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * 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.
- */
-package org.apache.karaf.scr.command;
-
-import aQute.bnd.annotation.component.Activate;
-import aQute.bnd.annotation.component.Component;
-import aQute.bnd.annotation.component.Deactivate;
-import aQute.bnd.annotation.component.Reference;
-import org.apache.felix.scr.ScrService;
-import org.apache.karaf.scr.command.action.ActivateAction;
-import org.apache.karaf.scr.command.action.DeactivateAction;
-import org.apache.karaf.scr.command.action.DetailsAction;
-import org.apache.karaf.scr.command.action.ListAction;
-import org.apache.karaf.scr.command.completer.ActivateCompleter;
-import org.apache.karaf.scr.command.completer.DeactivateCompleter;
-import org.apache.karaf.scr.command.completer.DetailsCompleter;
-import org.apache.karaf.scr.command.completer.ScrCompleterSupport;
-import org.apache.karaf.shell.commands.Action;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- */
-@Component
-public class Commands extends org.apache.karaf.shell.commands.Commands {
-
- protected final Logger logger = LoggerFactory.getLogger(getClass().getName());
- protected ScrService scrService;
-
- @Activate
- public void activate() {
- logger.info("Activating SCR commands");
- completer(ActivateCompleter.class);
- completer(DeactivateCompleter.class);
- completer(DetailsCompleter.class);
- command(ActivateAction.class);
- command(DeactivateAction.class);
- command(DetailsAction.class);
- command(ListAction.class);
- register();
- }
-
- @Deactivate
- public void deactivate() {
- logger.info("Deactivating SCR commands");
- unregister();
- }
-
- @Reference
- public void setScrService(ScrService scrService) {
- this.scrService = scrService;
- }
-
- public CompleterBuilder completer(Class<? extends ScrCompleterSupport> completerClass) {
- try {
- ScrCompleterSupport completer = completerClass.newInstance();
- completer.setScrService(scrService);
- return completer(completer);
- } catch (Exception e) {
- throw new RuntimeException("Unable to create completer", e);
- }
- }
-
- public CommandBuilder command(Class<? extends Action> actionClass) {
- return super.command(actionClass)
- .properties(scrService)
- .serviceProp(ScrCommandConstants.HIDDEN_COMPONENT_KEY, "true");
- }
-
-}
http://git-wip-us.apache.org/repos/asf/karaf/blob/291d564e/scr/command/src/main/java/org/apache/karaf/scr/command/action/ActivateAction.java
----------------------------------------------------------------------
diff --git a/scr/command/src/main/java/org/apache/karaf/scr/command/action/ActivateAction.java b/scr/command/src/main/java/org/apache/karaf/scr/command/action/ActivateAction.java
index 5e435d4..049488c 100755
--- a/scr/command/src/main/java/org/apache/karaf/scr/command/action/ActivateAction.java
+++ b/scr/command/src/main/java/org/apache/karaf/scr/command/action/ActivateAction.java
@@ -24,11 +24,13 @@ import org.apache.felix.scr.ScrService;
import org.apache.karaf.scr.command.ScrCommandConstants;
import org.apache.karaf.scr.command.ScrUtils;
import org.apache.karaf.shell.commands.Completer;
+import org.apache.karaf.shell.inject.Service;
/**
* Activates the given component by supplying its component name.
*/
@Command(scope = ScrCommandConstants.SCR_COMMAND, name = ScrCommandConstants.ACTIVATE_FUNCTION, description = "Activates a Component for the given name")
+@Service
public class ActivateAction extends ScrActionSupport {
@Argument(index = 0, name = "name", description = "The name of the Component to activate ", required = true, multiValued = false)
http://git-wip-us.apache.org/repos/asf/karaf/blob/291d564e/scr/command/src/main/java/org/apache/karaf/scr/command/action/DeactivateAction.java
----------------------------------------------------------------------
diff --git a/scr/command/src/main/java/org/apache/karaf/scr/command/action/DeactivateAction.java b/scr/command/src/main/java/org/apache/karaf/scr/command/action/DeactivateAction.java
index e417459..31eeecc 100755
--- a/scr/command/src/main/java/org/apache/karaf/scr/command/action/DeactivateAction.java
+++ b/scr/command/src/main/java/org/apache/karaf/scr/command/action/DeactivateAction.java
@@ -23,11 +23,15 @@ import org.apache.felix.scr.Component;
import org.apache.felix.scr.ScrService;
import org.apache.karaf.scr.command.ScrCommandConstants;
import org.apache.karaf.shell.commands.Completer;
+import org.apache.karaf.shell.inject.Destroy;
+import org.apache.karaf.shell.inject.Init;
+import org.apache.karaf.shell.inject.Service;
/**
* Deactivates the given component by supplying its component name.
*/
@Command(scope = ScrCommandConstants.SCR_COMMAND, name = ScrCommandConstants.DEACTIVATE_FUNCTION, description = "Deactivates a Component for the given name")
+@Service
public class DeactivateAction extends ScrActionSupport {
@Argument(index = 0, name = "name", description = "The name of the Component to deactivate ", required = true, multiValued = false)
http://git-wip-us.apache.org/repos/asf/karaf/blob/291d564e/scr/command/src/main/java/org/apache/karaf/scr/command/action/DetailsAction.java
----------------------------------------------------------------------
diff --git a/scr/command/src/main/java/org/apache/karaf/scr/command/action/DetailsAction.java b/scr/command/src/main/java/org/apache/karaf/scr/command/action/DetailsAction.java
index 39b462c..a93c722 100644
--- a/scr/command/src/main/java/org/apache/karaf/scr/command/action/DetailsAction.java
+++ b/scr/command/src/main/java/org/apache/karaf/scr/command/action/DetailsAction.java
@@ -25,6 +25,7 @@ import org.apache.karaf.scr.command.completer.DetailsCompleter;
import org.apache.karaf.shell.commands.Argument;
import org.apache.karaf.shell.commands.Command;
import org.apache.karaf.shell.commands.Completer;
+import org.apache.karaf.shell.inject.Service;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceReference;
import org.osgi.service.component.ComponentConstants;
@@ -35,6 +36,7 @@ import java.util.Hashtable;
* Displays the details associated with a given component by supplying its component name.
*/
@Command(scope = ScrCommandConstants.SCR_COMMAND, name = ScrCommandConstants.DETAILS_FUNCTION, description = "Displays a list of available components")
+@Service
public class DetailsAction extends ScrActionSupport {
@Argument(index = 0, name = "name", description = "The name of the Component to display the details of", required = true, multiValued = false)
http://git-wip-us.apache.org/repos/asf/karaf/blob/291d564e/scr/command/src/main/java/org/apache/karaf/scr/command/action/ListAction.java
----------------------------------------------------------------------
diff --git a/scr/command/src/main/java/org/apache/karaf/scr/command/action/ListAction.java b/scr/command/src/main/java/org/apache/karaf/scr/command/action/ListAction.java
index da6b16e..26e3ca9 100755
--- a/scr/command/src/main/java/org/apache/karaf/scr/command/action/ListAction.java
+++ b/scr/command/src/main/java/org/apache/karaf/scr/command/action/ListAction.java
@@ -22,6 +22,7 @@ import org.apache.karaf.scr.command.ScrCommandConstants;
import org.apache.karaf.scr.command.ScrUtils;
import org.apache.karaf.scr.command.support.IdComparator;
import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.inject.Service;
import java.util.Arrays;
@@ -29,6 +30,7 @@ import java.util.Arrays;
* Lists all the components currently installed.
*/
@Command(scope = ScrCommandConstants.SCR_COMMAND, name = ScrCommandConstants.LIST_FUNCTION, description = "Displays a list of available components")
+@Service
public class ListAction extends ScrActionSupport {
private final IdComparator idComparator = new IdComparator();
http://git-wip-us.apache.org/repos/asf/karaf/blob/291d564e/scr/command/src/main/java/org/apache/karaf/scr/command/action/ScrActionSupport.java
----------------------------------------------------------------------
diff --git a/scr/command/src/main/java/org/apache/karaf/scr/command/action/ScrActionSupport.java b/scr/command/src/main/java/org/apache/karaf/scr/command/action/ScrActionSupport.java
index 0580dae..24c8619 100755
--- a/scr/command/src/main/java/org/apache/karaf/scr/command/action/ScrActionSupport.java
+++ b/scr/command/src/main/java/org/apache/karaf/scr/command/action/ScrActionSupport.java
@@ -25,6 +25,7 @@ import org.apache.karaf.shell.console.AbstractAction;
import org.apache.karaf.shell.console.CommandSessionHolder;
import org.apache.karaf.shell.console.SubShellAction;
import org.apache.karaf.shell.console.completer.ArgumentCompleter;
+import org.apache.karaf.shell.inject.Reference;
import org.fusesource.jansi.Ansi;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
@@ -45,6 +46,7 @@ public abstract class ScrActionSupport extends AbstractAction {
protected final Logger logger = LoggerFactory.getLogger(getClass().getName());
+ @Reference
private ScrService scrService;
public ScrActionSupport() {
http://git-wip-us.apache.org/repos/asf/karaf/blob/291d564e/scr/command/src/main/java/org/apache/karaf/scr/command/completer/ActivateCompleter.java
----------------------------------------------------------------------
diff --git a/scr/command/src/main/java/org/apache/karaf/scr/command/completer/ActivateCompleter.java b/scr/command/src/main/java/org/apache/karaf/scr/command/completer/ActivateCompleter.java
index b2358dd..7cfe6e6 100644
--- a/scr/command/src/main/java/org/apache/karaf/scr/command/completer/ActivateCompleter.java
+++ b/scr/command/src/main/java/org/apache/karaf/scr/command/completer/ActivateCompleter.java
@@ -17,7 +17,9 @@
package org.apache.karaf.scr.command.completer;
import org.apache.felix.scr.Component;
+import org.apache.karaf.shell.inject.Service;
+@Service
public class ActivateCompleter extends ScrCompleterSupport {
/**
http://git-wip-us.apache.org/repos/asf/karaf/blob/291d564e/scr/command/src/main/java/org/apache/karaf/scr/command/completer/DeactivateCompleter.java
----------------------------------------------------------------------
diff --git a/scr/command/src/main/java/org/apache/karaf/scr/command/completer/DeactivateCompleter.java b/scr/command/src/main/java/org/apache/karaf/scr/command/completer/DeactivateCompleter.java
index a44df15..60361d7 100644
--- a/scr/command/src/main/java/org/apache/karaf/scr/command/completer/DeactivateCompleter.java
+++ b/scr/command/src/main/java/org/apache/karaf/scr/command/completer/DeactivateCompleter.java
@@ -17,7 +17,9 @@
package org.apache.karaf.scr.command.completer;
import org.apache.felix.scr.Component;
+import org.apache.karaf.shell.inject.Service;
+@Service
public class DeactivateCompleter extends ScrCompleterSupport {
/**
http://git-wip-us.apache.org/repos/asf/karaf/blob/291d564e/scr/command/src/main/java/org/apache/karaf/scr/command/completer/DetailsCompleter.java
----------------------------------------------------------------------
diff --git a/scr/command/src/main/java/org/apache/karaf/scr/command/completer/DetailsCompleter.java b/scr/command/src/main/java/org/apache/karaf/scr/command/completer/DetailsCompleter.java
index b332be9..49bc9ba 100644
--- a/scr/command/src/main/java/org/apache/karaf/scr/command/completer/DetailsCompleter.java
+++ b/scr/command/src/main/java/org/apache/karaf/scr/command/completer/DetailsCompleter.java
@@ -17,7 +17,9 @@
package org.apache.karaf.scr.command.completer;
import org.apache.felix.scr.Component;
+import org.apache.karaf.shell.inject.Service;
+@Service
public class DetailsCompleter extends ScrCompleterSupport {
/**
http://git-wip-us.apache.org/repos/asf/karaf/blob/291d564e/scr/command/src/main/java/org/apache/karaf/scr/command/completer/ScrCompleterSupport.java
----------------------------------------------------------------------
diff --git a/scr/command/src/main/java/org/apache/karaf/scr/command/completer/ScrCompleterSupport.java b/scr/command/src/main/java/org/apache/karaf/scr/command/completer/ScrCompleterSupport.java
index 5994639..3434f86 100755
--- a/scr/command/src/main/java/org/apache/karaf/scr/command/completer/ScrCompleterSupport.java
+++ b/scr/command/src/main/java/org/apache/karaf/scr/command/completer/ScrCompleterSupport.java
@@ -23,6 +23,7 @@ import org.apache.felix.scr.ScrService;
import org.apache.karaf.scr.command.action.ScrActionSupport;
import org.apache.karaf.shell.console.Completer;
import org.apache.karaf.shell.console.completer.StringsCompleter;
+import org.apache.karaf.shell.inject.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -30,6 +31,7 @@ public abstract class ScrCompleterSupport implements Completer {
protected final transient Logger logger = LoggerFactory.getLogger(ScrCompleterSupport.class);
+ @Reference
private ScrService scrService;
/**
http://git-wip-us.apache.org/repos/asf/karaf/blob/291d564e/scr/pom.xml
----------------------------------------------------------------------
diff --git a/scr/pom.xml b/scr/pom.xml
index 162477a..4d7422c 100644
--- a/scr/pom.xml
+++ b/scr/pom.xml
@@ -34,6 +34,7 @@
<name>Apache Karaf :: Declarative Services (DS)</name>
<modules>
+ <module>support</module>
<module>command</module>
<module>management</module>
<module>examples</module>
http://git-wip-us.apache.org/repos/asf/karaf/blob/291d564e/scr/support/pom.xml
----------------------------------------------------------------------
diff --git a/scr/support/pom.xml b/scr/support/pom.xml
new file mode 100644
index 0000000..3ee6706
--- /dev/null
+++ b/scr/support/pom.xml
@@ -0,0 +1,113 @@
+<?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.scr</groupId>
+ <artifactId>scr</artifactId>
+ <version>3.0.1-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>org.apache.karaf.scr.support</artifactId>
+ <packaging>jar</packaging>
+ <name>Apache Karaf :: SCR :: Support</name>
+ <description>This bundle provides support for commands.</description>
+
+ <properties>
+ <appendedResourcesDirectory>${basedir}/../../etc/appended-resources</appendedResourcesDirectory>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.core</artifactId>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.karaf.shell</groupId>
+ <artifactId>org.apache.karaf.shell.console</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.scr</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>biz.aQute.bnd</groupId>
+ <artifactId>bndlib</artifactId>
+ <optional>true</optional>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.gogo.runtime</artifactId>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <resources>
+ <resource>
+ <directory>${project.basedir}/src/main/resources</directory>
+ <includes>
+ <include>**/*</include>
+ </includes>
+ </resource>
+ <resource>
+ <directory>${project.basedir}/src/main/resources</directory>
+ <filtering>true</filtering>
+ <includes>
+ <include>**/*.info</include>
+ </includes>
+ </resource>
+ </resources>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <configuration>
+ <instructions>
+ <Import-Package>
+ org.apache.felix.gogo.commands,
+ org.apache.karaf.shell.commands.basic,
+ org.apache.karaf.shell.console,
+ org.apache.karaf.shell.inject,
+ org.osgi.framework,
+ org.osgi.service.component,
+ org.slf4j
+ </Import-Package>
+ <Export-Package>
+ org.apache.karaf.scr.support
+ </Export-Package>
+ <Private-Package>
+ org.apache.karaf.scr.support.plugin
+ </Private-Package>
+ </instructions>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
http://git-wip-us.apache.org/repos/asf/karaf/blob/291d564e/scr/support/src/main/java/org/apache/karaf/scr/support/InjectAnnotations.java
----------------------------------------------------------------------
diff --git a/scr/support/src/main/java/org/apache/karaf/scr/support/InjectAnnotations.java b/scr/support/src/main/java/org/apache/karaf/scr/support/InjectAnnotations.java
new file mode 100644
index 0000000..92e56b1
--- /dev/null
+++ b/scr/support/src/main/java/org/apache/karaf/scr/support/InjectAnnotations.java
@@ -0,0 +1,279 @@
+/*
+ * 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.
+ */
+package org.apache.karaf.scr.support;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import aQute.bnd.component.HeaderReader;
+import aQute.bnd.component.TagResource;
+import aQute.bnd.header.Parameters;
+import aQute.bnd.osgi.Analyzer;
+import aQute.bnd.osgi.Annotation;
+import aQute.bnd.osgi.ClassDataCollector;
+import aQute.bnd.osgi.Clazz;
+import aQute.bnd.osgi.Constants;
+import aQute.bnd.osgi.Descriptors;
+import aQute.bnd.osgi.Instruction;
+import aQute.bnd.osgi.Processor;
+import aQute.bnd.osgi.URLResource;
+import aQute.bnd.service.AnalyzerPlugin;
+import aQute.lib.tag.Tag;
+import org.apache.felix.service.command.CommandProcessor;
+import org.apache.felix.service.command.Function;
+import org.apache.karaf.scr.support.ScrCommandSupport;
+import org.apache.karaf.shell.commands.Command;
+import org.apache.karaf.shell.commands.CommandWithAction;
+import org.apache.karaf.shell.commands.basic.AbstractCommand;
+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 static aQute.bnd.osgi.Constants.COMPONENT_ACTIVATE;
+import static aQute.bnd.osgi.Constants.COMPONENT_DEACTIVATE;
+import static aQute.bnd.osgi.Constants.COMPONENT_PROPERTIES;
+import static aQute.bnd.osgi.Constants.COMPONENT_PROVIDE;
+
+/**
+ *
+ */
+public class InjectAnnotations implements AnalyzerPlugin {
+
+ private Analyzer analyzer;
+
+ @Override
+ public boolean analyzeJar(Analyzer analyzer) throws Exception {
+ try {
+ return doAnalyzeJar(analyzer);
+ } catch (Exception t) {
+ t.printStackTrace(System.out);
+ throw t;
+ }
+ }
+
+ protected boolean doAnalyzeJar(Analyzer analyzer) throws Exception {
+ this.analyzer = analyzer;
+
+ System.out.println("\nLooking for @Service annotated classes\n");
+
+ Collection<Clazz> annotatedComponents = analyzer.getClasses("", Clazz.QUERY.ANNOTATED.toString(), Service.class.getName());
+
+ List<String> components = new ArrayList<String>();
+
+
+ for (Clazz clazz : annotatedComponents) {
+ System.out.println("\nFound @Service annotated class: " + clazz);
+
+ if (clazz.is(Clazz.QUERY.ANNOTATED, new Instruction(Command.class.getName()), analyzer)) {
+ System.out.println("\tCommand");
+ Collector collector = new Collector();
+ clazz.parseClassFileWithCollector(collector);
+
+ Map<String, String> info = new LinkedHashMap<String, String>();
+ info.put(COMPONENT_ACTIVATE, "activate");
+ info.put(COMPONENT_DEACTIVATE, "deactivate");
+ for (String key : collector.references.keySet()) {
+ info.put(key, collector.references.get(key));
+ }
+ info.put(COMPONENT_PROVIDE, Processor.join(Arrays.asList(new String[] {
+ Function.class.getName(),
+ CompletableFunction.class.getName(),
+ CommandWithAction.class.getName(),
+// AbstractCommand.class.getName()
+ })));
+
+ List<String> properties = new ArrayList<String>();
+ properties.add(CommandProcessor.COMMAND_SCOPE + "=" + collector.command.get("scope"));
+ properties.add(CommandProcessor.COMMAND_FUNCTION + "=" + collector.command.get("name"));
+ properties.add("hidden.component=true");
+ info.put(COMPONENT_PROPERTIES, Processor.join(properties));
+
+ TagResource resource = createComponentResource(clazz.getFQN(), ScrCommandSupport.class.getName(), info);
+ analyzer.getJar().putResource("OSGI-INF/" + clazz.getFQN() + ".xml", resource);
+ components.add("OSGI-INF/" + clazz.getFQN() + ".xml");
+ resource.write(System.out);
+ System.out.println();
+
+ } else {
+ System.out.println("\tNot a command");
+ Collector collector = new Collector();
+ clazz.parseClassFileWithCollector(collector);
+
+ Map<String, String> info = new LinkedHashMap<String, String>();
+ if (collector.init != null) {
+ info.put(COMPONENT_ACTIVATE, collector.init);
+ }
+ if (collector.destroy != null) {
+ info.put(COMPONENT_DEACTIVATE, collector.destroy);
+ }
+ for (String key : collector.references.keySet()) {
+ info.put(key, collector.references.get(key));
+ }
+ info.put(COMPONENT_PROVIDE, Processor.join(collector.allClasses));
+ List<String> properties = new ArrayList<String>();
+ properties.add("hidden.component=true");
+ info.put(COMPONENT_PROPERTIES, Processor.join(properties));
+
+ TagResource resource = createComponentResource(clazz.getFQN(), clazz.getFQN(), info);
+ analyzer.getJar().putResource("OSGI-INF/" + clazz.getFQN() + ".xml", resource);
+ components.add("OSGI-INF/" + clazz.getFQN() + ".xml");
+ resource.write(System.out);
+ System.out.println();
+ }
+
+ }
+
+ String name = ScrCommandSupport.class.getName().replace('.', '/') + ".class";
+ analyzer.getJar().putResource(name, new URLResource(ScrCommandSupport.class.getClassLoader().getResource(name)));
+ String pkg = ScrCommandSupport.class.getName();
+ pkg = pkg.substring( 0, pkg.lastIndexOf( '.' ) );
+ Descriptors.PackageRef pkgRef = analyzer.getPackageRef( pkg );
+ if ( !analyzer.getContained().containsKey( pkgRef ) ) {
+ analyzer.getContained().put(pkgRef);
+ }
+ String[] imports = new String[] {
+ "org.apache.felix.gogo.commands",
+ "org.apache.karaf.shell.commands.basic",
+ "org.apache.karaf.shell.console",
+ "org.apache.karaf.shell.inject",
+ "org.osgi.framework",
+ "org.osgi.service.component",
+ "org.slf4j"
+ };
+ for (String importPkg : imports) {
+ pkgRef = analyzer.getPackageRef( importPkg );
+ if ( !analyzer.getReferred().containsKey( pkgRef ) ) {
+ analyzer.getReferred().put( pkgRef );
+ }
+ }
+
+ String prop = analyzer.getProperty(Constants.SERVICE_COMPONENT);
+ for (String comp : components) {
+ if (prop == null || prop.length() == 0) {
+ prop = comp;
+ } else {
+ prop = prop + "," + comp;
+ }
+ }
+ analyzer.setProperty(Constants.SERVICE_COMPONENT, prop);
+
+ return false;
+ }
+
+ TagResource createComponentResource(String name, String impl, Map<String, String> info)
+ throws Exception {
+ Tag tag = new HeaderReader(analyzer).createComponentTag(name, impl, info);
+ return new TagResource(tag);
+ }
+
+ class Collector extends ClassDataCollector {
+ Descriptors.TypeRef zuper;
+ Clazz.MethodDef method;
+ Clazz.FieldDef field;
+
+ String init;
+ String destroy;
+ Annotation command;
+ Map<String, String> references = new LinkedHashMap<String, String>();
+ List<String> allClasses = new ArrayList<String>();
+
+ @Override
+ public void classBegin(int access, Descriptors.TypeRef name) {
+ if (!name.getFQN().equals(Object.class.getName())) {
+ allClasses.add(name.getFQN());
+ }
+ }
+
+ public void implementsInterfaces(Descriptors.TypeRef[] interfaces) throws Exception {
+ if (interfaces != null) {
+ for (Descriptors.TypeRef ref : interfaces) {
+ allClasses.add(ref.getFQN());
+ }
+ }
+ }
+
+ @Override
+ public void extendsClass(Descriptors.TypeRef zuper) throws Exception {
+ this.zuper = zuper;
+ }
+
+ @Override
+ public void field(Clazz.FieldDef defined) {
+ field = defined;
+ }
+
+ @Override
+ public void method(Clazz.MethodDef defined) {
+ method = defined;
+ }
+
+ @Override
+ public void annotation(Annotation annotation) {
+ String name = annotation.getName().getFQN();
+ if (Command.class.getName().equals(name)) {
+ System.out.println("\tCommand: " + annotation.get("scope") + ":" + annotation.get("name"));
+ command = annotation;
+ }
+ if (Reference.class.getName().equals(name)) {
+ System.out.println("\tReference: field=" + field.getName() + ", type=" + field.getType().getFQN());
+ references.put(field.getName(), field.getType().getFQN());
+ }
+ if (Init.class.getName().equals(name)) {
+ if (init == null) {
+ System.out.println("\tInit method: " + method.getName());
+ init = method.getName();
+ }
+ }
+ if (Destroy.class.getName().equals(name)) {
+ if (destroy == null) {
+ System.out.println("\tDestroy method: " + method.getName());
+ destroy = method.getName();
+ }
+ }
+ }
+
+ @Override
+ public void classEnd() throws Exception {
+ if (zuper != null) {
+ Clazz clazz = analyzer.findClass(zuper);
+ zuper = null;
+ if (clazz != null) {
+ clazz.parseClassFileWithCollector(this);
+ }
+ }
+ }
+ }
+
+ static boolean isAnnotated(Clazz.Def def, Class annotation) {
+ Collection<Descriptors.TypeRef> anns = def.getAnnotations();
+ if (anns != null) {
+ for (Descriptors.TypeRef ann : anns) {
+ if (annotation.getName().equals(ann.getFQN())) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/karaf/blob/291d564e/scr/support/src/main/java/org/apache/karaf/scr/support/ScrCommandSupport.java
----------------------------------------------------------------------
diff --git a/scr/support/src/main/java/org/apache/karaf/scr/support/ScrCommandSupport.java b/scr/support/src/main/java/org/apache/karaf/scr/support/ScrCommandSupport.java
new file mode 100644
index 0000000..18eadb0
--- /dev/null
+++ b/scr/support/src/main/java/org/apache/karaf/scr/support/ScrCommandSupport.java
@@ -0,0 +1,112 @@
+/*
+ * 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.
+ */
+package org.apache.karaf.scr.support;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.felix.gogo.commands.Action;
+import org.apache.karaf.shell.commands.basic.AbstractCommand;
+import org.apache.karaf.shell.console.BundleContextAware;
+import org.apache.karaf.shell.console.CompletableFunction;
+import org.apache.karaf.shell.console.Completer;
+import org.apache.karaf.shell.inject.Init;
+import org.apache.karaf.shell.inject.Reference;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.component.ComponentContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ */
+public class ScrCommandSupport extends AbstractCommand implements CompletableFunction {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ScrCommandSupport.class);
+
+ private ComponentContext componentContext;
+
+ public ScrCommandSupport() {
+ }
+
+ public void activate(ComponentContext componentContext) {
+ LOGGER.info("Activating SCR command for " + componentContext.getProperties().get("component.name"));
+ this.componentContext = componentContext;
+ }
+
+ public void deactivate(ComponentContext componentContext) {
+ }
+
+ public Class<? extends Action> getActionClass() {
+ try {
+ String className = (String) componentContext.getProperties().get("component.name");
+ return (Class<? extends Action>) componentContext.getBundleContext().getBundle().loadClass(className);
+ } catch (ClassNotFoundException e) {
+ throw new IllegalStateException(e);
+ }
+ }
+
+ @Override
+ public Action createNewAction() {
+ Class actionClass = getActionClass();
+ try {
+ Action action = (Action) actionClass.newInstance();
+ // Inject services
+ for (Class<?> cl = actionClass; cl != Object.class; cl = cl.getSuperclass()) {
+ for (Field field : cl.getDeclaredFields()) {
+ if (field.getAnnotation(Reference.class) != null) {
+ Object value;
+ if (field.getType() == BundleContext.class) {
+ value = componentContext.getBundleContext();
+ } else {
+ value = componentContext.locateService(field.getName());
+ }
+ if (value == null) {
+ throw new RuntimeException("No OSGi service matching " + field.getType().getName());
+ }
+ field.setAccessible(true);
+ field.set(action, value);
+ }
+ }
+ }
+ if (action instanceof BundleContextAware) {
+ ((BundleContextAware) action).setBundleContext(componentContext.getBundleContext());
+ }
+ for (Method method : actionClass.getDeclaredMethods()) {
+ Init ann = method.getAnnotation(Init.class);
+ if (ann != null && method.getParameterTypes().length == 0 && method.getReturnType() == void.class) {
+ method.setAccessible(true);
+ method.invoke(action);
+ }
+ }
+ return action;
+ } catch (Exception e) {
+ throw new RuntimeException("Unable to creation command action " + actionClass.getName(), e);
+ }
+ }
+
+ @Override
+ public List<Completer> getCompleters() {
+ return null;
+ }
+
+ @Override
+ public Map<String, Completer> getOptionalCompleters() {
+ return null;
+ }
+}
[2/2] git commit: Use the correct interface instead of abstract class
to access the action
Posted by gn...@apache.org.
Use the correct interface instead of abstract class to access the action
Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/ee59ed7b
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/ee59ed7b
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/ee59ed7b
Branch: refs/heads/master
Commit: ee59ed7ba71b4513e1b7e4d2c22601bbce6093a0
Parents: 17c9588
Author: Guillaume Nodet <gn...@gmail.com>
Authored: Tue Feb 18 23:21:04 2014 +0100
Committer: Guillaume Nodet <gn...@gmail.com>
Committed: Tue Feb 18 23:24:07 2014 +0100
----------------------------------------------------------------------
.../apache/karaf/shell/help/impl/CommandListHelpProvider.java | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/karaf/blob/ee59ed7b/shell/help/src/main/java/org/apache/karaf/shell/help/impl/CommandListHelpProvider.java
----------------------------------------------------------------------
diff --git a/shell/help/src/main/java/org/apache/karaf/shell/help/impl/CommandListHelpProvider.java b/shell/help/src/main/java/org/apache/karaf/shell/help/impl/CommandListHelpProvider.java
index 4f901a6..98102c4 100644
--- a/shell/help/src/main/java/org/apache/karaf/shell/help/impl/CommandListHelpProvider.java
+++ b/shell/help/src/main/java/org/apache/karaf/shell/help/impl/CommandListHelpProvider.java
@@ -31,6 +31,7 @@ import org.apache.felix.gogo.commands.Action;
import org.apache.felix.service.command.CommandSession;
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.commands.basic.AbstractCommand;
import org.apache.karaf.shell.commands.meta.ActionMetaDataFactory;
import org.apache.karaf.shell.console.HelpProvider;
@@ -92,9 +93,9 @@ public class CommandListHelpProvider implements HelpProvider {
String description = null;
Function function = (Function) session.get(name);
function = unProxy(function);
- if (function instanceof AbstractCommand) {
+ if (function instanceof CommandWithAction) {
try {
- Class<? extends Action> actionClass = ((AbstractCommand) function).getActionClass();
+ Class<? extends Action> actionClass = ((CommandWithAction) function).getActionClass();
Command ann = new ActionMetaDataFactory().getCommand(actionClass);
description = ann.description();
} catch (Throwable e) {