1 package net.trajano.twiff.renderer;
2
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.util.Enumeration;
6 import java.util.Locale;
7 import javax.servlet.ServletException;
8 import javax.servlet.http.HttpServlet;
9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11 import javax.xml.transform.Transformer;
12 import javax.xml.transform.TransformerException;
13 import javax.xml.transform.sax.SAXResult;
14 import javax.xml.transform.sax.SAXTransformerFactory;
15 import javax.xml.transform.stream.StreamSource;
16 import org.apache.commons.lang.StringUtils;
17
18 /***
19 * @author Archimedes Trajano
20 */
21 public class XmlRenderer extends HttpServlet {
22 /***
23 * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest,
24 * javax.servlet.http.HttpServletResponse)
25 */
26 protected void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
27 InputStream inputStream = getInputStream(request);
28 if (inputStream == null) {
29 response.sendError(HttpServletResponse.SC_NOT_FOUND, request.getServletPath());
30 }
31 try {
32 final XmlRendererHandler handler = new XmlRendererHandler(response.getWriter());
33 final Transformer transformer = SAXTransformerFactory.newInstance().newTransformer();
34 final SAXResult result = new SAXResult();
35 result.setHandler(handler);
36 result.setLexicalHandler(handler);
37 final StreamSource streamSource = new StreamSource(inputStream);
38 transformer.transform(streamSource, result);
39 } catch (TransformerException e) {
40 throw new ServletException(e);
41 }
42 }
43
44 /***
45 * @param request
46 * @return input stream
47 */
48 private InputStream getInputStream(final HttpServletRequest request) {
49 HttpServletRequest httpServletRequest = (HttpServletRequest) request;
50 String servletPath = httpServletRequest.getServletPath();
51 String resource = servletPath.substring(0, servletPath.lastIndexOf('.'));
52 String extension = servletPath.substring(servletPath.lastIndexOf('.'));
53 for (Enumeration<Locale> locales = (Enumeration<Locale>) request.getLocales(); locales.hasMoreElements();) {
54 Locale locale = locales.nextElement();
55 StringBuffer buf = new StringBuffer(resource);
56 buf.append('_');
57 buf.append(locale.toString());
58 buf.append(extension);
59 final String path = buf.toString();
60 final InputStream resourceAsStream = getServletContext().getResourceAsStream(path);
61 if (resourceAsStream != null) {
62 return resourceAsStream;
63 }
64 }
65 for (Enumeration<Locale> locales = (Enumeration<Locale>) request.getLocales(); locales.hasMoreElements();) {
66 Locale locale = locales.nextElement();
67 if (StringUtils.isEmpty(locale.getCountry())) {
68 continue;
69 }
70 locale = new Locale(locale.getLanguage());
71 StringBuffer buf = new StringBuffer(resource);
72 buf.append('_');
73 buf.append(locale.toString());
74 buf.append(extension);
75 final String path = buf.toString();
76 final InputStream resourceAsStream = getServletContext().getResourceAsStream(path);
77 if (resourceAsStream != null) {
78 return resourceAsStream;
79 }
80 }
81 return getServletContext().getResourceAsStream(request.getServletPath());
82 }
83 }