1 3 package org.contineo.actions.rest; 4 5 import java.io.File ; 6 import java.io.IOException ; 7 import java.io.InputStream ; 8 import java.io.PrintWriter ; 9 import java.util.Iterator ; 10 import java.util.List ; 11 12 import javax.servlet.http.HttpServletRequest ; 13 import javax.servlet.http.HttpServletResponse ; 14 import javax.xml.parsers.ParserConfigurationException ; 15 import javax.xml.transform.TransformerConfigurationException ; 16 import javax.xml.transform.TransformerException ; 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 ; 32 33 37 public class CreateFolderOrDocRESTAction extends RESTAction { 38 39 private final HttpServletRequest request; 40 private String folderName = null; 41 private int parentMenuId; 42 private InputStream xmlInfoFile = null; 43 private InputStream newDocument = null; 44 private String newDocName; 45 private Menu newFolder = null; 46 private boolean createFolder; 47 48 49 public CreateFolderOrDocRESTAction(HttpServletResponse p_response, String p_userName, String requestedRESTUrl, int p_menuId, 50 HttpServletRequest 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 60 protected void processRequest() { 61 MenuDAO menuDao = new MenuDAO(); 63 Menu parentMenu = menuDao.findByPrimaryKey(parentMenuId); 64 if (parentMenu == null) { 65 setHttpStatusCode(HttpStatusCodes.NOT_FOUND); 66 return; 67 } 68 69 if (!menuDao.isWriteEnable(parentMenuId, userName)) { 71 setHttpStatusCode(HttpStatusCodes.FORBIDDEN); 72 return; 73 } 74 75 if (extractUploadedFiles() == false) { 78 setHttpStatusCode(HttpStatusCodes.BAD_REQUEST); 79 return; 80 } 81 82 if (parseXMLFile() != true) { 84 setHttpStatusCode(HttpStatusCodes.BAD_REQUEST); 85 return; 86 } 87 88 try { 89 if (createFolder == true) { 90 newFolder = CheckinDocUtil.createFolder(parentMenu, folderName); 92 } else { 93 SettingConfigurator settings = new SettingConfigurator(); 96 String 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 file = new File (path + newDocName); 103 newFolder = CheckinDocUtil.createDocument(file, parentMenu, userName); 104 } 105 if (newFolder == null) 106 throw new Exception (); 107 } catch (Exception 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 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 setHttpStatusCode(HttpStatusCodes.CREATED); 122 return; 123 } 124 125 129 private boolean parseXMLFile() { 130 try { 131 XMLBean xmlBean = new XMLBean(xmlInfoFile); 133 Element root = xmlBean.getChild("folderInfo"); 134 135 Element booleanElement = root.getChild("createFolder"); 137 createFolder = new Boolean (xmlBean.getText(booleanElement)); 138 139 Element nameElement = root.getChild("name"); 141 folderName = xmlBean.getText(nameElement); 142 } catch (Exception ex) { 143 return false; 144 } 145 146 return true; 147 } 148 149 153 private boolean createXMLAnswer() { 154 PrintWriter responseWriter; 155 try { 156 responseWriter = response.getWriter(); 157 } catch (IOException 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 response.setContentType("text/xml;charset=utf-8"); 165 boolean ret = true; 166 167 try { 168 Document xmlDoc = createXMLDocument(); 170 171 org.w3c.dom.Element rootElement = createRootElement(xmlDoc, "createFolderData", "folder", "post-folder.xsd"); 173 174 int menuId = newFolder.getMenuId(); 176 org.w3c.dom.Element 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 createTextNodeElement(xmlDoc, "url", folderElement, localRESTUrl + "folder/" + menuId); 183 184 if (createFolder == false) { 186 createTextNodeElement(xmlDoc, "metadataURL", folderElement, localRESTUrl + 187 "document/" + menuId + "/meta"); 188 } 189 190 writeXMLDocument(xmlDoc, responseWriter); 192 } catch (ParserConfigurationException 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 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 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 responseWriter.flush(); 207 responseWriter.close(); 208 } 209 210 return ret; 211 } 212 213 218 private boolean extractUploadedFiles() { 219 FileItemFactory factory = new DiskFileItemFactory(); 220 ServletFileUpload upload = new ServletFileUpload(factory); 221 List items = null; 222 223 try { 224 items = upload.parseRequest(request); 225 } catch (FileUploadException e) { 226 return false; 227 } 228 229 if (items.size() > 2) 232 return false; 233 234 Iterator iter = items.iterator(); 235 while (iter.hasNext()) { 236 FileItem fileItem = (FileItem) iter.next(); 237 if (fileItem.isFormField()) { 238 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 return false; 250 } 251 } catch (IOException e) { 252 return false; 253 } 254 } 255 } 256 257 if (xmlInfoFile == null) 259 return false; 260 else 261 return true; 262 } 263 } | Popular Tags |