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) {