KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > contineo > actions > rest > CreateFolderOrDocRESTAction


1 /* License: GNU General Public License (GPL) version 2 from June 1991; but not any newer version!
2  */

3 package org.contineo.actions.rest;
4
5 import java.io.File JavaDoc;
6 import java.io.IOException JavaDoc;
7 import java.io.InputStream JavaDoc;
8 import java.io.PrintWriter JavaDoc;
9 import java.util.Iterator JavaDoc;
10 import java.util.List JavaDoc;
11
12 import javax.servlet.http.HttpServletRequest JavaDoc;
13 import javax.servlet.http.HttpServletResponse JavaDoc;
14 import javax.xml.parsers.ParserConfigurationException JavaDoc;
15 import javax.xml.transform.TransformerConfigurationException JavaDoc;
16 import javax.xml.transform.TransformerException JavaDoc;
17
18 import org.apache.commons.fileupload.FileItem;
19 import org.apache.commons.fileupload.FileItemFactory;
20 import org.apache.commons.fileupload.FileUploadException;
21 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
22 import org.apache.commons.fileupload.servlet.ServletFileUpload;
23 import org.contineo.admin.Menu;
24 import org.contineo.admin.dao.MenuDAO;
25 import org.contineo.apis.rest.HttpStatusCodes;
26 import org.contineo.core.FileBean;
27 import org.contineo.core.XMLBean;
28 import org.contineo.core.config.SettingConfigurator;
29 import org.contineo.documan.CheckinDocUtil;
30 import org.jdom.Element;
31 import org.w3c.dom.Document JavaDoc;
32
33 /**
34  * answers a PUT request to a folder by creating a new sub-folder with the provided folder name
35  * @author Sebastian Stein
36  */

