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.krad.web.controller;
017
018 import java.util.Collection;
019 import java.util.Properties;
020 import java.util.Set;
021
022 import javax.servlet.http.HttpServletRequest;
023 import javax.servlet.http.HttpServletResponse;
024
025 import org.apache.commons.lang.StringUtils;
026 import org.kuali.rice.core.api.exception.RiceRuntimeException;
027 import org.kuali.rice.krad.lookup.CollectionIncomplete;
028 import org.kuali.rice.krad.lookup.Lookupable;
029 import org.kuali.rice.krad.service.KRADServiceLocatorWeb;
030 import org.kuali.rice.krad.service.ModuleService;
031 import org.kuali.rice.krad.uif.UifConstants;
032 import org.kuali.rice.krad.uif.UifParameters;
033 import org.kuali.rice.krad.uif.UifPropertyPaths;
034 import org.kuali.rice.krad.util.GlobalVariables;
035 import org.kuali.rice.krad.util.KRADConstants;
036 import org.kuali.rice.krad.util.KRADUtils;
037 import org.kuali.rice.krad.web.form.LookupForm;
038 import org.kuali.rice.krad.web.form.UifFormBase;
039 import org.springframework.stereotype.Controller;
040 import org.springframework.validation.BindingResult;
041 import org.springframework.web.bind.annotation.ModelAttribute;
042 import org.springframework.web.bind.annotation.RequestMapping;
043 import org.springframework.web.servlet.ModelAndView;
044
045 /**
046 * Controller that handles requests coming from a <code>LookupView</code>
047 *
048 * @author Kuali Rice Team (rice.collab@kuali.org)
049 */
050 @Controller
051 @RequestMapping(value = "/lookup")
052 public class LookupController extends UifControllerBase {
053 private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(LookupController.class);
054
055 /**
056 * @see org.kuali.rice.krad.web.controller.UifControllerBase#createInitialForm(javax.servlet.http.HttpServletRequest)
057 */
058 @Override
059 protected LookupForm createInitialForm(HttpServletRequest request) {
060 return new LookupForm();
061 }
062
063 protected void suppressActionsIfNeeded(LookupForm lookupForm) {
064 // try {
065 // // TODO; move to authorizer for lookup view
066 // Class<?> dataObjectClass = Class.forName(lookupForm.getDataObjectClassName());
067 // Person user = GlobalVariables.getUserSession().getPerson();
068 // // check if creating documents is allowed
069 // String documentTypeName = KRADServiceLocatorWeb.getDocumentDictionaryService()
070 // .getMaintenanceDocumentTypeName(dataObjectClass);
071 // if ((documentTypeName != null) &&
072 // !KRADServiceLocatorWeb.getDocumentHelperService().getDocumentAuthorizer(documentTypeName)
073 // .canInitiate(documentTypeName, user)) {
074 // ((LookupView) lookupForm.getView()).setSuppressActions(true);
075 // }
076 // } catch (ClassNotFoundException e) {
077 // LOG.warn("Unable to load Data Object Class: " + lookupForm.getDataObjectClassName(), e);
078 // }
079 }
080
081 /**
082 * Invoked to request an lookup view for a data object class
083 *
084 * <p>
085 * Checks if the data object is externalizable and we need to redirect to the appropriate lookup URL, else
086 * continues with the lookup view display
087 * </p>
088 */
089 @RequestMapping(params = "methodToCall=start")
090 @Override
091 public ModelAndView start(@ModelAttribute("KualiForm") UifFormBase form, BindingResult result,
092 HttpServletRequest request, HttpServletResponse response) {
093 LookupForm lookupForm = (LookupForm) form;
094
095 // if request is not a redirect, determine if we need to redirect for an externalizable object lookup
096 if (!lookupForm.isRedirectedLookup()) {
097 Class lookupObjectClass = null;
098 try {
099 lookupObjectClass = Class.forName(lookupForm.getDataObjectClassName());
100 } catch (ClassNotFoundException e) {
101 throw new RiceRuntimeException("Unable to get class for name: " + lookupForm.getDataObjectClassName());
102 }
103
104 ModuleService responsibleModuleService =
105 KRADServiceLocatorWeb.getKualiModuleService().getResponsibleModuleService(lookupObjectClass);
106 if (responsibleModuleService != null && responsibleModuleService.isExternalizable(lookupObjectClass)) {
107 String lookupUrl = responsibleModuleService.getExternalizableDataObjectLookupUrl(lookupObjectClass,
108 KRADUtils.convertRequestMapToProperties(request.getParameterMap()));
109
110 Properties redirectUrlProps = new Properties();
111 redirectUrlProps.put(UifParameters.REDIRECTED_LOOKUP, "true");
112
113 // clear current form from session
114 GlobalVariables.getUifFormManager().removeForm(form);
115
116 return performRedirect(form, lookupUrl, redirectUrlProps);
117 }
118 }
119
120 return super.start(lookupForm, result, request, response);
121 }
122
123 /**
124 * Just returns as if return with no value was selected
125 */
126 @Override
127 @RequestMapping(params = "methodToCall=cancel")
128 public ModelAndView cancel(@ModelAttribute("KualiForm") UifFormBase form, BindingResult result,
129 HttpServletRequest request, HttpServletResponse response) {
130 LookupForm lookupForm = (LookupForm) form;
131 suppressActionsIfNeeded(lookupForm);
132
133 Properties props = new Properties();
134 props.put(UifParameters.METHOD_TO_CALL, UifConstants.MethodToCallNames.REFRESH);
135 if (StringUtils.isNotBlank(lookupForm.getReturnFormKey())) {
136 props.put(UifParameters.FORM_KEY, lookupForm.getReturnFormKey());
137 }
138 if (StringUtils.isNotBlank(lookupForm.getDocNum())) {
139 props.put(UifParameters.DOC_NUM, lookupForm.getDocNum());
140 }
141
142 // clear current form from session
143 GlobalVariables.getUifFormManager().removeForm(form);
144
145 return performRedirect(lookupForm, lookupForm.getReturnLocation(), props);
146 }
147
148 /**
149 * clearValues - clears the values of all the fields on the jsp.
150 */
151 @RequestMapping(params = "methodToCall=clearValues")
152 public ModelAndView clearValues(@ModelAttribute("KualiForm") LookupForm lookupForm, BindingResult result,
153 HttpServletRequest request, HttpServletResponse response) {
154 suppressActionsIfNeeded(lookupForm);
155
156 Lookupable lookupable = (Lookupable) lookupForm.getLookupable();
157 lookupForm.setCriteriaFields(lookupable.performClear(lookupForm, lookupForm.getCriteriaFields()));
158
159 return getUIFModelAndView(lookupForm);
160 }
161
162 /**
163 * search - sets the values of the data entered on the form on the jsp into a map and then searches for the
164 * results.
165 */
166 @RequestMapping(params = "methodToCall=search")
167 public ModelAndView search(@ModelAttribute("KualiForm") LookupForm lookupForm, BindingResult result,
168 HttpServletRequest request, HttpServletResponse response) {
169 suppressActionsIfNeeded(lookupForm);
170
171 Lookupable lookupable = lookupForm.getLookupable();
172 if (lookupable == null) {
173 LOG.error("Lookupable is null.");
174 throw new RuntimeException("Lookupable is null.");
175 }
176
177 // validate search parameters
178 lookupable.validateSearchParameters(lookupForm, lookupForm.getCriteriaFields());
179
180 Collection<?> displayList =
181 lookupable.performSearch(lookupForm, lookupForm.getCriteriaFields(), true);
182
183 if (displayList instanceof CollectionIncomplete<?>) {
184 request.setAttribute("reqSearchResultsActualSize",
185 ((CollectionIncomplete<?>) displayList).getActualSizeIfTruncated());
186 } else {
187 request.setAttribute("reqSearchResultsActualSize", new Integer(displayList.size()));
188 }
189
190 lookupForm.setSearchResults(displayList);
191
192 return getUIFModelAndView(lookupForm);
193 }
194
195 /**
196 * Invoked from the UI to return the selected lookup results lines, parameters are collected to build a URL to
197 * the caller and then a redirect is performed
198 *
199 * @param lookupForm - lookup form instance containing the selected results and lookup configuration
200 */
201 @RequestMapping(params = "methodToCall=returnSelected")
202 public ModelAndView returnSelected(@ModelAttribute("KualiForm") LookupForm lookupForm, BindingResult result,
203 HttpServletRequest request, HttpServletResponse response) {
204 Properties parameters = new Properties();
205 parameters.put(KRADConstants.DISPATCH_REQUEST_PARAMETER, KRADConstants.RETURN_METHOD_TO_CALL);
206
207 if (StringUtils.isNotBlank(lookupForm.getReturnFormKey())) {
208 parameters.put(UifParameters.FORM_KEY, lookupForm.getReturnFormKey());
209 }
210
211 parameters.put(KRADConstants.REFRESH_CALLER, lookupForm.getView().getId());
212 parameters.put(KRADConstants.REFRESH_CALLER_TYPE, UifConstants.RefreshCallerTypes.MULTI_VALUE_LOOKUP);
213 parameters.put(KRADConstants.REFRESH_DATA_OBJECT_CLASS, lookupForm.getDataObjectClassName());
214
215 if (StringUtils.isNotBlank(lookupForm.getDocNum())) {
216 parameters.put(UifParameters.DOC_NUM, lookupForm.getDocNum());
217 }
218
219 if (StringUtils.isNotBlank(lookupForm.getLookupCollectionName())) {
220 parameters.put(UifParameters.LOOKUP_COLLECTION_NAME, lookupForm.getLookupCollectionName());
221 }
222
223 if (StringUtils.isNotBlank(lookupForm.getReferencesToRefresh())) {
224 parameters.put(KRADConstants.REFERENCES_TO_REFRESH, lookupForm.getReferencesToRefresh());
225 }
226
227 // build string of select line identifiers
228 String selectedLineValues = "";
229 Set<String> selectedLines = lookupForm.getSelectedCollectionLines().get(UifPropertyPaths.SEARCH_RESULTS);
230 if (selectedLines != null) {
231 for (String selectedLine : selectedLines) {
232 selectedLineValues += selectedLine + ",";
233 }
234 selectedLineValues = StringUtils.removeEnd(selectedLineValues, ",");
235 }
236
237 parameters.put(UifParameters.SELECTED_LINE_VALUES, selectedLineValues);
238
239 // clear current form from session
240 GlobalVariables.getUifFormManager().removeForm(lookupForm);
241
242 return performRedirect(lookupForm, lookupForm.getReturnLocation(), parameters);
243 }
244 }