]> git.argeo.org Git - lgpl/argeo-commons.git/blob - mvc/JcrXmlServerSerializer.java
Prepare next development cycle
[lgpl/argeo-commons.git] / mvc / JcrXmlServerSerializer.java
1 package org.argeo.server.jcr.mvc;
2
3 import javax.jcr.Node;
4 import javax.jcr.NodeIterator;
5 import javax.jcr.RepositoryException;
6 import javax.servlet.http.HttpServletRequest;
7 import javax.servlet.http.HttpServletResponse;
8 import javax.xml.parsers.DocumentBuilderFactory;
9 import javax.xml.transform.Transformer;
10 import javax.xml.transform.TransformerFactory;
11 import javax.xml.transform.dom.DOMSource;
12 import javax.xml.transform.stream.StreamResult;
13
14 import org.argeo.ArgeoException;
15 import org.argeo.server.ServerSerializer;
16 import org.springframework.xml.dom.DomContentHandler;
17 import org.w3c.dom.Document;
18 import org.w3c.dom.Element;
19 import org.w3c.dom.NodeList;
20 import org.xml.sax.SAXException;
21
22 public class JcrXmlServerSerializer implements ServerSerializer {
23 private String contentTypeCharset = "UTF-8";
24
25 private final DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory
26 .newInstance();
27 private final TransformerFactory transformerFactory = TransformerFactory
28 .newInstance();
29
30 public void serialize(Object obj, HttpServletRequest request,
31 HttpServletResponse response) {
32 if (!(obj instanceof Node))
33 throw new ArgeoException("Only " + Node.class + " is supported");
34
35 String noRecurseStr = request.getParameter("noRecurse");
36 boolean noRecurse = noRecurseStr != null && noRecurseStr.equals("true");
37
38 String depthStr = request.getParameter("depth");
39 Node node = (Node) obj;
40 try {
41 if (depthStr == null) {
42 response.setContentType("text/xml;charset="
43 + contentTypeCharset);
44 node.getSession().exportDocumentView(node.getPath(),
45 response.getOutputStream(), true, noRecurse);
46 } else {
47 int depth = Integer.parseInt(depthStr);
48 Document document = documentBuilderFactory.newDocumentBuilder()
49 .newDocument();
50 serializeLevelToDom(node, document, 0, depth);
51 Transformer transformer = transformerFactory.newTransformer();
52 transformer.transform(new DOMSource(document),
53 new StreamResult(response.getOutputStream()));
54 }
55 } catch (Exception e) {
56 throw new ArgeoException("Cannot serialize " + node, e);
57 }
58 }
59
60 protected void serializeLevelToDom(Node currentJcrNode,
61 org.w3c.dom.Node currentDomNode, int currentDepth, int targetDepth)
62 throws RepositoryException, SAXException {
63 DomContentHandler domContentHandler = new DomContentHandler(
64 currentDomNode);
65 currentJcrNode.getSession().exportDocumentView(
66 currentJcrNode.getPath(), domContentHandler, true, true);
67
68 if (currentDepth == targetDepth)
69 return;
70
71 // TODO: filter
72 NodeIterator nit = currentJcrNode.getNodes();
73 while (nit.hasNext()) {
74 Node nextJcrNode = nit.nextNode();
75 org.w3c.dom.Node nextDomNode;
76 if (currentDomNode instanceof Document)
77 nextDomNode = ((Document) currentDomNode).getDocumentElement();
78 else {
79 String name = currentJcrNode.getName();
80 NodeList nodeList = ((Element) currentDomNode)
81 .getElementsByTagName(name);
82 if (nodeList.getLength() < 1)
83 throw new ArgeoException("No elment named " + name
84 + " under " + currentDomNode);
85 // we know it is the last one added
86 nextDomNode = nodeList.item(nodeList.getLength() - 1);
87 }
88 // recursive call
89 serializeLevelToDom(nextJcrNode, nextDomNode, currentDepth + 1,
90 targetDepth);
91 }
92 }
93
94 public void setContentTypeCharset(String contentTypeCharset) {
95 this.contentTypeCharset = contentTypeCharset;
96 }
97
98 }