1 package org
.argeo
.server
.jcr
.mvc
;
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
;
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
;
22 public class JcrXmlServerSerializer
implements ServerSerializer
{
23 private String contentTypeCharset
= "UTF-8";
25 private final DocumentBuilderFactory documentBuilderFactory
= DocumentBuilderFactory
27 private final TransformerFactory transformerFactory
= TransformerFactory
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");
35 String noRecurseStr
= request
.getParameter("noRecurse");
36 boolean noRecurse
= noRecurseStr
!= null && noRecurseStr
.equals("true");
38 String depthStr
= request
.getParameter("depth");
39 Node node
= (Node
) obj
;
41 if (depthStr
== null) {
42 response
.setContentType("text/xml;charset="
43 + contentTypeCharset
);
44 node
.getSession().exportDocumentView(node
.getPath(),
45 response
.getOutputStream(), true, noRecurse
);
47 int depth
= Integer
.parseInt(depthStr
);
48 Document document
= documentBuilderFactory
.newDocumentBuilder()
50 serializeLevelToDom(node
, document
, 0, depth
);
51 Transformer transformer
= transformerFactory
.newTransformer();
52 transformer
.transform(new DOMSource(document
),
53 new StreamResult(response
.getOutputStream()));
55 } catch (Exception e
) {
56 throw new ArgeoException("Cannot serialize " + node
, e
);
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(
65 currentJcrNode
.getSession().exportDocumentView(
66 currentJcrNode
.getPath(), domContentHandler
, true, true);
68 if (currentDepth
== targetDepth
)
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();
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);
89 serializeLevelToDom(nextJcrNode
, nextDomNode
, currentDepth
+ 1,
94 public void setContentTypeCharset(String contentTypeCharset
) {
95 this.contentTypeCharset
= contentTypeCharset
;