1 package org
.argeo
.slc
.web
.mvc
;
3 import java
.io
.IOException
;
5 import java
.util
.TreeMap
;
7 import javax
.xml
.transform
.Source
;
8 import javax
.xml
.transform
.TransformerException
;
9 import javax
.xml
.transform
.URIResolver
;
10 import javax
.xml
.transform
.stream
.StreamSource
;
12 import org
.apache
.commons
.logging
.Log
;
13 import org
.apache
.commons
.logging
.LogFactory
;
14 import org
.argeo
.slc
.core
.SlcException
;
15 import org
.springframework
.core
.io
.DefaultResourceLoader
;
16 import org
.springframework
.core
.io
.Resource
;
17 import org
.springframework
.oxm
.Marshaller
;
18 import org
.springframework
.web
.servlet
.view
.AbstractUrlBasedView
;
19 import org
.springframework
.web
.servlet
.view
.xslt
.XsltViewResolver
;
21 public class XsltMarshallerViewResolver
extends XsltViewResolver
implements
23 private final static Log log
= LogFactory
24 .getLog(XsltMarshallerViewResolver
.class);
26 private Marshaller marshaller
;
27 private Map
<String
, Source
> cacheUriResolver
= new TreeMap
<String
, Source
>();
29 public XsltMarshallerViewResolver() {
34 protected AbstractUrlBasedView
buildView(String viewName
) throws Exception
{
35 AbstractUrlBasedView viewT
= super.buildView(viewName
);
36 XsltMarshallerView view
= (XsltMarshallerView
) viewT
;
37 view
.setMarshaller(marshaller
);
41 public void setMarshaller(Marshaller marshaller
) {
42 this.marshaller
= marshaller
;
46 public Source
resolve(String href
, String base
) throws TransformerException
{
47 if (log
.isTraceEnabled())
48 log
.trace("Resolve URI for href=" + href
+ " base=" + base
);
52 res
= cacheUriResolver
.get(href
);
55 res
= getStylesheetSource(href
);
58 res
= getStylesheetSource(getPrefix() + href
);
61 throw new SlcException("Can't resolve URI for href=" + href
64 if (isCache() && !cacheUriResolver
.containsKey(href
))
65 cacheUriResolver
.put(href
, res
);
70 protected Source
getStylesheetSource(String url
) {
71 if (log
.isDebugEnabled()) {
72 log
.debug("Loading XSLT stylesheet from '" + url
+ "'");
75 final Resource stylesheetResource
= getApplicationContext()
77 String systemId
= url
.substring(0, url
.lastIndexOf('/') + 1);
78 return new StreamSource(stylesheetResource
.getInputStream(),
80 } catch (IOException e
) {
81 if (log
.isTraceEnabled())
82 log
.trace("Cannot load stylesheet " + url
, e
);