[KARAF-3712] Make sure resource urls are absolute

Project: http://git-wip-us.apache.org/repos/asf/karaf-cave/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf-cave/commit/dc8ee600
Tree: http://git-wip-us.apache.org/repos/asf/karaf-cave/tree/dc8ee600
Diff: http://git-wip-us.apache.org/repos/asf/karaf-cave/diff/dc8ee600

Branch: refs/heads/master
Commit: dc8ee6009dade745c150d474a1b36d1ed885b680
Parents: 847a47f
Author: Guillaume Nodet <[email protected]>
Authored: Mon May 4 16:19:12 2015 +0200
Committer: Guillaume Nodet <[email protected]>
Committed: Mon May 4 16:19:12 2015 +0200

----------------------------------------------------------------------
 server/http/pom.xml                             |  8 ++
 .../karaf/cave/server/http/WrapperServlet.java  | 87 +++++++++++++++-----
 2 files changed, 76 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf-cave/blob/dc8ee600/server/http/pom.xml
----------------------------------------------------------------------
diff --git a/server/http/pom.xml b/server/http/pom.xml
index b248c56..cf15f87 100644
--- a/server/http/pom.xml
+++ b/server/http/pom.xml
@@ -49,6 +49,11 @@
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.core</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.karaf</groupId>
+            <artifactId>org.apache.karaf.util</artifactId>
+            <version>${karaf.version}</version>
+        </dependency>
     </dependencies>
 
     <build>
@@ -67,6 +72,9 @@
                             org.osgi.framework;version="[1,4)",
                             *
                         </Import-Package>
+                        <Private-Package>
+                            org.apache.karaf.util
+                        </Private-Package>
                         <Webapp-Context>/cave</Webapp-Context>
                         <Web-ContextPath>/cave</Web-ContextPath>
                     </instructions>

http://git-wip-us.apache.org/repos/asf/karaf-cave/blob/dc8ee600/server/http/src/main/java/org/apache/karaf/cave/server/http/WrapperServlet.java
----------------------------------------------------------------------
diff --git 
a/server/http/src/main/java/org/apache/karaf/cave/server/http/WrapperServlet.java
 
b/server/http/src/main/java/org/apache/karaf/cave/server/http/WrapperServlet.java
index 2fb8914..6b0428f 100644
--- 
a/server/http/src/main/java/org/apache/karaf/cave/server/http/WrapperServlet.java
+++ 
b/server/http/src/main/java/org/apache/karaf/cave/server/http/WrapperServlet.java
@@ -16,10 +16,13 @@
  */
 package org.apache.karaf.cave.server.http;
 
-import org.apache.karaf.cave.server.api.CaveRepository;
-import org.apache.karaf.cave.server.api.CaveRepositoryService;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.net.URI;
+import java.net.URL;
 
 import javax.servlet.ServletConfig;
 import javax.servlet.ServletContext;
@@ -27,11 +30,21 @@ import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.net.URL;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.apache.karaf.cave.server.api.CaveRepository;
+import org.apache.karaf.cave.server.api.CaveRepositoryService;
+import org.apache.karaf.util.XmlUtils;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.xml.sax.SAXException;
 
 /**
  * Wrapper servlet which "exposes" Karaf Cave repository resources in HTTP.
@@ -107,6 +120,10 @@ public class WrapperServlet extends HttpServlet {
                 }
                 url = caveRepository.getRepositoryXml();
                 response.setContentType("text/xml");
+                String repository = resolveRelativeUrls(url, 
request.getRequestURL().toString());
+                response.getOutputStream().print(repository);
+                response.getOutputStream().flush();
+                response.getOutputStream().close();
             } else {
                 for (CaveRepository repository : 
caveRepositoryService.getRepositories()) {
                     URL resourceUrl = repository.getResourceByUri(uri);
@@ -122,18 +139,18 @@ public class WrapperServlet extends HttpServlet {
                     throw new ServletException("No resource found with URI " + 
uri);
                 }
                 response.setContentType("application/java-archive");
-            }
 
-            // send the resource content to the HTTP response
-            InputStream inputStream = url.openStream();
-            OutputStream outputStream = response.getOutputStream();
-            int c;
-            while ((c = inputStream.read()) >= 0) {
-                outputStream.write(c);
+                // send the resource content to the HTTP response
+                InputStream inputStream = url.openStream();
+                OutputStream outputStream = response.getOutputStream();
+                int c;
+                while ((c = inputStream.read()) >= 0) {
+                    outputStream.write(c);
+                }
+                inputStream.close();
+                outputStream.flush();
+                outputStream.close();
             }
-            inputStream.close();
-            outputStream.flush();
-            outputStream.close();
 
         } catch (ServletException servletException) {
             throw servletException;
@@ -142,4 +159,36 @@ public class WrapperServlet extends HttpServlet {
         }
     }
 
+    private String resolveRelativeUrls(URL url, String baseUri) throws 
IOException, XMLStreamException, SAXException, ParserConfigurationException, 
TransformerException {
+        // Read
+        Document doc = XmlUtils.parse(url.toExternalForm());
+        // Transform
+        resolveUrls(doc, baseUri);
+        // Output
+        DOMSource src = new DOMSource(doc);
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        StreamResult res = new StreamResult(baos);
+        XmlUtils.transform(src, res);
+        return baos.toString();
+    }
+
+    private void resolveUrls(Node node, String baseUri) {
+        if (node != null) {
+            if (node instanceof Element &&
+                    node.getNodeName().equals("attribute")) {
+                String name = ((Element) node).getAttribute("name");
+                if ("url".equals(name)) {
+                    String value = ((Element) node).getAttribute("value");
+                    URI uri = URI.create(value);
+                    if (!uri.isAbsolute()) {
+                        uri = URI.create(baseUri).resolve(uri);
+                        ((Element) node).setAttribute("value", 
uri.toASCIIString());
+                    }
+                }
+            }
+            resolveUrls(node.getFirstChild(), baseUri);
+            resolveUrls(node.getNextSibling(), baseUri);
+        }
+    }
+
 }

Reply via email to