Hi,
I am creating an Eclipse 4 RCP that should update itself via P2. Therefore I implemented the (basically) following code:
ServiceReference<?> reference = Activator.context
.getServiceReference(IProvisioningAgentProvider.SERVICE_NAME);
IProvisioningAgentProvider provider = null;
if (reference == null)
return null;
provider = (IProvisioningAgentProvider) Activator.context
.getService(reference);
Bundle bundle = FrameworkUtil.getBundle(Service.class);
URL url = FileLocator.toFileURL(FileLocator.find(bundle,
new Path("p2"), null));
IProvisioningAgent agent = provider.createAgent(new URI("file:"
+ url.getPath().substring(1)));
IMetadataRepositoryManager metadataManager =(IMetadataRepositoryManager) agent
.getService(IMetadataRepositoryManager.SERVICE_NAME);
IArtifactRepositoryManager artifactManager = (IArtifactRepositoryManager) agent
.getService(IArtifactRepositoryManager.SERVICE_NAME);
if (artifactManager == null || metadataManager == null)
throw new InvocationTargetException(new Throwable(
"Could not load repository").fillInStackTrace());
URI repositoryLocation = new URI(Service.getString("updateSite"));
metadataManager.loadRepository(repositoryLocation, null);
artifactManager.loadRepository(repositoryLocation, null);
ProvisioningSession session = new ProvisioningSession(agent);
UpdateOperation operation = new UpdateOperation(session);
SubMonitor sub = SubMonitor.convert(new Monitor(),
"Updating...", 500);
IStatus status = operation.resolveModal(sub.newChild(100));
The last line throws the following exception:
Caused by: java.lang.IllegalArgumentException: URI is not hierarchical
at java.io.File.<init>(File.java:392)
at org.eclipse.equinox.internal.p2.engine.SimpleProfileRegistry.getDefaultRegistryDirectory(SimpleProfileRegistry.java:109)
at org.eclipse.equinox.internal.p2.engine.ProfileRegistryComponent.createService(ProfileRegistryComponent.java:26)
at org.eclipse.equinox.internal.p2.core.ProvisioningAgent.getService(ProvisioningAgent.java:72)
at org.eclipse.equinox.p2.operations.ProvisioningSession.getProfileRegistry(ProvisioningSession.java:88)
at org.eclipse.equinox.p2.operations.UpdateOperation.getInstalledIUs(UpdateOperation.java:295)
at org.eclipse.equinox.p2.operations.UpdateOperation.prepareToResolve(UpdateOperation.java:280)
at org.eclipse.equinox.p2.operations.ProfileChangeOperation.resolveModal(ProfileChangeOperation.java:112)
at de.test.e4.editor.handler.UpdateHandler.update(UpdateHandler.java:58)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:56)
... 30 more
The URI for the Agent looks like this:
file:D:/workspace/de.test.e4.editor/p2/
The URI for the repositories looks like this:
http://localhost:8080/server/repository
It doesn't make a difference, if the repository is a local file.
Did anybody else experience something like this?
I would be happy for any hint.
Best regards
Bastian