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