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
.Resource
;
16 import org
.springframework
.oxm
.Marshaller
;
17 import org
.springframework
.web
.servlet
.view
.AbstractUrlBasedView
;
18 import org
.springframework
.web
.servlet
.view
.xslt
.XsltViewResolver
;
20 public class XsltMarshallerViewResolver
extends XsltViewResolver
implements
22 private final static Log log
= LogFactory
23 .getLog(XsltMarshallerViewResolver
.class);
25 private Marshaller marshaller
;
26 private Map
<String
, Source
> cacheUriResolver
= new TreeMap
<String
, Source
>();
28 public XsltMarshallerViewResolver() {
33 protected AbstractUrlBasedView
buildView(String viewName
) throws Exception
{
34 AbstractUrlBasedView viewT
= super.buildView(viewName
);
35 XsltMarshallerView view
= (XsltMarshallerView
) viewT
;
36 view
.setMarshaller(marshaller
);
40 public void setMarshaller(Marshaller marshaller
) {
41 this.marshaller
= marshaller
;
45 public Source
resolve(String href
, String base
) throws TransformerException
{
46 if (log
.isTraceEnabled())
47 log
.trace("Resolve URI for href=" + href
+ " base=" + base
);
51 res
= cacheUriResolver
.get(href
);
54 res
= getStylesheetSource(href
);
57 res
= getStylesheetSource(getPrefix() + href
);
60 throw new SlcException("Can't resolve URI for href=" + href
63 if (isCache() && !cacheUriResolver
.containsKey(href
))
64 cacheUriResolver
.put(href
, res
);
69 protected Source
getStylesheetSource(String url
) {
70 if (log
.isDebugEnabled()) {
71 log
.debug("Loading XSLT stylesheet from '" + url
+ "'");
74 final Resource stylesheetResource
= getApplicationContext()
76 String systemId
= url
.substring(0, url
.lastIndexOf('/') + 1);
77 return new StreamSource(stylesheetResource
.getInputStream(),
79 } catch (IOException e
) {
80 if (log
.isTraceEnabled())
81 log
.trace("Cannot load stylesheet " + url
, e
);