]> git.argeo.org Git - gpl/argeo-slc.git/commitdiff
Introduce XSL URI Resolver
authorMathieu Baudier <mbaudier@argeo.org>
Thu, 3 Jul 2008 22:23:20 +0000 (22:23 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Thu, 3 Jul 2008 22:23:20 +0000 (22:23 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@1349 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/XsltMarshallerView.java
org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/XsltMarshallerViewResolver.java
org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/result/ResultViewController.java
org.argeo.slc.server/src/main/resources/org/argeo/slc/server/spring/slc-xslt-servlet.xml

index 127188b842a8caf112ea357dc6e18751d4c11eb4..bec44e8d1fd57663e0547ded8dce774950720385 100644 (file)
@@ -6,6 +6,9 @@ import javax.xml.transform.dom.DOMResult;
 import javax.xml.transform.dom.DOMSource;\r
 \r
 import org.argeo.slc.core.SlcException;\r
+import org.argeo.slc.core.process.SlcExecution;\r
+import org.argeo.slc.core.test.tree.TreeTestResult;\r
+import org.argeo.slc.core.test.tree.TreeTestResultCollection;\r
 import org.springframework.oxm.Marshaller;\r
 import org.springframework.web.servlet.view.xslt.XsltView;\r
 import org.w3c.dom.Document;\r
@@ -16,7 +19,8 @@ public class XsltMarshallerView extends XsltView {
 \r
        @Override\r
        protected Class<?>[] getSourceTypes() {\r
-               return new Class[] { Object.class };\r
+               return new Class[] { TreeTestResult.class,\r
+                               TreeTestResultCollection.class, SlcExecution.class };\r
        }\r
 \r
        @Override\r
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
index 4a2c974a6d202b8f0a1dc3df3c087e32ac5957e7..87445557107eef2bb38af84910df20a5af2612f5 100644 (file)
@@ -91,7 +91,7 @@ public class ResultViewController extends ParameterizableViewController {
 \r
        private static String describedPath(TreeSPath path, TreeTestResult ttr) {\r
                StringBuffer buf = new StringBuffer("");\r
-               // TODO :optimize with hierarichy\r
+               // TODO :optimize with hierarchy\r
                describedPath(path, buf, ttr);\r
                return buf.toString();\r
        }\r
index f4b2d98ecf20bbc151de8aa668054cd4edc59dfe..35afb02f61a12c2980f623317c3b293a5cbb3e34 100644 (file)
@@ -32,5 +32,4 @@
                <property name="marshaller" ref="slcDefault.castor.marshaller" />
        </bean>
 
-
 </beans>
\ No newline at end of file