37 public class CreateFolderOrDocRESTAction extends RESTAction {
38
39     private final HttpServletRequest JavaDoc request;
40     private String JavaDoc folderName = null;
41     private int parentMenuId;
42     private InputStream JavaDoc xmlInfoFile = null;
43     private InputStream JavaDoc newDocument = null;
44     private String JavaDoc newDocName;
45     private Menu newFolder = null;
46     private boolean createFolder;
47
48     /** constructor sets some initial values and calls the processing of the request */
49     public CreateFolderOrDocRESTAction(HttpServletResponse JavaDoc p_response, String JavaDoc p_userName, String JavaDoc requestedRESTUrl, int p_menuId,
50             HttpServletRequest JavaDoc p_request) {
51         super("put-folder-doc.xsd", requestedRESTUrl, p_userName, p_response,
52                 "PUT REST/folder/XX: create folder/doc in XX");
53         request = p_request;
54         parentMenuId = p_menuId;
55
56         processRequest();
57     }
58
59     @Override JavaDoc
60     protected void processRequest() {
61         // check if we can find the folder
62
MenuDAO menuDao = new MenuDAO();
63         Menu parentMenu = menuDao.findByPrimaryKey(parentMenuId);
64         if (parentMenu == null) {
65             setHttpStatusCode(HttpStatusCodes.NOT_FOUND);
66             return;
67         }
68         
69         // check, if the user has write access to the menu
70
if (!menuDao.isWriteEnable(parentMenuId, userName)) {
71             setHttpStatusCode(HttpStatusCodes.FORBIDDEN);
72             return;
73         }
74                     
75         // get the file in the received message:
76
// - file is an XML file describing the new version (put-folder.xsd)
77
if (extractUploadedFiles() == false) {
78             setHttpStatusCode(HttpStatusCodes.BAD_REQUEST);
79             return;
80         }
81
82         // now read the XML file to get the needed data for the new version
83
if (parseXMLFile() != true) {
84             setHttpStatusCode(HttpStatusCodes.BAD_REQUEST);
85             return;
86         }
87         
88         try {
89             if (createFolder == true) {
90                 // try to create the new folder
91
newFolder = CheckinDocUtil.createFolder(parentMenu, folderName);
92             } else {
93                 // create new document
94
// first we have to copy the new document to a temporary file
95
SettingConfigurator settings = new SettingConfigurator();
96                 String JavaDoc path = settings.getValue("userdir");
97                 if (!path.endsWith("/"))
98                     path += "/";
99                 path += userName + "/";
100                 FileBean.createDir(path);
101                 FileBean.writeFile(newDocument, path + newDocName);
102                 File JavaDoc file = new File JavaDoc(path + newDocName);
103                 newFolder = CheckinDocUtil.createDocument(file, parentMenu, userName);
104             }
105             if (newFolder == null)
106                 throw new Exception JavaDoc();
107         } catch (Exception JavaDoc ex) {
108             setHttpStatusCode(HttpStatusCodes.INTERNAL_SERVER_ERROR);
109             addLogMessage("Unable to create new folder with the name " + folderName + " in menu " + parentMenuId + ".");
110             return;
111         }
112         
113         // finally create the answer for the client so that the client knows the new menu id
114
if (createXMLAnswer() == false) {
115             setHttpStatusCode(HttpStatusCodes.INTERNAL_SERVER_ERROR);
116             addLogMessage("Folder/Document was created, but problems while sending the XML answer to client.");
117             return;
118         }
119         
120         // success
121
setHttpStatusCode(HttpStatusCodes.CREATED);
122         return;
123     }
124     
125     /**
126      * parses the received XML file and extracts all necessary information
127      * @return true, if the XML file contained all necessary information
128      */

129     private boolean parseXMLFile() {
130         try {
131             // get root element
132
XMLBean xmlBean = new XMLBean(xmlInfoFile);
133             Element root = xmlBean.getChild("folderInfo");
134
135             // determines if a document or folder should be created
136
Element booleanElement = root.getChild("createFolder");
137             createFolder = new Boolean JavaDoc(xmlBean.getText(booleanElement));
138             
139             // this is the name of the new folder
140
Element nameElement = root.getChild("name");
141             folderName = xmlBean.getText(nameElement);
142         } catch (Exception JavaDoc ex) {
143             return false;
144         }
145         
146         return true;
147     }
148
149     /**
150      * creates the XML document containing the menu content
151      * @return true, if successful; on any errors false
152      */

153     private boolean createXMLAnswer() {
154         PrintWriter JavaDoc responseWriter;
155         try {
156             responseWriter = response.getWriter();
157         } catch (IOException JavaDoc e) {
158             setHttpStatusCode(HttpStatusCodes.INTERNAL_SERVER_ERROR);
159             addLogMessage("Unable to get output object for sending XML answer to client: " + e.getMessage());
160             return false;
161         }
162         
163         // set correct content type
164
response.setContentType("text/xml;charset=utf-8");
165         boolean ret = true;
166        
167         try {
168             // create XML document
169
Document JavaDoc xmlDoc = createXMLDocument();
170             
171             // root element
172
org.w3c.dom.Element JavaDoc rootElement = createRootElement(xmlDoc, "createFolderData", "folder", "post-folder.xsd");
173
174             // write the data of the folder
175
int menuId = newFolder.getMenuId();
176             org.w3c.dom.Element JavaDoc folderElement = createChildElement(xmlDoc, "folderInfo", rootElement, "");
177             createTextNodeElement(xmlDoc, "createFolder", folderElement, createFolder);
178             createTextNodeElement(xmlDoc, "name", folderElement, folderName);
179             createTextNodeElement(xmlDoc, "id", folderElement, menuId);
180             
181             // <url>http://localhost:8080/contineo/rest/folder/30</url>
182
createTextNodeElement(xmlDoc, "url", folderElement, localRESTUrl + "folder/" + menuId);
183
184             // <metadataURL>http://localhost:8080/contineo/rest/document/31/meta</metadataURL>
185
if (createFolder == false) {
186                 createTextNodeElement(xmlDoc, "metadataURL", folderElement, localRESTUrl +
187                                       "document/" + menuId + "/meta");
188             }
189
190             // transform and write XML document
191
writeXMLDocument(xmlDoc, responseWriter);
192         } catch (ParserConfigurationException JavaDoc e) {
193             setHttpStatusCode(HttpStatusCodes.INTERNAL_SERVER_ERROR);
194             addLogMessage("While trying to create XML answer a ParserConfigurationException occured: " + e.getMessage());
195             ret = false;
196         } catch (TransformerConfigurationException JavaDoc e) {
197             setHttpStatusCode(HttpStatusCodes.INTERNAL_SERVER_ERROR);
198             addLogMessage("While trying to create XML answer a TransformerConfigurationException occured: " + e.getMessage());
199             ret = false;
200         } catch (TransformerException JavaDoc e) {
201             setHttpStatusCode(HttpStatusCodes.INTERNAL_SERVER_ERROR);
202             addLogMessage("While trying to create XML answer a TransformerException occured: " + e.getMessage());
203             ret = false;
204         } finally {
205             // finally write content to the response and close output stream
206
responseWriter.flush();
207             responseWriter.close();
208         }
209         
210         return ret;
211     }
212
213     /**
214      * extracts the XML file from the multipart message; there might
215      * also be a document, if the client requests to create a document
216      * @return true, if the file(s) could successfully be extracted from the request
217      */

218     private boolean extractUploadedFiles() {
219         FileItemFactory factory = new DiskFileItemFactory();
220         ServletFileUpload upload = new ServletFileUpload(factory);
221         List JavaDoc items = null;
222         
223         try {
224             items = upload.parseRequest(request);
225         } catch (FileUploadException e) {
226             return false;
227         }
228
229         // it is not sure yet, if we will receive 1 or 2 files, because
230
// we don't know yet if just a folder is created or a document
231
if (items.size() > 2)
232             return false;
233         
234         Iterator JavaDoc iter = items.iterator();
235         while (iter.hasNext()) {
236             FileItem fileItem = (FileItem) iter.next();
237             if (fileItem.isFormField()) {
238                 // there should be no form fields in the request
239
return false;
240             } else {
241                 try {
242                     if (fileItem.getFieldName().equals("contineoCheckInInfo.xml") && xmlInfoFile == null) {
243                         xmlInfoFile = fileItem.getInputStream();
244                     } else if (newDocument == null) {
245                         newDocument = fileItem.getInputStream();
246                         newDocName = fileItem.getFieldName();
247                     } else {
248                         // if we get here, the message received is invalid
249
return false;
250                     }
251                 } catch (IOException JavaDoc e) {
252                     return false;
253                 }
254             }
255         }
256         
257         // just to make sure, another check
258
if (xmlInfoFile == null)
259             return false;
260         else
261             return true;
262     }
263 }
Popular Tags