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