001 /**
002 * Copyright 2005-2014 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.kns.lookup;
017
018 import org.kuali.rice.kns.document.authorization.BusinessObjectRestrictions;
019 import org.kuali.rice.kns.web.struts.form.LookupForm;
020 import org.kuali.rice.kns.web.ui.Column;
021 import org.kuali.rice.kns.web.ui.Field;
022 import org.kuali.rice.kns.web.ui.ResultRow;
023 import org.kuali.rice.kns.web.ui.Row;
024 import org.kuali.rice.krad.bo.BusinessObject;
025 import org.kuali.rice.kns.service.BusinessObjectDictionaryService;
026 import org.kuali.rice.krad.service.DataDictionaryService;
027 import org.kuali.rice.krad.util.KRADConstants;
028 import org.kuali.rice.krad.util.UrlFactory;
029 import org.springframework.transaction.annotation.Transactional;
030
031 import java.util.Collection;
032 import java.util.List;
033 import java.util.Map;
034 import java.util.Properties;
035
036 /**
037 * Kuali lookup implementation. Implements methods necessary to render the lookup and provides search and return methods.
038 */
039 @Transactional
040 public class KualiLookupableImpl implements Lookupable {
041 private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(KualiLookupableImpl.class);
042 protected static final String[] IGNORE_LIST = { KRADConstants.DOC_FORM_KEY, KRADConstants.BACK_LOCATION };
043
044 protected Class businessObjectClass;
045 protected LookupableHelperService lookupableHelperService;
046 protected String extraOnLoad = ""; // This is supposed to be a javascript function.
047
048 /**
049 * Default constructor initializes services from spring
050 */
051 public KualiLookupableImpl() {
052 }
053
054 /**
055 * Sets the business object class for the lookup instance, then rows can be set for search render.
056 *
057 * @param boClass Class for the lookup business object
058 */
059 public void setBusinessObjectClass(Class boClass) {
060 if (boClass == null) {
061 throw new RuntimeException("Business object class is null.");
062 }
063
064 this.businessObjectClass = boClass;
065
066 // next line initializes the helper to return correct values for getRow();
067 getLookupableHelperService().setBusinessObjectClass(boClass);
068 }
069
070 /**
071 * Initializes the lookup with the given Map of parameters.
072 *
073 * @param parameters
074 */
075 public void setParameters(Map<String, String[]> parameters) {
076 getLookupableHelperService().setParameters(parameters);
077 }
078
079 /**
080 * @return Returns the parameters passed to this lookup
081 */
082 public Map<String, String[]> getParameters() {
083 return getLookupableHelperService().getParameters();
084 }
085
086 /**
087 * Constructs the list of columns for the search results. All properties for the column objects come from the DataDictionary.
088 */
089 public List<Column> getColumns() {
090 return getLookupableHelperService().getColumns();
091 }
092
093 /**
094 * Checks that any required search fields have value.
095 *
096 * @see Lookupable#validateSearchParameters(java.util.Map)
097 */
098 public void validateSearchParameters(Map<String, String> fieldValues) {
099 getLookupableHelperService().validateSearchParameters(fieldValues);
100 }
101
102 /**
103 * Uses Lookup Service to provide a basic unbounded search.
104 *
105 * @param fieldValues - Map containing prop name keys and search values
106 *
107 * @return List found business objects
108 */
109 public List<? extends BusinessObject> getSearchResultsUnbounded(Map<String, String> fieldValues) {
110 return getLookupableHelperService().getSearchResultsUnbounded(fieldValues);
111 }
112
113 /**
114 * Uses Lookup Service to provide a basic search.
115 *
116 * @param fieldValues - Map containing prop name keys and search values
117 *
118 * @return List found business objects
119 */
120 public List<? extends BusinessObject> getSearchResults(Map<String, String> fieldValues) {
121 return getLookupableHelperService().getSearchResults(fieldValues);
122 }
123
124 /**
125 * @return the return url for each result row.
126 */
127 public HtmlData getReturnUrl(BusinessObject bo, Map fieldConversions, String lookupImpl, BusinessObjectRestrictions businessObjectRestrictions) {
128 return getLookupableHelperService().getReturnUrl(bo, fieldConversions, lookupImpl, getReturnKeys(), businessObjectRestrictions);
129 }
130
131 /**
132 * @see Lookupable#getCreateNewUrl()
133 */
134 public String getCreateNewUrl() {
135 String url = "";
136
137 if (getLookupableHelperService().allowsMaintenanceNewOrCopyAction()) {
138 Properties parameters = new Properties();
139 parameters.put(KRADConstants.DISPATCH_REQUEST_PARAMETER, KRADConstants.MAINTENANCE_NEW_METHOD_TO_CALL);
140 parameters.put(KRADConstants.BUSINESS_OBJECT_CLASS_ATTRIBUTE, this.businessObjectClass.getName());
141
142 url = UrlFactory.parameterizeUrl(KRADConstants.MAINTENANCE_ACTION, parameters);
143 url = "<a title=\"Create a new record\" href=\"" + url + "\"><img src=\"images/tinybutton-createnew.gif\" alt=\"create new\" width=\"70\" height=\"15\"/></a>";
144 }
145
146 return url;
147 }
148
149
150 /**
151 * @see Lookupable#getHtmlMenuBar()
152 */
153 public String getHtmlMenuBar() {
154 return getBusinessObjectDictionaryService().getLookupMenuBar(getBusinessObjectClass());
155 }
156
157 /**
158 * @see Lookupable#getSupplementalMenuBar()
159 */
160 public String getSupplementalMenuBar() {
161 return getLookupableHelperService().getSupplementalMenuBar();
162 }
163
164 /**
165 * @see Lookupable#getRows()
166 */
167 public List<Row> getRows() {
168 return getLookupableHelperService().getRows();
169 }
170
171 /**
172 * @see Lookupable#getTitle()
173 */
174 public String getTitle() {
175 return getLookupableHelperService().getTitle();
176 }
177
178 /**
179 * @see Lookupable#getReturnLocation()
180 */
181 public String getReturnLocation() {
182 return getLookupableHelperService().getReturnLocation();
183 }
184
185 /**
186 * @return Returns the dataObjectClass.
187 */
188 public Class getBusinessObjectClass() {
189 return businessObjectClass;
190 }
191
192 /**
193 * @return a List of the names of fields which are marked in data dictionary as return fields.
194 */
195 public List<String> getReturnKeys() {
196 return getLookupableHelperService().getReturnKeys();
197 }
198
199
200 /**
201 * @see Lookupable#getExtraButtonSource()
202 */
203 public String getExtraButtonSource() {
204 return getBusinessObjectDictionaryService().getExtraButtonSource(getBusinessObjectClass());
205 }
206
207 /**
208 * @see Lookupable#getExtraButtonParams()
209 */
210 public String getExtraButtonParams() {
211 return getBusinessObjectDictionaryService().getExtraButtonParams(getBusinessObjectClass());
212 }
213
214 /**
215 * @return property names that will be used to sort on by default
216 */
217 public List<String> getDefaultSortColumns() {
218 return getLookupableHelperService().getDefaultSortColumns();
219 }
220
221 /**
222 * @see Lookupable#checkForAdditionalFields(java.util.Map)
223 */
224 public boolean checkForAdditionalFields(Map<String, String> fieldValues) {
225 return getLookupableHelperService().checkForAdditionalFields(fieldValues);
226 }
227
228 /**
229 * @return Returns the backLocation.
230 */
231 public String getBackLocation() {
232 return getLookupableHelperService().getBackLocation();
233 }
234
235 /**
236 * @param backLocation The backLocation to set.
237 */
238 public void setBackLocation(String backLocation) {
239 getLookupableHelperService().setBackLocation(backLocation);
240 }
241
242 /**
243 * @return Returns the docFormKey.
244 */
245 public String getDocFormKey() {
246 return getLookupableHelperService().getDocFormKey();
247 }
248
249 /**
250 * // this method is public because unit tests depend upon it
251 * @param docFormKey The docFormKey to set.
252 */
253 public void setDocFormKey(String docFormKey) {
254 getLookupableHelperService().setDocFormKey(docFormKey);
255 }
256
257 /**
258 * @return Returns the businessObjectDictionaryService.
259 */
260 protected BusinessObjectDictionaryService getBusinessObjectDictionaryService() {
261 return getLookupableHelperService().getBusinessObjectDictionaryService();
262 }
263
264 /**
265 * @see Lookupable#setFieldConversions(java.util.Map)
266 */
267 public void setFieldConversions(Map fieldConversions) {
268 getLookupableHelperService().setFieldConversions(fieldConversions);
269 }
270
271 /**
272 * @return Returns the dataDictionaryService.
273 */
274 protected DataDictionaryService getDataDictionaryService() {
275 return getLookupableHelperService().getDataDictionaryService();
276 }
277
278
279 /**
280 * Sets the readOnlyFieldsList attribute value.
281 *
282 * @param readOnlyFieldsList The readOnlyFieldsList to set.
283 */
284 public void setReadOnlyFieldsList(List<String> readOnlyFieldsList) {
285 getLookupableHelperService().setReadOnlyFieldsList(readOnlyFieldsList);
286 }
287
288
289 public LookupableHelperService getLookupableHelperService() {
290 return lookupableHelperService;
291 }
292
293
294 /**
295 * Sets the lookupableHelperService attribute value.
296 * @param lookupableHelperService The lookupableHelperService to set.
297 */
298 public void setLookupableHelperService(LookupableHelperService lookupableHelperService) {
299 this.lookupableHelperService = lookupableHelperService;
300 }
301
302 /**
303 * Performs a lookup that can only return one row.
304 * @see Lookupable#performLookup(org.kuali.rice.krad.web.struts.form.LookupForm, java.util.List, boolean)
305 */
306 public Collection<? extends BusinessObject> performLookup(LookupForm lookupForm, List<ResultRow> resultTable, boolean bounded) {
307 return getLookupableHelperService().performLookup(lookupForm, resultTable, bounded);
308 }
309
310
311 public boolean isSearchUsingOnlyPrimaryKeyValues() {
312 return getLookupableHelperService().isSearchUsingOnlyPrimaryKeyValues();
313 }
314
315
316 public String getPrimaryKeyFieldLabels() {
317 return getLookupableHelperService().getPrimaryKeyFieldLabels();
318 }
319
320 /**
321 * calls the lookup helper service to do "clear" behaviors
322 *
323 * @see Lookupable#performClear()
324 */
325 public void performClear(LookupForm lookupForm) {
326 getLookupableHelperService().performClear(lookupForm);
327 }
328
329 /**
330 * calls the lookup helper service to check if non maintenance actions should be displayed
331 *
332 * @see Lookupable#shouldDisplayHeaderNonMaintActions()
333 */
334 public boolean shouldDisplayHeaderNonMaintActions() {
335 return getLookupableHelperService().shouldDisplayHeaderNonMaintActions();
336 }
337
338 /**
339 * calls the lookup helper service to check if criteria should be displayed
340 *
341 * @see Lookupable#shouldDisplayLookupCriteria()
342 */
343 public boolean shouldDisplayLookupCriteria() {
344 return getLookupableHelperService().shouldDisplayLookupCriteria();
345 }
346
347 protected String getCreateNewUrl(String url){
348 return "<a title=\"Create a new record\" href=\"" + url + "\"><img src=\"images/tinybutton-createnew.gif\" alt=\"create new\" width=\"70\" height=\"15\"/></a>";
349 }
350
351 /**
352 * @see Lookupable#performCustomAction(boolean)
353 */
354 public boolean performCustomAction(boolean ignoreErrors) {
355 return getLookupableHelperService().performCustomAction(ignoreErrors);
356 }
357
358 /**
359 * This overridden method ...
360 *
361 * @see Lookupable#getExtraField()
362 */
363 public Field getExtraField() {
364 return getLookupableHelperService().getExtraField();
365 }
366
367 /**
368 * This overridden method ...
369 *
370 * @see Lookupable#applyFieldAuthorizationsFromNestedLookups(org.kuali.rice.krad.web.ui.Field)
371 */
372 public void applyFieldAuthorizationsFromNestedLookups(Field field) {
373 getLookupableHelperService().applyFieldAuthorizationsFromNestedLookups(field);
374 }
375
376 /**
377 * This overridden method returns the extraOnLoad variable. The
378 * varible is currently accessed in page.tag and is called in the onLoad.
379 * it allows us to inject javascript onload.
380 *
381 * @see Lookupable#getExtraOnLoad()
382 */
383 public String getExtraOnLoad() {
384 return extraOnLoad;
385 }
386
387 /**
388 * @param extraOnLoad the extraOnLoad to set
389 */
390 public void setExtraOnLoad(String extraOnLoad) {
391 this.extraOnLoad = extraOnLoad;
392 }
393
394 /**
395 * @see Lookupable#applyConditionalLogicForFieldDisplay()
396 */
397 public void applyConditionalLogicForFieldDisplay() {
398 getLookupableHelperService().applyConditionalLogicForFieldDisplay();
399 }
400
401 }