如何在激活器中获取IEclipseContext

时间:2013-08-19 14:58:24

标签: java eclipse-rcp e4

我遇到了Eclipse 4 RCP应用程序的一个问题。我需要记录一些事件。我需要以某种方式获取对记录器的引用。我知道,如何使用IEclipseContext做到这一点,但我找不到,如何在没有依赖注入的情况下获取IEclipseContext,我无法在激活器中使用。你有谁知道,请问如何解决这个问题?

非常感谢

3 个答案:

答案 0 :(得分:6)

您可以通过调用IEclipseContext来获取专门的EclipseContextFactory.getServiceContext(bundleContext),这将允许访问OSGi服务。

答案 1 :(得分:3)

似乎很遗憾,没有使用注射就无法获得IEclipseContext。 在How to use eclipse 4 DI in classes that are not attached to the application model的答案中写了:

  

然而,问题是IEclipseContext已经存在   注入一个可以访问需要注入的对象的类。

尽管如此,我已经解决了伐木问题和我的事情,这个原则一般都有效。总有一些服务提供您需要的东西。如果你不能使用依赖注入,你必须以某种方式(互联网和实验经常)获得适当的服务类名称。如果您已获得服务类名称,则可以从捆绑上下文中获取实例引用。幸运的是,可以在不使用注入的情况下访问bundle上下文。

回到我们的日志记录问题。被搜索的类是org.osgi.service.log.LogService

public class Activator implements BundleActivator {
    ...
    private static BundleContext context;
    ...

    public static BundleContext getContext() {
        return context;
    }
    ...
    public void start(BundleContext bundleContext) throws Exception {
        ServiceReference<?> logser = bundleContext.getServiceReference(LogService.class);
        LogService ls = (LogService)bundleContext.getService(logser);
        //print an error to test it (note, that info can be below the threshold)
        ls.log(LogService.LOG_ERROR, "The bundle is starting...");
        Activator.context = bundleContext;
    }
    ...
}

Etvoilà!

!ENTRY eu.barbucha.rcp-experiment.kernel 4 0 2013-08-20 07:32:32.347
!MESSAGE The bundle is starting...

这就是全部。稍后,如果需要,可以使用Activator.getContext()获取捆绑上下文。

重要说明:很遗憾,您现在无法降低阈值。 JVM参数-Declipse.log.level不会影响OSGI日志服务,您现在只使用OSGI记录器。不幸的是,他们(可能暂时)硬编码了记录阈值(参见How to log warnings and infos in eclipse 3.7)。我发现,他们还没有修复它。在开普勒版本中都没有。但是你可以妥协。您可以尽可能 injection-way

最终解决方案(全局捕捉异常)

我扩展了我的激活器:

ServiceReference<?> logreser = bundleContext.getServiceReference(LogReaderService.class);
LogReaderService lrs = (LogReaderService) bundleContext.getService(logreser);   
lrs.addLogListener(new LogListener() {
    @Override
    public void logged(LogEntry entry) {
        System.err.println("Something was logged: " + entry.getMessage());
    }
});

记录的东西开头的文本确实出现了,而且更新了某个地方已记录的东西。但最大的优点是,这个班级是我的。我可以控制它。日志条目还包含级别。我也可以轻松设置阈值。例如,在命令行上。

答案 2 :(得分:2)

可以从IWorkbench作为服务获取“WorkbenchContext”:

import org.eclipse.e4.core.contexts.IEclipseContext;
import org.eclipse.ui.PlatformUI;

public final class EclipseContextHelper {

    public static IEclipseContext getActiveContext(){
        IEclipseContext context = getWorkbenchContext();
        return context == null ? null : context.getActiveLeaf();
    }

    public static IEclipseContext getWorkbenchContext(){
        return PlatformUI.getWorkbench().getService(IEclipseContext.class);
    }
}