]> git.argeo.org Git - gpl/argeo-slc.git/blobdiff - org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/XsltMarshallerViewResolver.java
Introduce XSL URI Resolver
[gpl/argeo-slc.git] / org.argeo.slc.server / src / main / java / org / argeo / slc / web / mvc / XsltMarshallerViewResolver.java
index 7fd5aa269a7c2ddc71ad4892f614c7dc53853b0b..13e2e8fedca1c5a679c287d8d4668e8946adbe8d 100644 (file)
@@ -1,12 +1,34 @@
 package org.argeo.slc.web.mvc;\r
 \r
+import java.io.IOException;\r
+import java.util.Map;\r
+import java.util.TreeMap;\r
+\r
+import javax.xml.transform.Source;\r
+import javax.xml.transform.TransformerException;\r
+import javax.xml.transform.URIResolver;\r
+import javax.xml.transform.stream.StreamSource;\r
+\r
+import org.apache.commons.logging.Log;\r
+import org.apache.commons.logging.LogFactory;\r
+import org.argeo.slc.core.SlcException;\r
+import org.springframework.core.io.DefaultResourceLoader;\r
+import org.springframework.core.io.Resource;\r
 import org.springframework.oxm.Marshaller;\r
 import org.springframework.web.servlet.view.AbstractUrlBasedView;\r
 import org.springframework.web.servlet.view.xslt.XsltViewResolver;\r
 \r
-public class XsltMarshallerViewResolver extends XsltViewResolver {\r
+public class XsltMarshallerViewResolver extends XsltViewResolver implements\r
+               URIResolver {\r
+       private final static Log log = LogFactory\r
+                       .getLog(XsltMarshallerViewResolver.class);\r
 \r
        private Marshaller marshaller;\r
+       private Map<String, Source> cacheUriResolver = new TreeMap<String, Source>();\r
+\r
+       public XsltMarshallerViewResolver() {\r
+               setUriResolver(this);\r
+       }\r
 \r
        @Override\r
        protected AbstractUrlBasedView buildView(String viewName) throws Exception {\r
@@ -20,4 +42,46 @@ public class XsltMarshallerViewResolver extends XsltViewResolver {
                this.marshaller = marshaller;\r
        }\r
 \r
+       @Override\r
+       public Source resolve(String href, String base) throws TransformerException {\r
+               if (log.isTraceEnabled())\r
+                       log.trace("Resolve URI for href=" + href + " base=" + base);\r
+\r
+               Source res = null;\r
+               if (isCache())\r
+                       res = cacheUriResolver.get(href);\r
+\r
+               if (res == null)\r
+                       res = getStylesheetSource(href);\r
+\r
+               if (res == null)\r
+                       res = getStylesheetSource(getPrefix() + href);\r
+\r
+               if (res == null)\r
+                       throw new SlcException("Can't resolve URI for href=" + href\r
+                                       + " base=" + base);\r
+\r
+               if (isCache() && !cacheUriResolver.containsKey(href))\r
+                       cacheUriResolver.put(href, res);\r
+\r
+               return res;\r
+       }\r
+\r
+       protected Source getStylesheetSource(String url) {\r
+               if (log.isDebugEnabled()) {\r
+                       log.debug("Loading XSLT stylesheet from '" + url + "'");\r
+               }\r
+               try {\r
+                       final Resource stylesheetResource = getApplicationContext()\r
+                                       .getResource(url);\r
+                       String systemId = url.substring(0, url.lastIndexOf('/') + 1);\r
+                       return new StreamSource(stylesheetResource.getInputStream(),\r
+                                       systemId);\r
+               } catch (IOException e) {\r
+                       if (log.isTraceEnabled())\r
+                               log.trace("Cannot load stylesheet " + url, e);\r
+                       return null;\r
+               }\r
+       }\r
+\r
 }\r