Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.

Bug 347319

Summary: [repository] SimpleArtifactRepositoryFactory prevents loading repositories from non-URL URIs
Product: [Eclipse Project] Equinox Reporter: Tobias Oberlies <t-oberlies>
Component: p2Assignee: Tobias Oberlies <t-oberlies>
Status: RESOLVED FIXED QA Contact:
Severity: normal    
Priority: P3 CC: pascal, pwebster
Version: 3.6.2   
Target Milestone: Juno M7   
Hardware: All   
OS: All   
Whiteboard:

Description Tobias Oberlies CLA 2011-05-26 10:00:02 EDT
URI is an extension of URL in that it allows to identify resources without having to specify how to locate them. Therefore a non-URL URI, e.g. with a "registry:" scheme is exactly what you would want to use when implementing an ArtifactRepositoryFactory that "load" p2 repositories from a registry service.

However the implementation of SimpleArtifactRepositoryFactory insists that all URIs it is asked to load are URLs, and throws an exception which prevents that other factories are even considered. With the SimpleArtifactRepositoryFactory being the first factory to be asked (by default), this breaks all non-URL based factories.

I would expect the SimpleArtifactRepositoryFactory to simply return a ProvisionException.REPOSITORY_NOT_FOUND if the URI to load is not a URL.


The current implementation breaks at the following code location:

org.eclipse.equinox.p2.core.ProvisionException: Invalid source repository location: registry:resolution-context-artifacts@C:%5CEnv%5CSource%5Csonatype-tycho%5Ctycho-its%5Cprojects%5CpomDependencyConsider.p2Data.generate%5Crepository.
        at org.eclipse.equinox.p2.internal.repository.tools.AbstractApplication.initializeRepos(AbstractApplication.java:126)
        at org.eclipse.equinox.p2.internal.repository.tools.MirrorApplication.run(MirrorApplication.java:178)
        at org.eclipse.tycho.p2.tools.impl.mirroring.MirrorApplicationServiceImpl.executeMirroring(MirrorApplicationServiceImpl.java:96)
        ... 23 more
Caused by: org.eclipse.equinox.p2.core.ProvisionException: Malformed reference to remote file: registry:resolution-context-artifacts@C:%5CEnv%5CSource%5Csonatype-tycho%5Ctycho-its%5Cprojects%5CpomDependencyConsider.p2Data.generate%5Crepository/artifacts.xml
        at org.eclipse.equinox.internal.p2.repository.CacheManager.createCache(CacheManager.java:189)
        at org.eclipse.equinox.internal.p2.artifact.repository.simple.SimpleArtifactRepositoryFactory.getLocalFile(SimpleArtifactRepositoryFactory.java:64)
        at org.eclipse.equinox.internal.p2.artifact.repository.simple.SimpleArtifactRepositoryFactory.load(SimpleArtifactRepositoryFactory.java:83)
        at org.eclipse.equinox.internal.p2.artifact.repository.ArtifactRepositoryManager.factoryLoad(ArtifactRepositoryManager.java:68)
        at org.eclipse.equinox.internal.p2.repository.helpers.AbstractRepositoryManager.loadRepository(AbstractRepositoryManager.java:746)
        at org.eclipse.equinox.internal.p2.repository.helpers.AbstractRepositoryManager.loadRepository(AbstractRepositoryManager.java:651)
        at org.eclipse.equinox.internal.p2.artifact.repository.ArtifactRepositoryManager.loadRepository(ArtifactRepositoryManager.java:99)
        at org.eclipse.equinox.p2.internal.repository.tools.AbstractApplication.addRepository(AbstractApplication.java:147)
        at org.eclipse.equinox.p2.internal.repository.tools.AbstractApplication.initializeRepos(AbstractApplication.java:119)
        ... 25 more
Caused by: java.net.MalformedURLException: unknown protocol: registry
        at java.net.URL.<init>(URL.java:574)
        at java.net.URL.<init>(URL.java:464)
        at java.net.URL.<init>(URL.java:413)
        at org.eclipse.ecf.provider.filetransfer.identity.FileTransferNamespace.createInstance(FileTransferNamespace.java:58)
        at org.eclipse.ecf.core.identity.IDFactory.createID(IDFactory.java:267)
        at org.eclipse.ecf.filetransfer.identity.FileIDFactory.createFileID(FileIDFactory.java:96)
        at org.eclipse.ecf.filetransfer.identity.FileIDFactory.createFileID(FileIDFactory.java:73)
        at org.eclipse.equinox.internal.p2.repository.FileInfoReader.sendBrowseRequest(FileInfoReader.java:180)
        at org.eclipse.equinox.internal.p2.repository.FileInfoReader.getRemoteFiles(FileInfoReader.java:107)
        at org.eclipse.equinox.internal.p2.repository.FileInfoReader.getRemoteFile(FileInfoReader.java:123)
        at org.eclipse.equinox.internal.p2.repository.FileInfoReader.getLastModified(FileInfoReader.java:128)
        at org.eclipse.equinox.internal.p2.repository.RepositoryTransport.getLastModified(RepositoryTransport.java:224)
        at org.eclipse.equinox.internal.p2.repository.CacheManager.createCache(CacheManager.java:169)
        ... 33 more
Comment 1 Pascal Rapicault CLA 2011-05-30 11:48:34 EDT
Thought I had commented on this. I agree that in this case a repository not found should be returned.
Comment 2 Thomas Watson CLA 2011-06-08 11:28:57 EDT
Move all 3.8 bugs to Juno.