View Javadoc

1   /**
2    * Copyright 2005-2011 The Kuali Foundation
3    *
4    * Licensed under the Educational Community License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.opensource.org/licenses/ecl2.php
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.kuali.rice.edl.impl;
17  
18  import java.io.IOException;
19  
20  import javax.servlet.RequestDispatcher;
21  import javax.servlet.ServletException;
22  import javax.servlet.http.HttpServlet;
23  import javax.servlet.http.HttpServletRequest;
24  import javax.servlet.http.HttpServletResponse;
25  
26  import org.apache.commons.lang.StringUtils;
27  import org.apache.log4j.Logger;
28  import org.kuali.rice.edl.impl.service.EdlServiceLocator;
29  import org.kuali.rice.kew.api.WorkflowRuntimeException;
30  import org.kuali.rice.kns.util.IncidentReportUtils;
31  import org.kuali.rice.krad.UserSession;
32  import org.kuali.rice.krad.exception.AuthenticationException;
33  import org.kuali.rice.krad.util.GlobalVariables;
34  import org.kuali.rice.krad.util.KRADConstants;
35  import org.kuali.rice.krad.util.KRADUtils;
36  import org.w3c.dom.Document;
37  import org.w3c.dom.Element;
38  
39  
40  /**
41   * Takes edl web requests.
42   * 
43   * @author Kuali Rice Team (rice.collab@kuali.org)
44   *
45   */
46  public class EDLServlet extends HttpServlet {
47  
48  	private static final long serialVersionUID = -6344765194278430690L;
49  
50  	private static final Logger LOG = Logger.getLogger(EDLServlet.class);
51  
52  	@Override
53  	public void init() throws ServletException {
54  		try {
55  			EdlServiceLocator.getEDocLiteService().initEDLGlobalConfig();
56  		} catch (Exception e) {
57  			LOG.error("Error initializing EDL", e);
58  		}
59  
60  	}
61  
62  	@Override
63  	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
64  		String documentId = null;
65  		try {
66  		    UserSession userSession = KRADUtils.getUserSessionFromRequest(request);
67  		    if (userSession == null) {
68  		        throw new AuthenticationException("Failed to locate a user session for request.");
69  		    }
70  		    GlobalVariables.setUserSession(userSession);
71  		    
72  		    RequestParser requestParser = new RequestParser(request);
73  		    String inputCommand = requestParser.getParameterValue("command");
74  		    if (StringUtils.equals(inputCommand, "initiate")){
75  		    	requestParser.setParameterValue("userAction","initiate");
76  		    }
77  		    String edlName = requestParser.getParameterValue("edlName");
78  		    if (edlName == null) {
79  		        edlName = requestParser.getParameterValue("docTypeName");//this is for 'WorkflowQuicklinks'
80  		    }
81  		    EDLController edlController = null;
82  		    
83  		    if (edlName == null) {
84  		        documentId = requestParser.getParameterValue("docId");
85  		        if (documentId == null) {
86  		        	String docFormKey = requestParser.getParameterValue(KRADConstants.DOC_FORM_KEY);
87  		        	if (docFormKey != null) {
88  		        		Document document = (Document) GlobalVariables.getUserSession().retrieveObject(docFormKey);
89  		        		Element documentState = EDLXmlUtils.getDocumentStateElement(document);
90  		        		documentId = EDLXmlUtils.getChildElementTextValue(documentState, "docId");
91  		        		requestParser.setAttribute(KRADConstants.DOC_FORM_KEY, docFormKey);
92  		        	}
93  		        	if (documentId == null) {
94  		        		throw new WorkflowRuntimeException("No edl name or document id detected");
95  		        	}
96  		        }
97  		        requestParser.setAttribute("docId", documentId);
98  		        edlController = EdlServiceLocator.getEDocLiteService().getEDLControllerUsingDocumentId(documentId);
99  		    } 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 }