如何轻松查询正在运行的Eclipse的已安装功能?

时间:2012-03-29 14:27:44

标签: eclipse eclipse-rcp eclipse-plugin p2

我正在构建一个Eclipse功能,其要求相当于......如果用户的许可证已被撤销,则必须能够自动卸载该功能。

如果您想了解有关该主题的更多背景信息,请参阅此主题的另一个question that I've asked

感谢这个问题的答案,我一直在努力学习Eclipse p2导演api。我找到了一些看起来很有用的课程here

我一直在尝试在我的代码中实例化其中一个类,但还没有运气。 我一直在阅读帮助文档,而且我有点迷失在这一切。

我被困了,因为我需要为OperationFactory提供一组IInstallableUnit对象。

private void scheduleUninstallOperationJob(
        Collection<? extends IVersionedId> toUninstall) 
{
    OperationFactory oFactory = new OperationFactory();
    Collection<URI> repos = null;
    UninstallOperation op = null;
    try {
        op = oFactory.createUninstallOperation(toUninstall, repos, null);
    } catch (ProvisionException e) {
        e.printStackTrace();
    }
    IStatus result = op.resolveModal(null);
    if (result.isOK()) {
        op.getProvisioningJob(null).schedule();
    }
}

我没有看到任何方法可以轻易要求正在运行的Eclipse实例为我提供当前安装的InstallableUnits的集合,以便我可以轻松地将我要卸载的那个传递给 OperationFactory.createUninstallOperation()< / em>方法。

我尝试过使用Eclipse源代码作为示例,但我找到的代码是org.eclipse.equinox.p2.ui.ProvisioningUI,它紧密耦合到手动卸载InstallableUnits时使用的UI 。此代码还使用了可怕的Eclipse 内部包中的代码,如果可能的话,我希望避免使用这些代码。

感谢您的考虑,Trace

2 个答案:

答案 0 :(得分:2)

此代码获取由当前正在运行的系统的配置文件管理的IU集合:

/**
 * This Activator informs user about the IUs which are currently installed in
 * the running environment.
 * 
 * This code is intended for demo only and should be much more defensive for
 * production use.
 * 
 * @author Ilya Shinkarenko
 * 
 */
public class SelfInformerActivator extends Plugin {

@Override
public void start(final BundleContext ctx) throws Exception {
    super.start(ctx);

    ServiceReference<IProvisioningAgentProvider> sr = ctx.getServiceReference(IProvisioningAgentProvider.class);
    IProvisioningAgentProvider agentProvider = ctx.getService(sr);
    URI p2InstanceURI = null; // myself
    final IProvisioningAgent agent = agentProvider.createAgent(p2InstanceURI);

    IProfileRegistry regProfile = (IProfileRegistry) agent.getService(IProfileRegistry.SERVICE_NAME);

    IProfile profileSelf = regProfile.getProfile(IProfileRegistry.SELF);

    IQuery<IInstallableUnit> query = QueryUtil.createIUAnyQuery();

    //This is what you need:
    IQueryResult<IInstallableUnit> allIUs = profileSelf.query(query, new NullProgressMonitor());

    //Let's output it:
    Iterator<IInstallableUnit> iterator = allIUs.iterator();
    while (iterator.hasNext()) {
        IInstallableUnit iu = iterator.next();
        System.out.println(iu);
    }

}

}

答案 1 :(得分:0)

这个问题的流量非常少。我将其归因于推动这一发展的要求的奇怪性质。

好吧,似乎这些要求已经改变,我将不再需要基于撤销的许可证以编程方式卸载Eclipse功能。因此,我现在将停止研究如何做到这一点。

如果您希望解决此问题,请随时在此处发表评论或使用其他问题回答此问题与我联系。 :)