001    /*
002     * Copyright 2011 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.kfs.sec.businessobject.lookup;
017    
018    import java.beans.PropertyDescriptor;
019    import java.sql.Date;
020    import java.util.Collection;
021    import java.util.HashMap;
022    import java.util.Iterator;
023    import java.util.List;
024    import java.util.Map;
025    import java.util.Set;
026    
027    import org.apache.commons.beanutils.PropertyUtils;
028    import org.apache.commons.lang.StringUtils;
029    import org.kuali.kfs.integration.ld.SegmentedBusinessObject;
030    import org.kuali.kfs.sec.SecKeyConstants;
031    import org.kuali.kfs.sec.service.AccessSecurityService;
032    import org.kuali.kfs.sec.util.SecUtil;
033    import org.kuali.kfs.sys.KFSConstants;
034    import org.kuali.rice.kim.bo.Person;
035    import org.kuali.rice.kns.authorization.BusinessObjectRestrictions;
036    import org.kuali.rice.kns.authorization.FieldRestriction;
037    import org.kuali.rice.kns.bo.BusinessObject;
038    import org.kuali.rice.kns.bo.PersistableBusinessObject;
039    import org.kuali.rice.kns.lookup.AbstractLookupableHelperServiceImpl;
040    import org.kuali.rice.kns.lookup.HtmlData;
041    import org.kuali.rice.kns.lookup.LookupableHelperService;
042    import org.kuali.rice.kns.service.BusinessObjectAuthorizationService;
043    import org.kuali.rice.kns.service.BusinessObjectDictionaryService;
044    import org.kuali.rice.kns.service.BusinessObjectMetaDataService;
045    import org.kuali.rice.kns.service.DataDictionaryService;
046    import org.kuali.rice.kns.service.PersistenceStructureService;
047    import org.kuali.rice.kns.util.GlobalVariables;
048    import org.kuali.rice.kns.util.KNSConstants;
049    import org.kuali.rice.kns.util.ObjectUtils;
050    import org.kuali.rice.kns.web.comparator.CellComparatorHelper;
051    import org.kuali.rice.kns.web.format.BooleanFormatter;
052    import org.kuali.rice.kns.web.format.CollectionFormatter;
053    import org.kuali.rice.kns.web.format.DateFormatter;
054    import org.kuali.rice.kns.web.format.Formatter;
055    import org.kuali.rice.kns.web.struts.form.LookupForm;
056    import org.kuali.rice.kns.web.ui.Column;
057    import org.kuali.rice.kns.web.ui.Field;
058    import org.kuali.rice.kns.web.ui.ResultRow;
059    import org.kuali.rice.kns.web.ui.Row;
060    
061    
062    /**
063     * Wraps balance inquiry lookupables so that access security can be applied to the results
064     */
065    public class AccessSecurityBalanceLookupableHelperServiceImpl implements LookupableHelperService {
066        protected static final String ACTION_URLS_EMPTY = " ";
067    
068        protected AccessSecurityService accessSecurityService;
069        protected LookupableHelperService lookupableHelperService;
070        protected BusinessObjectMetaDataService businessObjectMetaDataService;
071        protected BusinessObjectAuthorizationService businessObjectAuthorizationService;
072        protected PersistenceStructureService persistenceStructureService;
073    
074        protected boolean glInquiry;
075        protected boolean laborInquiry;
076    
077        public AccessSecurityBalanceLookupableHelperServiceImpl() {
078            glInquiry = false;
079            laborInquiry = false;
080        }
081    
082        public boolean allowsMaintenanceNewOrCopyAction() {
083            return lookupableHelperService.allowsMaintenanceNewOrCopyAction();
084        }
085    
086        public boolean allowsNewOrCopyAction(String documentTypeName) {
087            return lookupableHelperService.allowsNewOrCopyAction(documentTypeName);
088        }
089    
090        public void applyFieldAuthorizationsFromNestedLookups(Field field) {
091            lookupableHelperService.applyFieldAuthorizationsFromNestedLookups(field);
092        }
093    
094        public boolean checkForAdditionalFields(Map fieldValues) {
095            return lookupableHelperService.checkForAdditionalFields(fieldValues);
096        }
097    
098        public String getActionUrls(BusinessObject businessObject, List pkNames, BusinessObjectRestrictions businessObjectRestrictions) {
099            return lookupableHelperService.getActionUrls(businessObject, pkNames, businessObjectRestrictions);
100        }
101    
102        public String getBackLocation() {
103            return lookupableHelperService.getBackLocation();
104        }
105    
106        public Class getBusinessObjectClass() {
107            return lookupableHelperService.getBusinessObjectClass();
108        }
109    
110        public BusinessObjectDictionaryService getBusinessObjectDictionaryService() {
111            return lookupableHelperService.getBusinessObjectDictionaryService();
112        }
113    
114        public List getColumns() {
115            return lookupableHelperService.getColumns();
116        }
117    
118        public List<HtmlData> getCustomActionUrls(BusinessObject businessObject, List pkNames) {
119            return lookupableHelperService.getCustomActionUrls(businessObject, pkNames);
120        }
121    
122        public DataDictionaryService getDataDictionaryService() {
123            return lookupableHelperService.getDataDictionaryService();
124        }
125    
126        public List getDefaultSortColumns() {
127            return lookupableHelperService.getDefaultSortColumns();
128        }
129    
130        public String getDocFormKey() {
131            return lookupableHelperService.getDocFormKey();
132        }
133    
134        public String getDocNum() {
135            return lookupableHelperService.getDocNum();
136        }
137    
138        public Field getExtraField() {
139            return lookupableHelperService.getExtraField();
140        }
141    
142        public HtmlData getInquiryUrl(BusinessObject businessObject, String propertyName) {
143            return lookupableHelperService.getInquiryUrl(businessObject, propertyName);
144        }
145    
146        public String getMaintenanceUrl(BusinessObject businessObject, HtmlData htmlData, List pkNames, BusinessObjectRestrictions businessObjectRestrictions) {
147            return lookupableHelperService.getMaintenanceUrl(businessObject, htmlData, pkNames, businessObjectRestrictions);
148        }
149    
150        public Map getParameters() {
151            return lookupableHelperService.getParameters();
152        }
153    
154        public String getPrimaryKeyFieldLabels() {
155            return lookupableHelperService.getPrimaryKeyFieldLabels();
156        }
157    
158        public List<String> getReadOnlyFieldsList() {
159            return lookupableHelperService.getReadOnlyFieldsList();
160        }
161    
162        public List getReturnKeys() {
163            return lookupableHelperService.getReturnKeys();
164        }
165    
166        public String getReturnLocation() {
167            return lookupableHelperService.getReturnLocation();
168        }
169    
170        public HtmlData getReturnUrl(BusinessObject businessObject, LookupForm lookupForm, List returnKeys, BusinessObjectRestrictions businessObjectRestrictions) {
171            return lookupableHelperService.getReturnUrl(businessObject, lookupForm, returnKeys, businessObjectRestrictions);
172        }
173    
174        public HtmlData getReturnUrl(BusinessObject businessObject, Map fieldConversions, String lookupImpl, List returnKeys, BusinessObjectRestrictions businessObjectRestrictions) {
175            return lookupableHelperService.getReturnUrl(businessObject, fieldConversions, lookupImpl, returnKeys, businessObjectRestrictions);
176        }
177    
178        public List<Row> getRows() {
179            return lookupableHelperService.getRows();
180        }
181    
182        /**
183         * Gets search results and passes to access security service to apply access restrictions
184         * 
185         * @see org.kuali.rice.kns.lookup.LookupableHelperService#getSearchResults(java.util.Map)
186         */
187        public List getSearchResults(Map<String, String> fieldValues) {
188            List results = lookupableHelperService.getSearchResults(fieldValues);
189    
190            int resultSizeBeforeRestrictions = results.size();
191            if (glInquiry) {
192                accessSecurityService.applySecurityRestrictionsForGLInquiry(results, GlobalVariables.getUserSession().getPerson());
193            }
194            if (laborInquiry) {
195                accessSecurityService.applySecurityRestrictionsForLaborInquiry(results, GlobalVariables.getUserSession().getPerson());
196            }
197    
198    
199            SecUtil.compareListSizeAndAddMessageIfChanged(resultSizeBeforeRestrictions, results, SecKeyConstants.MESSAGE_BALANCE_INQUIRY_RESULTS_RESTRICTED);
200    
201            return results;
202        }
203    
204        /**
205         * Gets search results and passes to access security service to apply access restrictions
206         * 
207         * @see org.kuali.rice.kns.lookup.LookupableHelperService#getSearchResultsUnbounded(java.util.Map)
208         */
209        public List getSearchResultsUnbounded(Map<String, String> fieldValues) {
210            List results = lookupableHelperService.getSearchResultsUnbounded(fieldValues);
211    
212            int resultSizeBeforeRestrictions = results.size();
213            if (glInquiry) {
214                accessSecurityService.applySecurityRestrictionsForGLInquiry(results, GlobalVariables.getUserSession().getPerson());
215            }
216            if (laborInquiry) {
217                accessSecurityService.applySecurityRestrictionsForLaborInquiry(results, GlobalVariables.getUserSession().getPerson());
218            }
219    
220            SecUtil.compareListSizeAndAddMessageIfChanged(resultSizeBeforeRestrictions, results, SecKeyConstants.MESSAGE_BALANCE_INQUIRY_RESULTS_RESTRICTED);
221    
222            return results;
223        }
224    
225        public String getSupplementalMenuBar() {
226            return lookupableHelperService.getSupplementalMenuBar();
227        }
228    
229        public String getTitle() {
230            return lookupableHelperService.getTitle();
231        }
232    
233        public boolean isResultReturnable(BusinessObject object) {
234            return lookupableHelperService.isResultReturnable(object);
235        }
236    
237        public boolean isSearchUsingOnlyPrimaryKeyValues() {
238            return lookupableHelperService.isSearchUsingOnlyPrimaryKeyValues();
239        }
240    
241        public void performClear(LookupForm lookupForm) {
242            lookupableHelperService.performClear(lookupForm);
243        }
244    
245        public boolean performCustomAction(boolean ignoreErrors) {
246            return lookupableHelperService.performCustomAction(ignoreErrors);
247        }
248    
249        /**
250         * Need to duplicate the logic of performLookup so that getSearchResults will be called on this class and not the nested lookup helper service
251         * 
252         * @see org.kuali.rice.kns.lookup.LookupableHelperService#performLookup(org.kuali.rice.kns.web.struts.form.LookupForm, java.util.Collection, boolean)
253         */
254        public Collection performLookup(LookupForm lookupForm, Collection resultTable, boolean bounded) {
255            Map lookupFormFields = lookupForm.getFieldsForLookup();
256    
257            setBackLocation((String) lookupForm.getFieldsForLookup().get(KNSConstants.BACK_LOCATION));
258            setDocFormKey((String) lookupForm.getFieldsForLookup().get(KNSConstants.DOC_FORM_KEY));
259            Collection displayList;
260    
261    
262            preprocessDateFields(lookupFormFields);
263    
264            Map fieldsForLookup = new HashMap(lookupForm.getFieldsForLookup());
265            // call search method to get results
266            if (bounded) {
267                displayList = getSearchResults(lookupForm.getFieldsForLookup());
268            }
269            else {
270                displayList = getSearchResultsUnbounded(lookupForm.getFieldsForLookup());
271            }
272    
273            HashMap<String, Class> propertyTypes = new HashMap<String, Class>();
274    
275            boolean hasReturnableRow = false;
276    
277            List returnKeys = getReturnKeys();
278            List pkNames = businessObjectMetaDataService.listPrimaryKeyFieldNames(getBusinessObjectClass());
279            Person user = GlobalVariables.getUserSession().getPerson();
280    
281            // iterate through result list and wrap rows with return url and action urls
282            for (Iterator iter = displayList.iterator(); iter.hasNext();) {
283                BusinessObject element = (BusinessObject) iter.next();
284                if (element instanceof PersistableBusinessObject) {
285                    lookupForm.setLookupObjectId(((PersistableBusinessObject) element).getObjectId());
286                }
287    
288                BusinessObjectRestrictions businessObjectRestrictions = businessObjectAuthorizationService.getLookupResultRestrictions(element, user);
289    
290                HtmlData returnUrl = getReturnUrl(element, lookupForm, returnKeys, businessObjectRestrictions);
291    
292                String actionUrls = getActionUrls(element, pkNames, businessObjectRestrictions);
293                // Fix for JIRA - KFSMI-2417
294                if ("".equals(actionUrls)) {
295                    actionUrls = ACTION_URLS_EMPTY;
296                }
297    
298                List<Column> columns = getColumns();
299                for (Iterator iterator = columns.iterator(); iterator.hasNext();) {
300    
301                    Column col = (Column) iterator.next();
302                    Formatter formatter = col.getFormatter();
303    
304                    // pick off result column from result list, do formatting
305                    String propValue = KNSConstants.EMPTY_STRING;
306                    Object prop = ObjectUtils.getPropertyValue(element, col.getPropertyName());
307    
308                    // set comparator and formatter based on property type
309                    Class propClass = propertyTypes.get(col.getPropertyName());
310                    if (propClass == null) {
311                        try {
312                            propClass = ObjectUtils.getPropertyType(element, col.getPropertyName(), persistenceStructureService);
313                            propertyTypes.put(col.getPropertyName(), propClass);
314                        }
315                        catch (Exception e) {
316                            throw new RuntimeException("Cannot access PropertyType for property " + "'" + col.getPropertyName() + "' " + " on an instance of '" + element.getClass().getName() + "'.", e);
317                        }
318                    }
319    
320                    // formatters
321                    if (prop != null) {
322                        // for Booleans, always use BooleanFormatter
323                        if (prop instanceof Boolean) {
324                            formatter = new BooleanFormatter();
325                        }
326    
327                        // for Dates, always use DateFormatter
328                        if (prop instanceof Date) {
329                            formatter = new DateFormatter();
330                        }
331    
332                        // for collection, use the list formatter if a formatter hasn't been defined yet
333                        if (prop instanceof Collection && formatter == null) {
334                            formatter = new CollectionFormatter();
335                        }
336    
337                        if (formatter != null) {
338                            propValue = (String) formatter.format(prop);
339                        }
340                        else {
341                            propValue = prop.toString();
342                        }
343                    }
344    
345                    // comparator
346                    col.setComparator(CellComparatorHelper.getAppropriateComparatorForPropertyClass(propClass));
347                    col.setValueComparator(CellComparatorHelper.getAppropriateValueComparatorForPropertyClass(propClass));
348    
349                    propValue = maskValueIfNecessary(element.getClass(), col.getPropertyName(), propValue, businessObjectRestrictions);
350    
351                    col.setPropertyValue(propValue);
352    
353                    if (StringUtils.isNotBlank(propValue)) {
354                        col.setColumnAnchor(getInquiryUrl(element, col.getPropertyName()));
355    
356                    }
357                }
358    
359                ResultRow row = new ResultRow(columns, returnUrl.constructCompleteHtmlTag(), actionUrls);
360                row.setRowId(returnUrl.getName());
361                row.setReturnUrlHtmlData(returnUrl);
362                // because of concerns of the BO being cached in session on the ResultRow,
363                // let's only attach it when needed (currently in the case of export)
364                if (getBusinessObjectDictionaryService().isExportable(getBusinessObjectClass())) {
365                    row.setBusinessObject(element);
366                }
367                
368                if(element instanceof SegmentedBusinessObject) {
369                    for (String propertyName : ((SegmentedBusinessObject) element).getSegmentedPropertyNames()) {
370                        columns.add(setupResultsColumn(element, propertyName, businessObjectRestrictions));
371                    }
372                }
373                
374                if (element instanceof PersistableBusinessObject) {
375                    row.setObjectId((((PersistableBusinessObject) element).getObjectId()));
376                }
377    
378    
379                boolean rowReturnable = isResultReturnable(element);
380                row.setRowReturnable(rowReturnable);
381                if (rowReturnable) {
382                    hasReturnableRow = true;
383                }
384                resultTable.add(row);
385            }
386    
387            lookupForm.setHasReturnableRow(hasReturnableRow);
388    
389            return displayList;
390        }
391        
392        /**
393         * @param element
394         * @param attributeName
395         * @return Column
396         */
397        protected Column setupResultsColumn(BusinessObject element, String attributeName, BusinessObjectRestrictions businessObjectRestrictions) {
398            Column col = new Column();
399    
400            col.setPropertyName(attributeName);
401    
402            String columnTitle = getDataDictionaryService().getAttributeLabel(getBusinessObjectClass(), attributeName);
403            if (StringUtils.isBlank(columnTitle)) {
404                columnTitle = getDataDictionaryService().getCollectionLabel(getBusinessObjectClass(), attributeName);
405            }
406            col.setColumnTitle(columnTitle);
407            col.setMaxLength(getDataDictionaryService().getAttributeMaxLength(getBusinessObjectClass(), attributeName));
408    
409            Class formatterClass = getDataDictionaryService().getAttributeFormatter(getBusinessObjectClass(), attributeName);
410            Formatter formatter = null;
411            if (formatterClass != null) {
412                try {
413                    formatter = (Formatter) formatterClass.newInstance();
414                    col.setFormatter(formatter);
415                }
416                catch (InstantiationException e) {
417                    throw new RuntimeException("Unable to get new instance of formatter class: " + formatterClass.getName());
418                }
419                catch (IllegalAccessException e) {
420                    throw new RuntimeException("Unable to get new instance of formatter class: " + formatterClass.getName());
421                }
422            }
423    
424            // pick off result column from result list, do formatting
425            String propValue = KFSConstants.EMPTY_STRING;
426            Object prop = ObjectUtils.getPropertyValue(element, attributeName);
427    
428            // set comparator and formatter based on property type
429            Class propClass = null;
430            try {
431                PropertyDescriptor propDescriptor = PropertyUtils.getPropertyDescriptor(element, col.getPropertyName());
432                if (propDescriptor != null) {
433                    propClass = propDescriptor.getPropertyType();
434                }
435            }
436            catch (Exception e) {
437                throw new RuntimeException("Cannot access PropertyType for property " + "'" + col.getPropertyName() + "' " + " on an instance of '" + element.getClass().getName() + "'.", e);
438            }
439    
440            // formatters
441            if (prop != null) {
442                // for Booleans, always use BooleanFormatter
443                if (prop instanceof Boolean) {
444                    formatter = new BooleanFormatter();
445                }
446    
447                if (formatter != null) {
448                    propValue = (String) formatter.format(prop);
449                }
450                else {
451                    propValue = prop.toString();
452                }
453            }
454    
455            // comparator
456            col.setComparator(CellComparatorHelper.getAppropriateComparatorForPropertyClass(propClass));
457            col.setValueComparator(CellComparatorHelper.getAppropriateValueComparatorForPropertyClass(propClass));
458    
459            propValue = maskValueIfNecessary(element.getClass(), col.getPropertyName(), propValue, businessObjectRestrictions);
460            col.setPropertyValue(propValue);
461    
462    
463            if (StringUtils.isNotBlank(propValue)) {
464                col.setColumnAnchor(getInquiryUrl(element, col.getPropertyName()));
465            }
466            return col;
467        }
468    
469        /**
470         * changes from/to dates into the range operators the lookupable dao expects ("..",">" etc) this method modifies the passed in map and returns a list containing only the
471         * modified fields
472         * 
473         * @param lookupFormFields
474         */
475        protected Map<String, String> preprocessDateFields(Map lookupFormFields) {
476            Map<String, String> fieldsToUpdate = new HashMap<String, String>();
477            Set<String> fieldsForLookup = lookupFormFields.keySet();
478            for (String propName : fieldsForLookup) {
479                if (propName.startsWith(KNSConstants.LOOKUP_RANGE_LOWER_BOUND_PROPERTY_PREFIX)) {
480                    String fromDateValue = (String) lookupFormFields.get(propName);
481                    String dateFieldName = StringUtils.remove(propName, KNSConstants.LOOKUP_RANGE_LOWER_BOUND_PROPERTY_PREFIX);
482                    String dateValue = (String) lookupFormFields.get(dateFieldName);
483                    String newPropValue = dateValue;// maybe clean above with ObjectUtils.clean(propertyValue)
484                    if (StringUtils.isNotEmpty(fromDateValue) && StringUtils.isNotEmpty(dateValue)) {
485                        newPropValue = fromDateValue + KNSConstants.BETWEEN_OPERATOR + dateValue;
486                    }
487                    else if (StringUtils.isNotEmpty(fromDateValue) && StringUtils.isEmpty(dateValue)) {
488                        newPropValue = ">=" + fromDateValue;
489                    }
490                    else if (StringUtils.isNotEmpty(dateValue) && StringUtils.isEmpty(fromDateValue)) {
491                        newPropValue = "<=" + dateValue;
492                    } // could optionally continue on else here
493    
494                    fieldsToUpdate.put(dateFieldName, newPropValue);
495                }
496            }
497            // update lookup values from found date values to update
498            Set<String> keysToUpdate = fieldsToUpdate.keySet();
499            for (String updateKey : keysToUpdate) {
500                lookupFormFields.put(updateKey, fieldsToUpdate.get(updateKey));
501            }
502            return fieldsToUpdate;
503        }
504    
505        protected String maskValueIfNecessary(Class businessObjectClass, String propertyName, String propertyValue, BusinessObjectRestrictions businessObjectRestrictions) {
506            String maskedPropertyValue = propertyValue;
507            if (businessObjectRestrictions != null) {
508                FieldRestriction fieldRestriction = businessObjectRestrictions.getFieldRestriction(propertyName);
509                if (fieldRestriction != null && (fieldRestriction.isMasked() || fieldRestriction.isPartiallyMasked())) {
510                    maskedPropertyValue = fieldRestriction.getMaskFormatter().maskValue(propertyValue);
511                }
512            }
513            return maskedPropertyValue;
514        }
515    
516        public void setBackLocation(String backLocation) {
517            lookupableHelperService.setBackLocation(backLocation);
518        }
519    
520        public void setBusinessObjectClass(Class businessObjectClass) {
521            lookupableHelperService.setBusinessObjectClass(businessObjectClass);
522        }
523    
524        public void setDocFormKey(String docFormKey) {
525            lookupableHelperService.setDocFormKey(docFormKey);
526        }
527    
528        public void setDocNum(String docNum) {
529            lookupableHelperService.setDocNum(docNum);
530        }
531    
532        public void setFieldConversions(Map fieldConversions) {
533            lookupableHelperService.setFieldConversions(fieldConversions);
534        }
535    
536        public void setParameters(Map parameters) {
537            lookupableHelperService.setParameters(parameters);
538        }
539    
540        public void setReadOnlyFieldsList(List<String> readOnlyFieldsList) {
541            lookupableHelperService.setReadOnlyFieldsList(readOnlyFieldsList);
542        }
543    
544        public boolean shouldDisplayHeaderNonMaintActions() {
545            return lookupableHelperService.shouldDisplayHeaderNonMaintActions();
546        }
547    
548        public boolean shouldDisplayLookupCriteria() {
549            return lookupableHelperService.shouldDisplayLookupCriteria();
550        }
551    
552        public void validateSearchParameters(Map fieldValues) {
553            lookupableHelperService.validateSearchParameters(fieldValues);
554        }
555    
556        /**
557         * Sets the accessSecurityService attribute value.
558         * 
559         * @param accessSecurityService The accessSecurityService to set.
560         */
561        public void setAccessSecurityService(AccessSecurityService accessSecurityService) {
562            this.accessSecurityService = accessSecurityService;
563        }
564    
565        /**
566         * Sets the lookupableHelperService attribute value.
567         * 
568         * @param lookupableHelperService The lookupableHelperService to set.
569         */
570        public void setLookupableHelperService(LookupableHelperService lookupableHelperService) {
571            this.lookupableHelperService = lookupableHelperService;
572        }
573    
574        /**
575         * Sets the businessObjectMetaDataService attribute value.
576         * 
577         * @param businessObjectMetaDataService The businessObjectMetaDataService to set.
578         */
579        public void setBusinessObjectMetaDataService(BusinessObjectMetaDataService businessObjectMetaDataService) {
580            this.businessObjectMetaDataService = businessObjectMetaDataService;
581        }
582    
583        /**
584         * Sets the businessObjectAuthorizationService attribute value.
585         * 
586         * @param businessObjectAuthorizationService The businessObjectAuthorizationService to set.
587         */
588        public void setBusinessObjectAuthorizationService(BusinessObjectAuthorizationService businessObjectAuthorizationService) {
589            this.businessObjectAuthorizationService = businessObjectAuthorizationService;
590        }
591    
592        /**
593         * Sets the persistenceStructureService attribute value.
594         * 
595         * @param persistenceStructureService The persistenceStructureService to set.
596         */
597        public void setPersistenceStructureService(PersistenceStructureService persistenceStructureService) {
598            this.persistenceStructureService = persistenceStructureService;
599        }
600    
601        /**
602         * Sets the glInquiry attribute value.
603         * 
604         * @param glInquiry The glInquiry to set.
605         */
606        public void setGlInquiry(boolean glInquiry) {
607            this.glInquiry = glInquiry;
608        }
609    
610        /**
611         * Sets the laborInquiry attribute value.
612         * 
613         * @param laborInquiry The laborInquiry to set.
614         */
615        public void setLaborInquiry(boolean laborInquiry) {
616            this.laborInquiry = laborInquiry;
617        }
618    
619        //@Override
620        public void applyConditionalLogicForFieldDisplay() {
621            // TODO Auto-generated method stub
622        }
623    
624    }