You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by gn...@apache.org on 2015/12/02 17:00:23 UTC
[2/2] karaf git commit: [KARAF-4152] Support resource relative urls
in xml repositories
[KARAF-4152] Support resource relative urls in xml repositories
Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/f2c944a4
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/f2c944a4
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/f2c944a4
Branch: refs/heads/master
Commit: f2c944a4eb784ad1dabdeaae25274d1c90f8684c
Parents: 1fe4d64
Author: Guillaume Nodet <gn...@apache.org>
Authored: Sat Nov 28 18:21:20 2015 +0100
Committer: Guillaume Nodet <gn...@apache.org>
Committed: Wed Dec 2 17:00:14 2015 +0100
----------------------------------------------------------------------
.../region/SubsystemResolveContext.java | 11 +-----
.../internal/repository/StaxParser.java | 37 +++++++++++++-------
.../features/internal/repository/UrlLoader.java | 4 +++
.../internal/repository/XmlRepository.java | 3 +-
.../internal/resolver/ResourceUtils.java | 35 ++----------------
5 files changed, 34 insertions(+), 56 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/karaf/blob/f2c944a4/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolveContext.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolveContext.java b/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolveContext.java
index c8547b9..b5432b9 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolveContext.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/region/SubsystemResolveContext.java
@@ -30,7 +30,6 @@ import java.util.Set;
import org.apache.karaf.features.FeaturesService;
import org.apache.karaf.features.internal.download.Downloader;
import org.apache.karaf.features.internal.repository.BaseRepository;
-import org.apache.karaf.features.internal.repository.XmlRepository;
import org.apache.karaf.features.internal.resolver.CapabilityImpl;
import org.apache.karaf.features.internal.resolver.RequirementImpl;
import org.apache.karaf.features.internal.resolver.ResolverUtil;
@@ -51,7 +50,6 @@ import org.osgi.service.resolver.HostedCapability;
import org.osgi.service.resolver.ResolveContext;
import static org.apache.karaf.features.internal.resolver.ResourceUtils.addIdentityRequirement;
-import static org.apache.karaf.features.internal.resolver.ResourceUtils.addRepoLocation;
import static org.apache.karaf.features.internal.resolver.ResourceUtils.getUri;
import static org.eclipse.equinox.region.RegionFilter.VISIBLE_BUNDLE_NAMESPACE;
import static org.osgi.framework.Constants.BUNDLE_SYMBOLICNAME_ATTRIBUTE;
@@ -373,14 +371,7 @@ public class SubsystemResolveContext extends ResolveContext {
}
addIdentityRequirement(wrapped, subsystem, false);
resToSub.put(wrapped, subsystem);
- // If the repository if of type XmlRepository, then it is our own internal format
- if (repository instanceof XmlRepository) {
- XmlRepository xmlRepository = (XmlRepository)repository;
- String url = xmlRepository.getUrl();
- String location = url.substring(0, url.lastIndexOf( "/" ) + 1);
- addRepoLocation( wrapped, location );
- }
- try {
+ try {
downloader.download(getUri(wrapped), null);
} catch (MalformedURLException e) {
throw new IllegalStateException("Unable to download resource: " + getUri(wrapped));
http://git-wip-us.apache.org/repos/asf/karaf/blob/f2c944a4/features/core/src/main/java/org/apache/karaf/features/internal/repository/StaxParser.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/repository/StaxParser.java b/features/core/src/main/java/org/apache/karaf/features/internal/repository/StaxParser.java
index 2811297..7d750ec 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/repository/StaxParser.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/repository/StaxParser.java
@@ -16,20 +16,19 @@
*/
package org.apache.karaf.features.internal.repository;
-import java.io.InputStream;
-import java.io.OutputStreamWriter;
-import java.io.Writer;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
import javax.xml.stream.Location;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.XMLStreamWriter;
+import java.io.InputStream;
+import java.io.Writer;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
import org.apache.felix.utils.version.VersionTable;
import org.apache.karaf.features.internal.resolver.CapabilityImpl;
@@ -39,6 +38,7 @@ import org.osgi.framework.Version;
import org.osgi.resource.Capability;
import org.osgi.resource.Requirement;
import org.osgi.resource.Resource;
+import org.osgi.service.repository.ContentNamespace;
import static javax.xml.stream.XMLStreamConstants.CHARACTERS;
import static javax.xml.stream.XMLStreamConstants.END_ELEMENT;
@@ -178,10 +178,14 @@ public final class StaxParser {
}
public static XmlRepository parse(InputStream is) throws XMLStreamException {
- return parse(is, null);
+ return parse(null, is, null);
}
- public static XmlRepository parse(InputStream is, XmlRepository previous) throws XMLStreamException {
+ public static XmlRepository parse(URI repositoryUrl, InputStream is) throws XMLStreamException {
+ return parse(repositoryUrl, is, null);
+ }
+
+ public static XmlRepository parse(URI repositoryUrl, InputStream is, XmlRepository previous) throws XMLStreamException {
XMLStreamReader reader = getInputFactory().createXMLStreamReader(is);
int event = reader.nextTag();
if (event != START_ELEMENT || !REPOSITORY.equals(reader.getLocalName())) {
@@ -231,7 +235,7 @@ public final class StaxParser {
sanityCheckEndElement(reader, reader.nextTag(), REFERRAL);
break;
case RESOURCE:
- repo.resources.add(parseResource(reader));
+ repo.resources.add(parseResource(repositoryUrl, reader));
break;
default:
throw new IllegalStateException("Unsupported element '" + element + "'. Expected 'referral' or 'resource'");
@@ -248,7 +252,7 @@ public final class StaxParser {
}
}
- private static ResourceImpl parseResource(XMLStreamReader reader) {
+ private static ResourceImpl parseResource(URI repositoryUrl, XMLStreamReader reader) {
try {
if (reader.getAttributeCount() > 0) {
throw new IllegalStateException("Unexpected attribute '" + reader.getAttributeLocalName(0) + "'");
@@ -259,6 +263,15 @@ public final class StaxParser {
String element = reader.getLocalName();
switch (element) {
case CAPABILITY:
+ CapabilityImpl cap = parseCapability(reader, resource);
+ // Resolve relative resource urls now
+ if (repositoryUrl != null && ContentNamespace.CONTENT_NAMESPACE.equals(cap.getNamespace())) {
+ Object url = cap.getAttributes().get(ContentNamespace.CAPABILITY_URL_ATTRIBUTE);
+ if (url instanceof String) {
+ url = repositoryUrl.resolve(url.toString()).toString();
+ cap.getAttributes().put(ContentNamespace.CAPABILITY_URL_ATTRIBUTE, url);
+ }
+ }
resource.addCapability(parseCapability(reader, resource));
break;
case REQUIREMENT:
http://git-wip-us.apache.org/repos/asf/karaf/blob/f2c944a4/features/core/src/main/java/org/apache/karaf/features/internal/repository/UrlLoader.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/repository/UrlLoader.java b/features/core/src/main/java/org/apache/karaf/features/internal/repository/UrlLoader.java
index a186915..ec0ab92 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/repository/UrlLoader.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/repository/UrlLoader.java
@@ -43,6 +43,10 @@ public abstract class UrlLoader {
this.expiration = expiration;
}
+ public String getUrl() {
+ return url;
+ }
+
protected boolean checkAndLoadCache() {
long time = System.currentTimeMillis();
if (lastChecked > 0) {
http://git-wip-us.apache.org/repos/asf/karaf/blob/f2c944a4/features/core/src/main/java/org/apache/karaf/features/internal/repository/XmlRepository.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/repository/XmlRepository.java b/features/core/src/main/java/org/apache/karaf/features/internal/repository/XmlRepository.java
index e6fadbb..5a178d3 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/repository/XmlRepository.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/repository/XmlRepository.java
@@ -18,6 +18,7 @@ package org.apache.karaf.features.internal.repository;
import java.io.IOException;
import java.io.InputStream;
+import java.net.URI;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
@@ -177,7 +178,7 @@ public class XmlRepository extends BaseRepository {
protected boolean doRead(InputStream is) throws IOException {
try {
StaxParser.XmlRepository oldXml = xml;
- xml = StaxParser.parse(is, oldXml);
+ xml = StaxParser.parse(URI.create(getUrl()), is, oldXml);
return oldXml != xml;
} catch (XMLStreamException e) {
throw new IOException("Unable to read xml repository", e);
http://git-wip-us.apache.org/repos/asf/karaf/blob/f2c944a4/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceUtils.java
----------------------------------------------------------------------
diff --git a/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceUtils.java b/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceUtils.java
index e6d7ea2..9dcbf5f 100644
--- a/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceUtils.java
+++ b/features/core/src/main/java/org/apache/karaf/features/internal/resolver/ResourceUtils.java
@@ -16,8 +16,6 @@
*/
package org.apache.karaf.features.internal.resolver;
-import java.net.MalformedURLException;
-import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -44,8 +42,6 @@ public final class ResourceUtils {
public static final String TYPE_FEATURE = "karaf.feature";
- public static final String REPO_NAMESPACE = "karaf.repo";
-
private ResourceUtils() {
}
@@ -59,42 +55,15 @@ public final class ResourceUtils {
return null;
}
- public static void addRepoLocation(ResourceImpl resource, String location)
- {
- Map<String, String> dirs = new HashMap<>();
- Map<String, Object> attrs = new HashMap<>();
- attrs.put(CAPABILITY_URL_ATTRIBUTE, location);
- CapabilityImpl capability = new CapabilityImpl( resource, REPO_NAMESPACE, dirs, attrs );
- resource.addCapability( capability );
- }
-
// TODO: Correct name should probably be toUrl
public static String getUri(Resource resource) {
List<Capability> caps = resource.getCapabilities(null);
- String location = null;
- String url = null;
for (Capability cap : caps) {
- if (cap.getNamespace().equals(REPO_NAMESPACE)) {
- location = cap.getAttributes().get(CAPABILITY_URL_ATTRIBUTE).toString();
- }
if (cap.getNamespace().equals(CONTENT_NAMESPACE)) {
- url = cap.getAttributes().get(CAPABILITY_URL_ATTRIBUTE).toString();
+ return cap.getAttributes().get(CAPABILITY_URL_ATTRIBUTE).toString();
}
}
-
- // If there is no location value, then just return the saved URL
- if (location == null) {
- return url;
- }
-
- // If the saved is absolute (i.e. well-formed), then return it
- try {
- new URL(url);
- return url;
- } catch (MalformedURLException e) {
- // The URL is relative, so return the absolute URL
- return location + url;
- }
+ return null;
}
public static String getFeatureId(Resource resource) {