From c94f3acdf6e1452d5d9bbe58d186c48c9391a918 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cristiano=20Gavi=C3=A3o?= Date: Sat, 8 Apr 2017 16:16:59 -0300 Subject: [PATCH 1/5] #FELIX-5611 - pass repository URL to parsers If the url attribute parsed from a resource are relative path then it will be resolved against the repository location. --- .../impl/DataModelHelperImpl.java | 9 +++--- .../bundlerepository/impl/PullParser.java | 9 ++++-- .../impl/RepositoryParser.java | 2 +- .../impl/SpecXMLPullParser.java | 28 +++++++++++-------- .../bundlerepository/impl/StaxParser.java | 6 ++-- 5 files changed, 33 insertions(+), 21 deletions(-) diff --git a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/DataModelHelperImpl.java b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/DataModelHelperImpl.java index 3e59d364446..681d3c82c2b 100644 --- a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/DataModelHelperImpl.java +++ b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/DataModelHelperImpl.java @@ -132,8 +132,8 @@ else if (url.getPath().endsWith(".gz")) if (is != null) { - RepositoryImpl repository = repository(is); - repository.setURI(url.toExternalForm()); + RepositoryImpl repository = repository(is,url.toExternalForm()); + return repository; } else @@ -158,10 +158,11 @@ else if (url.getPath().endsWith(".gz")) } } - public RepositoryImpl repository(InputStream is) throws Exception + public RepositoryImpl repository(InputStream is, String uri) throws Exception { RepositoryParser parser = RepositoryParser.getParser(); - RepositoryImpl repository = parser.parseRepository(is); + RepositoryImpl repository = parser.parseRepository(is, uri); + return repository; } diff --git a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/PullParser.java b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/PullParser.java index a1871331b3e..a5c6b257c1d 100644 --- a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/PullParser.java +++ b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/PullParser.java @@ -36,7 +36,7 @@ public PullParser() { } - public RepositoryImpl parseRepository(InputStream is) throws Exception + public RepositoryImpl parseRepository(InputStream is, String repositoryURI) throws Exception { XmlPullParser reader = new KXmlParser(); @@ -50,14 +50,17 @@ public RepositoryImpl parseRepository(InputStream is) throws Exception throw new Exception("Expected element 'repository' at the root of the document"); } + RepositoryImpl repo; if ("http://www.osgi.org/xmlns/repository/v1.0.0".equals(reader.getNamespace())) // TODO there are a bunch of other methods here that create a parser, should they be updated too? // at the very least they should be made namespace-aware too, so that parsing is the same no matter // how its initiated. - return SpecXMLPullParser.parse(reader); + return SpecXMLPullParser.parse(reader, repositoryURI); else // We're parsing the old - return parse(reader); + repo = parse(reader); + repo.setURI(repositoryURI); + return repo; } public RepositoryImpl parseRepository(Reader r) throws Exception diff --git a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/RepositoryParser.java b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/RepositoryParser.java index e715de619f2..407f74f373c 100644 --- a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/RepositoryParser.java +++ b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/RepositoryParser.java @@ -71,7 +71,7 @@ public static RepositoryParser getParser() } - public abstract RepositoryImpl parseRepository(InputStream is) throws Exception; + public abstract RepositoryImpl parseRepository(InputStream is, String repositoryURI) throws Exception; public abstract RepositoryImpl parseRepository(Reader r) throws Exception; diff --git a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/SpecXMLPullParser.java b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/SpecXMLPullParser.java index 3ebcd9fd52d..d3fa5fad6b2 100644 --- a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/SpecXMLPullParser.java +++ b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/SpecXMLPullParser.java @@ -19,6 +19,7 @@ package org.apache.felix.bundlerepository.impl; import java.io.IOException; +import java.net.URI; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -48,10 +49,10 @@ public class SpecXMLPullParser private static final String REQUIREMENT = "requirement"; private static final String RESOURCE = "resource"; - public static RepositoryImpl parse(XmlPullParser reader) throws Exception + public static RepositoryImpl parse(XmlPullParser reader, String repositoryURI) throws Exception { RepositoryImpl repository = new RepositoryImpl(); - + repository.setURI(repositoryURI); for (int i = 0, ac = reader.getAttributeCount(); i < ac; i++) { String name = reader.getAttributeName(i); @@ -72,7 +73,7 @@ else if (INCREMENT.equals(name)) } else if (RESOURCE.equals(element)) { - Resource resource = parseResource(reader); + Resource resource = parseResource(reader, repositoryURI); repository.addResource(resource); } else @@ -85,7 +86,7 @@ else if (RESOURCE.equals(element)) return repository; } - private static Resource parseResource(XmlPullParser reader) throws Exception + private static Resource parseResource(XmlPullParser reader, String repositoryURI) throws Exception { ResourceImpl resource = new ResourceImpl(); try @@ -96,7 +97,7 @@ private static Resource parseResource(XmlPullParser reader) throws Exception String element = reader.getName(); if (CAPABILITY.equals(element)) { - Capability capability = parseCapability(reader, resource); + Capability capability = parseCapability(reader, resource, repositoryURI); if (capability != null) resource.addCapability(capability); } @@ -122,7 +123,7 @@ else if (REQUIREMENT.equals(element)) } } - private static Capability parseCapability(XmlPullParser reader, ResourceImpl resource) throws Exception + private static Capability parseCapability(XmlPullParser reader, ResourceImpl resource, String repositoryURI) throws Exception { String namespace = reader.getAttributeValue(null, NAMESPACE); if (IdentityNamespace.IDENTITY_NAMESPACE.equals(namespace)) @@ -134,7 +135,7 @@ private static Capability parseCapability(XmlPullParser reader, ResourceImpl res { if (resource.getURI() == null) { - parseContentNamespace(reader, resource); + parseContentNamespace(reader, resource, repositoryURI); return null; } // if the URI is already set, this is a second osgi.content capability. @@ -188,18 +189,23 @@ private static void parseIdentityNamespace(XmlPullParser reader, ResourceImpl re } } - private static void parseContentNamespace(XmlPullParser reader, ResourceImpl resource) throws Exception + private static void parseContentNamespace(XmlPullParser reader, ResourceImpl resource, String repositoryURI) throws Exception { Map attributes = new HashMap(); parseAttributesDirectives(reader, attributes, new HashMap(), CAPABILITY); - + URI repo = URI.create(repositoryURI); + for (Map.Entry entry : attributes.entrySet()) { if (ContentNamespace.CONTENT_NAMESPACE.equals(entry.getKey())) // TODO we should really check the SHA continue; - else if (ContentNamespace.CAPABILITY_URL_ATTRIBUTE.equals(entry.getKey())) - resource.put(Resource.URI, entry.getValue()); + else if (ContentNamespace.CAPABILITY_URL_ATTRIBUTE.equals(entry.getKey())) { + String value = (String) entry.getValue(); + URI uri = URI.create(value); + resource.put(Resource.URI, uri.isAbsolute()? uri.getPath(): + repo.resolve(uri)); + } else resource.put(entry.getKey(), entry.getValue()); } diff --git a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/StaxParser.java b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/StaxParser.java index 58880c0f39c..e040bb704c1 100644 --- a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/StaxParser.java +++ b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/StaxParser.java @@ -69,7 +69,7 @@ protected static boolean setProperty(XMLInputFactory factory, String name, boole return false; } - public RepositoryImpl parseRepository(InputStream is) throws Exception + public RepositoryImpl parseRepository(InputStream is, String repositoryURI) throws Exception { XMLStreamReader reader = getFactory().createXMLStreamReader(is); int event = reader.nextTag(); @@ -77,7 +77,9 @@ public RepositoryImpl parseRepository(InputStream is) throws Exception { throw new Exception("Expected element 'repository' at the root of the document"); } - return parseRepository(reader); + RepositoryImpl repo = parseRepository(reader); + repo.setURI(repositoryURI); + return repo; } public RepositoryImpl parseRepository(Reader r) throws Exception From 814863cf20a03970f3d63bc241b9f8ecf77cb0b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cristiano=20Gavi=C3=A3o?= Date: Sun, 9 Apr 2017 23:38:27 -0300 Subject: [PATCH 2/5] considering use case using .zip files --- .../felix/bundlerepository/impl/DataModelHelperImpl.java | 8 ++++++-- .../felix/bundlerepository/impl/SpecXMLPullParser.java | 4 ++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/DataModelHelperImpl.java b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/DataModelHelperImpl.java index 681d3c82c2b..7d37f5e23ac 100644 --- a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/DataModelHelperImpl.java +++ b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/DataModelHelperImpl.java @@ -101,7 +101,7 @@ public Repository repository(final URL url) throws Exception ZipEntry entry = zin.getNextEntry(); while (entry != null) { - if (entry.getName().equals("repository.xml")) + if (entry.getName().equals("repository.xml") || entry.getName().equals("index.xml")) { is = zin; break; @@ -132,7 +132,11 @@ else if (url.getPath().endsWith(".gz")) if (is != null) { - RepositoryImpl repository = repository(is,url.toExternalForm()); + String repostr = url.toExternalForm(); + if (repostr.endsWith("zip")) { + repostr = "jar:".concat(repostr).concat("!/"); + } + RepositoryImpl repository = repository(is, repostr); return repository; } diff --git a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/SpecXMLPullParser.java b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/SpecXMLPullParser.java index d3fa5fad6b2..1aa1831667e 100644 --- a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/SpecXMLPullParser.java +++ b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/SpecXMLPullParser.java @@ -203,8 +203,8 @@ private static void parseContentNamespace(XmlPullParser reader, ResourceImpl res else if (ContentNamespace.CAPABILITY_URL_ATTRIBUTE.equals(entry.getKey())) { String value = (String) entry.getValue(); URI uri = URI.create(value); - resource.put(Resource.URI, uri.isAbsolute()? uri.getPath(): - repo.resolve(uri)); + URI resourceURI = uri.isAbsolute()? uri:URI.create(repo.toString().concat(value)); + resource.put(Resource.URI, resourceURI); } else resource.put(entry.getKey(), entry.getValue()); From ac502a90d1a0c50ad7b70c29da3ed3f0eb4fd003 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cristiano=20Gavi=C3=A3o?= Date: Wed, 12 Apr 2017 12:20:32 -0300 Subject: [PATCH 3/5] modified toString() in order to facilitate the debug --- .../org/apache/felix/bundlerepository/impl/ResourceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/ResourceImpl.java b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/ResourceImpl.java index 554aea5e188..ab32e54efd2 100644 --- a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/ResourceImpl.java +++ b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/ResourceImpl.java @@ -310,6 +310,6 @@ private String resolveUri(String uri) public String toString() { - return getId(); + return (getId() == null || getId().isEmpty())?getSymbolicName():getId(); } } \ No newline at end of file From 8f6cac2b4c16cbd7b479babf62e51ee8828ffb92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cristiano=20Gavi=C3=A3o?= Date: Wed, 12 Apr 2017 12:22:20 -0300 Subject: [PATCH 4/5] Fixed issues with repository when using xml file --- .../felix/bundlerepository/impl/DataModelHelperImpl.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/DataModelHelperImpl.java b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/DataModelHelperImpl.java index 7d37f5e23ac..7d575b657e2 100644 --- a/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/DataModelHelperImpl.java +++ b/bundlerepository/src/main/java/org/apache/felix/bundlerepository/impl/DataModelHelperImpl.java @@ -135,10 +135,10 @@ else if (url.getPath().endsWith(".gz")) String repostr = url.toExternalForm(); if (repostr.endsWith("zip")) { repostr = "jar:".concat(repostr).concat("!/"); + } else if (repostr.endsWith(".xml")) { + repostr = repostr.substring(0, repostr.lastIndexOf('/')+1); } - RepositoryImpl repository = repository(is, repostr); - - return repository; + return repository(is, repostr); } else { From 1a0153179471d15b531d30fd090c8071ee265ecb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cristiano=20Gavi=C3=A3o?= Date: Wed, 12 Apr 2017 12:24:07 -0300 Subject: [PATCH 5/5] #FELIX-5611 - added test cases --- .../impl/OSGiRepositoryXMLTest.java | 126 +++++++++++++----- .../src/test/resources/spec_repository.zip | Bin 0 -> 4837 bytes 2 files changed, 94 insertions(+), 32 deletions(-) create mode 100644 bundlerepository/src/test/resources/spec_repository.zip diff --git a/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/OSGiRepositoryXMLTest.java b/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/OSGiRepositoryXMLTest.java index 631f0610b4e..1181649f4e3 100644 --- a/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/OSGiRepositoryXMLTest.java +++ b/bundlerepository/src/test/java/org/apache/felix/bundlerepository/impl/OSGiRepositoryXMLTest.java @@ -29,6 +29,7 @@ import junit.framework.TestCase; +import org.apache.felix.bundlerepository.Resolver; import org.apache.felix.utils.log.Logger; import org.mockito.Mockito; import org.osgi.framework.Bundle; @@ -42,30 +43,79 @@ import org.osgi.service.repository.ContentNamespace; import org.osgi.service.repository.Repository; -public class OSGiRepositoryXMLTest extends TestCase -{ - public void testIdentityCapability() throws Exception - { +public class OSGiRepositoryXMLTest extends TestCase { + public void testIdentityCapability() throws Exception { RepositoryAdminImpl repoAdmin = createRepositoryAdmin(); URL url = getClass().getResource("/spec_repository.xml"); repoAdmin.addRepository(url); Repository repo = new OSGiRepositoryImpl(repoAdmin); - Requirement req = new OSGiRequirementImpl("osgi.identity", "(osgi.identity=cdi-subsystem)"); + Requirement req = new OSGiRequirementImpl("osgi.identity", + "(osgi.identity=cdi-subsystem)"); - Map> result = repo.findProviders(Collections.singleton(req)); + Map> result = repo + .findProviders(Collections.singleton(req)); assertEquals(1, result.size()); Collection caps = result.values().iterator().next(); assertEquals(1, caps.size()); Capability cap = caps.iterator().next(); - assertEquals("cdi-subsystem", cap.getAttributes().get(IdentityNamespace.IDENTITY_NAMESPACE)); - assertEquals(Version.parseVersion("0.5.0"), cap.getAttributes().get(IdentityNamespace.CAPABILITY_VERSION_ATTRIBUTE)); - assertEquals("osgi.subsystem.feature", cap.getAttributes().get(IdentityNamespace.CAPABILITY_TYPE_ATTRIBUTE)); + assertEquals("cdi-subsystem", + cap.getAttributes().get(IdentityNamespace.IDENTITY_NAMESPACE)); + assertEquals(Version.parseVersion("0.5.0"), cap.getAttributes() + .get(IdentityNamespace.CAPABILITY_VERSION_ATTRIBUTE)); + assertEquals("osgi.subsystem.feature", cap.getAttributes() + .get(IdentityNamespace.CAPABILITY_TYPE_ATTRIBUTE)); + } + + public void testIdentityCapabilityWithRelativePath() throws Exception { + URL url = getClass().getResource("/spec_repository.xml"); + RepositoryAdminImpl repoAdmin = createRepositoryAdmin(); + repoAdmin.addRepository(url); + + Resolver resolver = repoAdmin.resolver(); + + org.apache.felix.bundlerepository.Resource[] discoverResources = repoAdmin + .discoverResources( + "(symbolicname=org.apache.felix.bundlerepository.test_file_6*)"); + assertNotNull(discoverResources); + assertEquals(1, discoverResources.length); + + resolver.add(discoverResources[0]); + assertTrue(resolver.resolve()); + + org.apache.felix.bundlerepository.Resource[] resources = resolver.getAddedResources(); + assertNotNull(resources[0]); + String repostr = url.toExternalForm().substring(0, url.toExternalForm().lastIndexOf('/')+1); + assertEquals(repostr+"repo_files/test_file_6.jar", resources[0].getURI()); + } - public void testOtherIdentityAttribute() throws Exception - { + public void testIdentityCapabilityForZipWithRelativePath() throws Exception { + URL url = getClass().getResource("/spec_repository.zip"); + RepositoryAdminImpl repoAdmin = createRepositoryAdmin(); + repoAdmin.addRepository(url); + + Resolver resolver = repoAdmin.resolver(); + + org.apache.felix.bundlerepository.Resource[] discoverResources = repoAdmin + .discoverResources( + "(symbolicname=org.apache.felix.bundlerepository.test_file_6*)"); + assertNotNull(discoverResources); + assertEquals(1, discoverResources.length); + + resolver.add(discoverResources[0]); + assertTrue(resolver.resolve()); + + org.apache.felix.bundlerepository.Resource[] resources = resolver.getAddedResources(); + assertNotNull(resources[0]); + String repostr = url.toExternalForm().substring(0, url.toExternalForm().lastIndexOf('/')+1); + assertEquals("jar:"+ repostr+"spec_repository.zip!/repo_files/test_file_6.jar", resources[0].getURI()); + + } + + + public void testOtherIdentityAttribute() throws Exception { RepositoryAdminImpl repoAdmin = createRepositoryAdmin(); URL url = getClass().getResource("/spec_repository.xml"); repoAdmin.addRepository(url); @@ -74,17 +124,17 @@ public void testOtherIdentityAttribute() throws Exception Requirement req = new OSGiRequirementImpl("osgi.identity", "(license=http://www.opensource.org/licenses/mytestlicense)"); - Map> result = repo.findProviders(Collections.singleton(req)); + Map> result = repo + .findProviders(Collections.singleton(req)); assertEquals(1, result.size()); Collection caps = result.values().iterator().next(); assertEquals(1, caps.size()); Capability cap = caps.iterator().next(); - assertEquals("org.apache.felix.bundlerepository.test_file_3", cap.getAttributes(). - get(IdentityNamespace.IDENTITY_NAMESPACE)); + assertEquals("org.apache.felix.bundlerepository.test_file_3", + cap.getAttributes().get(IdentityNamespace.IDENTITY_NAMESPACE)); } - public void testContentCapability() throws Exception - { + public void testContentCapability() throws Exception { RepositoryAdminImpl repoAdmin = createRepositoryAdmin(); URL url = getClass().getResource("/spec_repository.xml"); repoAdmin.addRepository(url); @@ -92,7 +142,8 @@ public void testContentCapability() throws Exception Repository repo = new OSGiRepositoryImpl(repoAdmin); Requirement req = new OSGiRequirementImpl("foo", "(bar=toast)"); - Map> result = repo.findProviders(Collections.singleton(req)); + Map> result = repo + .findProviders(Collections.singleton(req)); assertEquals(1, result.size()); Collection caps = result.values().iterator().next(); assertEquals(1, caps.size()); @@ -101,41 +152,53 @@ public void testContentCapability() throws Exception assertEquals("foo", cap.getNamespace()); assertEquals(0, cap.getDirectives().size()); assertEquals(1, cap.getAttributes().size()); - Entry fooCap = cap.getAttributes().entrySet().iterator().next(); + Entry fooCap = cap.getAttributes().entrySet().iterator() + .next(); assertEquals("bar", fooCap.getKey()); assertEquals("toast", fooCap.getValue()); Resource res = cap.getResource(); - List idCaps = res.getCapabilities(IdentityNamespace.IDENTITY_NAMESPACE); + List idCaps = res + .getCapabilities(IdentityNamespace.IDENTITY_NAMESPACE); assertEquals(1, idCaps.size()); Capability idCap = idCaps.iterator().next(); - assertEquals("org.apache.felix.bundlerepository.test_file_3", idCap.getAttributes().get(IdentityNamespace.IDENTITY_NAMESPACE)); - assertEquals(Version.parseVersion("1.2.3.something"), idCap.getAttributes().get(IdentityNamespace.CAPABILITY_VERSION_ATTRIBUTE)); - assertEquals("osgi.bundle", idCap.getAttributes().get(IdentityNamespace.CAPABILITY_TYPE_ATTRIBUTE)); + assertEquals("org.apache.felix.bundlerepository.test_file_3", idCap + .getAttributes().get(IdentityNamespace.IDENTITY_NAMESPACE)); + assertEquals(Version.parseVersion("1.2.3.something"), + idCap.getAttributes() + .get(IdentityNamespace.CAPABILITY_VERSION_ATTRIBUTE)); + assertEquals("osgi.bundle", idCap.getAttributes() + .get(IdentityNamespace.CAPABILITY_TYPE_ATTRIBUTE)); - List contentCaps = res.getCapabilities(ContentNamespace.CONTENT_NAMESPACE); + List contentCaps = res + .getCapabilities(ContentNamespace.CONTENT_NAMESPACE); assertEquals(1, contentCaps.size()); Capability contentCap = contentCaps.iterator().next(); - assertEquals("b5d4045c3f466fa91fe2cc6abe79232a1a57cdf104f7a26e716e0a1e2789df78", - contentCap.getAttributes().get(ContentNamespace.CONTENT_NAMESPACE)); - assertEquals(new Long(3), contentCap.getAttributes().get(ContentNamespace.CAPABILITY_SIZE_ATTRIBUTE)); - assertEquals("application/vnd.osgi.bundle", contentCap.getAttributes().get(ContentNamespace.CAPABILITY_MIME_ATTRIBUTE)); + assertEquals( + "b5d4045c3f466fa91fe2cc6abe79232a1a57cdf104f7a26e716e0a1e2789df78", + contentCap.getAttributes() + .get(ContentNamespace.CONTENT_NAMESPACE)); + assertEquals(new Long(3), contentCap.getAttributes() + .get(ContentNamespace.CAPABILITY_SIZE_ATTRIBUTE)); + assertEquals("application/vnd.osgi.bundle", contentCap.getAttributes() + .get(ContentNamespace.CAPABILITY_MIME_ATTRIBUTE)); URL fileURL = getClass().getResource("/repo_files/test_file_3.jar"); byte[] expectedBytes = Streams.suck(fileURL.openStream()); - String resourceURL = (String) contentCap.getAttributes().get(ContentNamespace.CAPABILITY_URL_ATTRIBUTE); + String resourceURL = (String) contentCap.getAttributes() + .get(ContentNamespace.CAPABILITY_URL_ATTRIBUTE); byte[] actualBytes = Streams.suck(new URL(resourceURL).openStream()); assertEquals(3L, actualBytes.length); assertTrue(Arrays.equals(expectedBytes, actualBytes)); } - private RepositoryAdminImpl createRepositoryAdmin() throws Exception - { + private RepositoryAdminImpl createRepositoryAdmin() throws Exception { Bundle sysBundle = Mockito.mock(Bundle.class); - Mockito.when(sysBundle.getHeaders()).thenReturn(new Hashtable()); + Mockito.when(sysBundle.getHeaders()) + .thenReturn(new Hashtable()); BundleRevision br = Mockito.mock(BundleRevision.class); Mockito.when(sysBundle.adapt(BundleRevision.class)).thenReturn(br); @@ -146,5 +209,4 @@ private RepositoryAdminImpl createRepositoryAdmin() throws Exception return new RepositoryAdminImpl(bc, new Logger(bc)); } - } diff --git a/bundlerepository/src/test/resources/spec_repository.zip b/bundlerepository/src/test/resources/spec_repository.zip new file mode 100644 index 0000000000000000000000000000000000000000..862f489403a4e98f3fd8993ac4f0192b7ead18de GIT binary patch literal 4837 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