1 16 package org.outerj.daisy.httpconnector.handlers; 17 18 import org.apache.avalon.framework.logger.Logger; 19 import org.apache.commons.fileupload.FileItem; 20 import org.apache.xmlbeans.XmlOptions; 21 import org.mortbay.http.HttpRequest; 22 import org.mortbay.http.HttpResponse; 23 import org.outerj.daisy.repository.Repository; 24 import org.outerj.daisy.repository.Document; 25 import org.outerj.daisy.repository.RepositoryException; 26 import org.outerj.daisy.httpconnector.HttpUtil; 27 import org.outerj.daisy.httpconnector.BadRequestException; 28 import org.outerj.daisy.xmlutil.LocalSAXParserFactory; 29 import org.outerx.daisy.x10.DocumentDocument; 30 31 import java.util.Map ; 32 import java.util.List ; 33 34 public class DocumentHandler extends AbstractDocumentHandler { 35 36 public DocumentHandler(Logger requestErrorLogger, int uploadThreshold, int uploadMaxSize, String uploadTempdir) { 37 super(requestErrorLogger, uploadThreshold, uploadMaxSize, uploadTempdir); 38 } 39 40 public String getPathPattern() { 41 return "/document/*"; 42 } 43 44 public void handleRequest(Map matchMap, HttpRequest request, HttpResponse response, Repository repository) throws Exception { 45 long id = HttpUtil.parseId("document", (String )matchMap.get("1")); 46 47 if (request.getMethod().equals(HttpRequest.__GET)) { 48 long branchId = HttpUtil.getBranchId(request, repository); 49 long languageId = HttpUtil.getLanguageId(request, repository); 50 Document document = repository.getDocument(id, branchId, languageId, true); 52 if (document.canReadLiveOnly()) { 53 document.getXmlWithoutVersionedData().save(response.getOutputStream()); 54 } else { 55 document.getXml().save(response.getOutputStream()); 56 } 57 response.commit(); 58 } else if (request.getMethod().equals(HttpRequest.__POST)) { 59 String actionParam = request.getParameter("action"); 60 if (actionParam != null && actionParam.equals("createVariant")) { 61 long startBranchId = HttpUtil.getBranchId(request, repository, "startBranch"); 62 long startLanguageId = HttpUtil.getLanguageId(request, repository, "startLanguage"); 63 long startVersionId = HttpUtil.getLongParam(request, "startVersion"); 64 long newBranchId = HttpUtil.getBranchId(request, repository, "newBranch"); 65 long newLanguageId = HttpUtil.getLanguageId(request, repository, "newLanguage"); 66 Document document = repository.createVariant(id, startBranchId, startLanguageId, startVersionId, newBranchId, newLanguageId, true); 67 document.getXml().save(response.getOutputStream()); 68 response.commit(); 69 } else if (actionParam == null) { 70 List uploadedItems = parseMultipartRequest(request, response); 71 FileItem xmlItem = getItemByName(uploadedItems, "xml"); 72 if (xmlItem == null) { 73 HttpUtil.sendCustomError("The required field named \"xml\" is missing.", HttpResponse.__400_Bad_Request, response); 74 return; 75 } 76 XmlOptions xmlOptions = new XmlOptions().setLoadUseXMLReader(LocalSAXParserFactory.newXmlReader()); 77 DocumentDocument documentDocument = DocumentDocument.Factory.parse(xmlItem.getInputStream(), xmlOptions); 78 DocumentDocument.Document documentXml = documentDocument.getDocument(); 79 80 Document document; 82 String createVariant =request.getParameter("createVariant"); 83 if (createVariant != null && createVariant.equals("yes")) { 84 long startBranchId = HttpUtil.getBranchId(request, repository, "startBranch"); 85 long startLanguageId = HttpUtil.getLanguageId(request, repository, "startLanguage"); 86 document = repository.createVariant(id, startBranchId, startLanguageId, -1, documentXml.getBranchId(), documentXml.getLanguageId(), false); 87 } else { 88 document = repository.getDocument(id, documentXml.getBranchId(), documentXml.getLanguageId(), true); 89 if (document.getVariantUpdateCount() != documentXml.getVariantUpdateCount()) 90 throw new RepositoryException("The document variant was updated concurrently."); 91 } 92 if (document.getUpdateCount() != documentXml.getUpdateCount()) 93 throw new RepositoryException("The document was updated concurrently."); 94 95 updateDocument(document, documentXml, uploadedItems, response, repository); 96 97 boolean validate = documentXml.isSetValidateOnSave() ? documentXml.getValidateOnSave() : true; 98 document.save(validate); 99 100 document.getXml().save(response.getOutputStream()); 102 response.commit(); 103 } else { 104 throw new BadRequestException("Invalid value for action parameter: " + actionParam); 105 } 106 } else if (request.getMethod().equals(HttpRequest.__DELETE)) { 107 String branchParam = request.getParameter("branch"); 110 String languageParam = request.getParameter("language"); 111 112 if (branchParam != null && languageParam != null) { 113 long branchId = HttpUtil.getBranchId(request, repository); 114 long languageId = HttpUtil.getLanguageId(request, repository); 115 repository.deleteVariant(id, branchId, languageId); 116 } else if (branchParam == null && languageParam == null) { 117 repository.deleteDocument(id); 118 } else { 119 throw new BadRequestException("branch and language request parameters must both be specified, or not at all."); 120 } 121 response.commit(); 122 } else { 123 response.sendError(HttpResponse.__405_Method_Not_Allowed); 124 } 125 } 126 } 127 | Popular Tags |