]> git.argeo.org Git - gpl/argeo-slc.git/blob - runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/web/mvc/XsltMarshallerViewResolver.java
Move org.argeo.slc.server
[gpl/argeo-slc.git] / runtime / 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 public Source resolve(String href, String base) throws TransformerException {
45 if (log.isTraceEnabled())
46 log.trace("Resolve URI for href=" + href + " base=" + base);
47
48 Source res = null;
49 if (isCache())
50 res = cacheUriResolver.get(href);
51
52 if (res == null)
53 res = getStylesheetSource(href);
54
55 if (res == null)
56 res = getStylesheetSource(getPrefix() + href);
57
58 if (res == null)
59 throw new SlcException("Can't resolve URI for href=" + href
60 + " base=" + base);
61
62 if (isCache() && !cacheUriResolver.containsKey(href))
63 cacheUriResolver.put(href, res);
64
65 return res;
66 }
67
68 protected Source getStylesheetSource(String url) {
69 if (log.isDebugEnabled()) {
70 log.debug("Loading XSLT stylesheet from '" + url + "'");
71 }
72 try {
73 final Resource stylesheetResource = getApplicationContext()
74 .getResource(url);
75 String systemId = url.substring(0, url.lastIndexOf('/') + 1);
76 return new StreamSource(stylesheetResource.getInputStream(),
77 systemId);
78 } catch (IOException e) {
79 if (log.isTraceEnabled())
80 log.trace("Cannot load stylesheet " + url, e);
81 return null;
82 }
83 }
84
85 }