1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.cms.core.version;
35
36 import info.magnolia.jcr.wrapper.NodeWrappingDelegateSessionWrapper;
37
38 import java.io.IOException;
39 import java.io.OutputStream;
40
41 import javax.jcr.Item;
42 import javax.jcr.Node;
43 import javax.jcr.PathNotFoundException;
44 import javax.jcr.RepositoryException;
45 import javax.jcr.Session;
46
47 import org.apache.jackrabbit.commons.xml.DocumentViewExporter;
48 import org.apache.jackrabbit.commons.xml.Exporter;
49 import org.apache.jackrabbit.commons.xml.SystemViewExporter;
50 import org.apache.jackrabbit.commons.xml.ToXmlContentHandler;
51 import org.xml.sax.ContentHandler;
52 import org.xml.sax.SAXException;
53
54
55
56
57 public class MgnlVersioningSession extends NodeWrappingDelegateSessionWrapper {
58
59 public MgnlVersioningSession(Session wrapped) {
60 super(wrapped);
61 }
62
63 @Override
64 protected Node wrapNode(Node node) {
65 return new MgnlVersioningNodeWrapper(node);
66 }
67
68 @Override
69 public void exportSystemView(String absPath, ContentHandler contentHandler, boolean skipBinary, boolean noRecurse) throws PathNotFoundException, SAXException, RepositoryException {
70
71 if ("/".equals(absPath)) {
72 export(absPath, new SystemViewExporter(getWrappedSession(), contentHandler, !noRecurse, !skipBinary) {
73
74 @Override
75 protected void exportNode(String uri, String local, Node node) throws RepositoryException, SAXException {
76 if ("jcr:system".equals(node.getName())) {
77
78 return;
79 }
80 super.exportNode(uri, local, node);
81 }
82 });
83 } else {
84 getWrappedSession().exportSystemView(absPath, contentHandler, skipBinary, noRecurse);
85 }
86 }
87
88 @Override
89 public void exportSystemView(String absPath, OutputStream out, boolean skipBinary, boolean noRecurse) throws IOException, PathNotFoundException, RepositoryException {
90
91 if ("/".equals(absPath)) {
92 try {
93 this.exportSystemView(absPath, new ToXmlContentHandler(out), skipBinary, noRecurse);
94 } catch (SAXException e) {
95 Exception root = e.getException();
96 if (root instanceof RepositoryException) {
97 throw (RepositoryException) root;
98 } else if (root instanceof IOException) {
99 throw (IOException) root;
100 } else {
101 throw new RepositoryException("Error serializing system view XML", e);
102 }
103 }
104 } else {
105 getWrappedSession().exportSystemView(absPath, out, skipBinary, noRecurse);
106 }
107 }
108
109 @Override
110 public void exportDocumentView(String absPath, ContentHandler contentHandler, boolean skipBinary, boolean noRecurse) throws PathNotFoundException, SAXException, RepositoryException {
111
112 if ("/".equals(absPath)) {
113 export(absPath, new DocumentViewExporter(getWrappedSession(), contentHandler, !noRecurse, !skipBinary) {
114
115 @Override
116 protected void exportNode(String uri, String local, Node node) throws RepositoryException, SAXException {
117 if ("jcr:system".equals(node.getName())) {
118
119 return;
120 }
121 super.exportNode(uri, local, node);
122 }
123 });
124 } else {
125 getWrappedSession().exportDocumentView(absPath, contentHandler, skipBinary, noRecurse);
126 }
127 }
128
129 @Override
130 public void exportDocumentView(String absPath, OutputStream out, boolean skipBinary, boolean noRecurse) throws IOException, PathNotFoundException, RepositoryException {
131
132 if ("/".equals(absPath)) {
133 try {
134 this.exportDocumentView(absPath, new ToXmlContentHandler(out), skipBinary, noRecurse);
135 } catch (SAXException e) {
136 Exception root = e.getException();
137 if (root instanceof RepositoryException) {
138 throw (RepositoryException) root;
139 } else if (root instanceof IOException) {
140 throw (IOException) root;
141 } else {
142 throw new RepositoryException("Error serializing system view XML", e);
143 }
144 }
145 } else {
146 getWrappedSession().exportDocumentView(absPath, out, skipBinary, noRecurse);
147 }
148 }
149
150 private void export(String path, Exporter exporter) throws PathNotFoundException, SAXException, RepositoryException {
151 Item item = getItem(path);
152 if (item.isNode()) {
153 exporter.export((Node) item);
154 } else {
155 throw new PathNotFoundException("XML export is not defined for properties: " + path);
156 }
157 }
158
159 }