我正在构建一个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
答案 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功能。因此,我现在将停止研究如何做到这一点。
如果您希望解决此问题,请随时在此处发表评论或使用其他问题回答此问题与我联系。 :)