Как я могу узнать, какой пакет или плагин вызывал (разделял) код? - PullRequest
0 голосов
/ 24 мая 2011

Я хочу создать что-то вроде переменных BundleLocal , точно так же, как переменные ThreadLocal , но вместо того, чтобы искать их по Thread.currentThread() Мне нужно искать их по контексту пакета .

Дело в том, что у меня есть плагин фреймворка 'F' и другие плагины 'A', 'B' и т. Д., Использующие этот фреймворк. Каркас содержит синглтон, который я хочу реорганизовать таким образом, чтобы у меня было одноэлементного экземпляра на пакет . MySingleton.getInstance() будет затем создавать / возвращать выделенный экземпляр для каждого плагина. Проблема в том, что в MySingleton.getInstance() мне нужно выяснить, какой из плагинов ('A', 'B', ..) вызвал этот метод.

Я мог бы сделать это с помощью хака, получив стек вызовов с помощью

StackTraceElement[] ste=new Throwable().getStackTrace();

и затем запрос контекста пакета по классам для каждого элемента:

org.osgi.framework.FrameworkUtil.getBundle(Class c).getBundleContext()

но искренне надеемся, что существует лучший способ получить контекст пакета или идентификатор пакета из фреймворка 'F'.

Какой-нибудь совет, как сделать это более элегантно?

Ответы [ 2 ]

1 голос
/ 26 мая 2011

Из-за модульной природы OSGi (и его изолированных загрузчиков классов) синглтоны не работают (как вы узнали).

Если вы выполняете рефакторинг, одним из вариантов будет просто добавить косвенность. В ActivatorA:

public static Singleton getSingleton() {
    Framework.getSingleton(BUNDLE_ID);
}

Затем плагин A использует ActivatorA.getSingleton(), а плагин B использует ActivatorB.getSingleton ().

Другим потенциальным способом является предоставление ComponentFactory и использование декларативной службы для внедрения соответствующего компонента (службы OSGi) в плагин A и плагин B (каждый получает свой собственный экземпляр Компонента). Но это более динамичная, более разобщенная реализация моего первого примера.

1 голос
/ 24 мая 2011

Я бы рекомендовал вводить информацию, откуда поступает вызов, вместо того, чтобы пытаться определить, откуда он поступил. Примерно так:

MyMultiton.getInstance(bundleContext)
...