001 /** 002 * Copyright 2005-2012 The Kuali Foundation 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.kuali.rice.edl.impl; 017 018 import java.io.IOException; 019 020 import javax.servlet.RequestDispatcher; 021 import javax.servlet.ServletException; 022 import javax.servlet.http.HttpServlet; 023 import javax.servlet.http.HttpServletRequest; 024 import javax.servlet.http.HttpServletResponse; 025 026 import org.apache.commons.lang.StringUtils; 027 import org.apache.log4j.Logger; 028 import org.kuali.rice.edl.impl.service.EdlServiceLocator; 029 import org.kuali.rice.kew.api.WorkflowRuntimeException; 030 import org.kuali.rice.kns.util.IncidentReportUtils; 031 import org.kuali.rice.krad.UserSession; 032 import org.kuali.rice.krad.exception.AuthenticationException; 033 import org.kuali.rice.krad.util.GlobalVariables; 034 import org.kuali.rice.krad.util.KRADConstants; 035 import org.kuali.rice.krad.util.KRADUtils; 036 import org.w3c.dom.Document; 037 import org.w3c.dom.Element; 038 039 040 /** 041 * Takes edl web requests. 042 * 043 * @author Kuali Rice Team (rice.collab@kuali.org) 044 * 045 */ 046 public class EDLServlet extends HttpServlet { 047 048 private static final long serialVersionUID = -6344765194278430690L; 049 050 private static final Logger LOG = Logger.getLogger(EDLServlet.class); 051 052 @Override 053 public void init() throws ServletException { 054 try { 055 EdlServiceLocator.getEDocLiteService().initEDLGlobalConfig(); 056 } catch (Exception e) { 057 LOG.error("Error initializing EDL", e); 058 } 059 060 } 061 062 @Override 063 protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 064 String documentId = null; 065 try { 066 UserSession userSession = KRADUtils.getUserSessionFromRequest(request); 067 if (userSession == null) { 068 throw new AuthenticationException("Failed to locate a user session for request."); 069 } 070 GlobalVariables.setUserSession(userSession); 071 072 RequestParser requestParser = new RequestParser(request); 073 String inputCommand = requestParser.getParameterValue("command"); 074 if (StringUtils.equals(inputCommand, "initiate")){ 075 requestParser.setParameterValue("userAction","initiate"); 076 } 077 String edlName = requestParser.getParameterValue("edlName"); 078 if (edlName == null) { 079 edlName = requestParser.getParameterValue("docTypeName");//this is for 'WorkflowQuicklinks' 080 } 081 EDLController edlController = null; 082 083 if (edlName == null) { 084 documentId = requestParser.getParameterValue("docId"); 085 if (documentId == null) { 086 String docFormKey = requestParser.getParameterValue(KRADConstants.DOC_FORM_KEY); 087 if (docFormKey != null) { 088 Document document = (Document) GlobalVariables.getUserSession().retrieveObject(docFormKey); 089 Element documentState = EDLXmlUtils.getDocumentStateElement(document); 090 documentId = EDLXmlUtils.getChildElementTextValue(documentState, "docId"); 091 requestParser.setAttribute(KRADConstants.DOC_FORM_KEY, docFormKey); 092 } 093 if (documentId == null) { 094 throw new WorkflowRuntimeException("No edl name or document id detected"); 095 } 096 } 097 requestParser.setAttribute("docId", documentId); 098 edlController = EdlServiceLocator.getEDocLiteService().getEDLControllerUsingDocumentId(documentId); 099 } else { 100 edlController = EdlServiceLocator.getEDocLiteService().getEDLControllerUsingEdlName(edlName); 101 } 102 103 //TODO Fix this in a better way (reworking the command structure maybe?) 104 //fix for KULRICE-4057 to make sure we don't destory docContent on empty command params 105 if(inputCommand == null && requestParser.getParameterValue("docId") != null && !"POST".equals(request.getMethod())){ 106 //make sure these are the only params on the request (paging passed undefined input command as well... 107 if(!(request.getParameterMap().size() > 2)){//ensures ONLY documentId was passed 108 requestParser.setParameterValue("command", "displayDocSearchView"); 109 LOG.info("command parameter was not passed with the request, and only document ID was. Defaulted command to 'displayDocSearchView' to ensure docContent remains."); 110 } 111 } 112 113 EDLControllerChain controllerChain = new EDLControllerChain(); 114 controllerChain.addEdlController(edlController); 115 //TODO Do we not want to set the content type for the response? 116 controllerChain.renderEDL(requestParser, response); 117 118 } catch (Exception e) { 119 LOG.error("Error processing EDL", e); 120 outputError(request, response, e, documentId); 121 } finally { 122 GlobalVariables.setUserSession(null); 123 } 124 } 125 126 private void outputError(HttpServletRequest request, HttpServletResponse response, Exception exception, String documentId) throws ServletException, IOException { 127 IncidentReportUtils.populateRequestForIncidentReport(exception, "" + documentId, "eDoc Lite", request); 128 RequestDispatcher rd = getServletContext().getRequestDispatcher(request.getServletPath() + "/../../kr/kualiExceptionIncidentReport.do"); 129 rd.forward(request, response); 130 } 131 132 }