Пользовательская команда Felix с аннотациями iPOJO - PullRequest
1 голос
/ 06 марта 2012

В настоящее время я пытаюсь реализовать пользовательскую команду оболочки для Феликса, используя iPOJO.Мой пример реализации выглядит следующим образом:

import java.io.PrintStream;

import org.apache.felix.ipojo.annotations.Component;
import org.apache.felix.ipojo.annotations.Provides;
import org.apache.felix.shell.Command;

@Component(immediate = true)
@Provides
public class SampleCommand implements Command {


    @Override
    public String getName() {
        return "testcmd";
    }

    @Override
    public String getUsage() {
        return "testcmd";
    }

    @Override
    public String getShortDescription() {
        return "test command";
    }

    @Override
    public void execute(String line, PrintStream out, PrintStream err) {
        out.println("execute testcmd!");
    }

}

Когда я развертываю Bundle на Felix, создается экземпляр моего SampleCommand и вызывается getName ().Но когда я пытаюсь выполнить «testcmd» на оболочке, я получаю:

gogo: CommandNotFoundException: Command not found: testcmd

Есть ли еще какие-то вопросы, которые мне нужно рассмотреть?

Ответы [ 3 ]

8 голосов
/ 07 марта 2012

Основываясь на отзывах, приведенных выше пользователем user1231484 и наушниками, вот минимальный рабочий пример:

import org.apache.felix.ipojo.annotations.Component;
import org.apache.felix.ipojo.annotations.Instantiate;
import org.apache.felix.ipojo.annotations.Provides;
import org.apache.felix.ipojo.annotations.ServiceProperty;
import org.apache.felix.service.command.Descriptor;

@Component(immediate = true)
@Instantiate
@Provides(specifications = ListComponentsCommand.class)
public class ListComponentsCommand {

    @ServiceProperty(name = "osgi.command.scope", value = "test")
    String scope;

    @ServiceProperty(name = "osgi.command.function", value = "{}")
    String[] function = new String[] { "test" };

    @Descriptor("test")
    public void test() {
        System.out.println("test!");
    }

}
5 голосов
/ 06 марта 2012

Я не уверен, что вам нужно больше использовать подкласс Command ( эта страница выглядит очень старой), я думаю, что это должно сработать, просто зарегистрировав службу с двумя конкретными свойствами:

  1. Свойство области действия «osgi.command.scope» (которое, по сути, предоставляет пространство имен в случае, если имена ваших команд совпадают с именами, предоставленными другим.
  2. Строковый массив "osgi.command.function" с именами ваших методов, действующих как команды

Таким образом, вашим командам не нужно ничего знать о OSGi. Вы используете потоки печати обычным способом (они перенаправляются оболочкой)

* 1013 Е.Г. *

@ServiceProperty(name = "osgi.command.scope", value = "mycommands")
@ServiceProperty(name = "osgi.command.function", value = {"execute", "add"})
@Component(immediate = true)
@Provides
public class SampleCommand implements MyOwnCommand {

    @Override
    public void execute(String line) {
        System.out.println("execute testcmd! with line: " + line);
    }

    @Override
    public void add(int a, int b) {
        System.out.println(a + "+" + b + "=" + (a+b));
    }

}

Единственная цена, которую вы платите за это, - это потеря функциональности справки и использования.

2 голосов
/ 07 марта 2012

Вы разрабатываете команду для Felix Shell (старая версия).Тем не менее, с недавних пор Феликс использует Gogo (реализует стандарт OSGi).Таким образом, вы должны проверить http://felix.apache.org/site/rfc-147-overview.html, чтобы ввести новую команду.

Более того, вы можете взглянуть на команду iPOJO Arch для Gogo .Он использует сам iPOJO.

...