]> git.argeo.org Git - gpl/argeo-slc.git/blob - cms/org.argeo.cms.integration/src/org/argeo/cms/integration/JcrWriteServlet.java
Merge remote-tracking branch 'origin/unstable' into testing
[gpl/argeo-slc.git] / cms / org.argeo.cms.integration / src / org / argeo / cms / integration / JcrWriteServlet.java
1 package org.argeo.cms.integration;
2
3 import java.io.IOException;
4
5 import javax.jcr.ImportUUIDBehavior;
6 import javax.jcr.Node;
7 import javax.jcr.Session;
8 import javax.jcr.nodetype.NodeType;
9 import javax.servlet.ServletException;
10 import javax.servlet.http.HttpServletRequest;
11 import javax.servlet.http.HttpServletResponse;
12
13 import org.apache.commons.io.FilenameUtils;
14 import org.apache.commons.io.IOUtils;
15 import org.argeo.api.cms.CmsLog;
16 import org.argeo.jcr.JcrUtils;
17
18 /** Access a JCR repository via web services. */
19 public class JcrWriteServlet extends JcrReadServlet {
20 private static final long serialVersionUID = 17272653843085492L;
21 private final static CmsLog log = CmsLog.getLog(JcrWriteServlet.class);
22
23 @Override
24 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
25 if (log.isDebugEnabled())
26 log.debug("Data service POST: " + req.getPathInfo());
27
28 String dataWorkspace = getWorkspace(req);
29 String jcrPath = getJcrPath(req);
30
31 Session session = null;
32 try {
33 // authentication
34 session = openJcrSession(req, resp, getRepository(), dataWorkspace);
35
36 if (req.getContentType() != null && req.getContentType().equals(XML_CONTENT_TYPE)) {
37 // resp.setContentType(XML_CONTENT_TYPE);
38 session.getWorkspace().importXML(jcrPath, req.getInputStream(),
39 ImportUUIDBehavior.IMPORT_UUID_COLLISION_REMOVE_EXISTING);
40 return;
41 }
42
43 if (!session.itemExists(jcrPath)) {
44 String parentPath = FilenameUtils.getFullPathNoEndSeparator(jcrPath);
45 String fileName = FilenameUtils.getName(jcrPath);
46 Node folderNode = JcrUtils.mkfolders(session, parentPath);
47 byte[] bytes = IOUtils.toByteArray(req.getInputStream());
48 JcrUtils.copyBytesAsFile(folderNode, fileName, bytes);
49 } else {
50 Node node = session.getNode(jcrPath);
51 if (!node.isNodeType(NodeType.NT_FILE))
52 throw new IllegalArgumentException("Node " + jcrPath + " exists but is not a file");
53 byte[] bytes = IOUtils.toByteArray(req.getInputStream());
54 JcrUtils.copyBytesAsFile(node.getParent(), node.getName(), bytes);
55 }
56 session.save();
57 } catch (Exception e) {
58 new CmsExceptionsChain(e).writeAsJson(getObjectMapper(), resp);
59 } finally {
60 JcrUtils.logoutQuietly(session);
61 }
62 }
63
64 @Override
65 protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
66 if (log.isDebugEnabled())
67 log.debug("Data service DELETE: " + req.getPathInfo());
68
69 String dataWorkspace = getWorkspace(req);
70 String jcrPath = getJcrPath(req);
71
72 Session session = null;
73 try {
74 // authentication
75 session = openJcrSession(req, resp, getRepository(), dataWorkspace);
76 if (!session.itemExists(jcrPath)) {
77 // ignore
78 return;
79 } else {
80 Node node = session.getNode(jcrPath);
81 node.remove();
82 }
83 session.save();
84 } catch (Exception e) {
85 new CmsExceptionsChain(e).writeAsJson(getObjectMapper(), resp);
86 } finally {
87 JcrUtils.logoutQuietly(session);
88 }
89 }
90
91 }