]> git.argeo.org Git - gpl/argeo-slc.git/blob - org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/XsltMarshallerViewResolver.java
13e2e8fedca1c5a679c287d8d4668e8946adbe8d
[gpl/argeo-slc.git] / org.argeo.slc.server / src / main / java / org / argeo / slc / web / mvc / XsltMarshallerViewResolver.java
1 package org.argeo.slc.web.mvc;
2
3 import java.io.IOException;
4 import java.util.Map;
5 import java.util.TreeMap;
6
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;
11
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;
20
21 public class XsltMarshallerViewResolver extends XsltViewResolver implements
22 URIResolver {
23 private final static Log log = LogFactory
24 .getLog(XsltMarshallerViewResolver.class);
25
26 private Marshaller marshaller;
27 private Map<String, Source> cacheUriResolver = new TreeMap<String, Source>();
28
29 public XsltMarshallerViewResolver() {
30 setUriResolver(this);
31 }
32
33 @Override
34 protected AbstractUrlBasedView buildView(String viewName) throws Exception {
35 AbstractUrlBasedView viewT = super.buildView(viewName);
36 XsltMarshallerView view = (XsltMarshallerView) viewT;
37 view.setMarshaller(marshaller);
38 return view;
39 }
40
41 public void setMarshaller(Marshaller marshaller) {
42 this.marshaller = marshaller;
43 }
44
45 @Override
46 public Source resolve(String href, String base) throws TransformerException {
47 if (log.isTraceEnabled())
48 log.trace("Resolve URI for href=" + href + " base=" + base);
49
50 Source res = null;
51 if (isCache())
52 res = cacheUriResolver.get(href);
53
54 if (res == null)
55 res = getStylesheetSource(href);
56
57 if (res == null)
58 res = getStylesheetSource(getPrefix() + href);
59
60 if (res == null)
61 throw new SlcException("Can't resolve URI for href=" + href
62 + " base=" + base);
63
64 if (isCache() && !cacheUriResolver.containsKey(href))
65 cacheUriResolver.put(href, res);
66
67 return res;
68 }
69
70 protected Source getStylesheetSource(String url) {
71 if (log.isDebugEnabled()) {
72 log.debug("Loading XSLT stylesheet from '" + url + "'");
73 }
74 try {
75 final Resource stylesheetResource = getApplicationContext()
76 .getResource(url);
77 String systemId = url.substring(0, url.lastIndexOf('/') + 1);
78 return new StreamSource(stylesheetResource.getInputStream(),
79 systemId);
80 } catch (IOException e) {
81 if (log.isTraceEnabled())
82 log.trace("Cannot load stylesheet " + url, e);
83 return null;
84 }
85 }
86
87 }