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