001/**
002 * Copyright 2005-2016 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 */
016package org.kuali.rice.krad.service.impl;
017
018import java.util.ArrayList;
019import java.util.Collection;
020import java.util.HashMap;
021import java.util.List;
022import java.util.Map;
023
024import org.apache.commons.lang.StringUtils;
025import org.kuali.rice.core.web.format.Formatter;
026import org.kuali.rice.kim.api.identity.Person;
027import org.kuali.rice.kns.document.authorization.BusinessObjectRestrictions;
028import org.kuali.rice.kns.document.authorization.FieldRestriction;
029import org.kuali.rice.kns.service.BusinessObjectAuthorizationService;
030import org.kuali.rice.kns.service.KNSServiceLocator;
031import org.kuali.rice.krad.bo.BusinessObject;
032import org.kuali.rice.krad.datadictionary.InactivationBlockingMetadata;
033import org.kuali.rice.krad.datadictionary.mask.MaskFormatter;
034import org.kuali.rice.krad.service.*;
035import org.kuali.rice.krad.util.GlobalVariables;
036import org.kuali.rice.krad.util.ObjectUtils;
037
038/**
039 * This is a description of what this class does - wliang don't forget to fill this in.
040 *
041 * @author Kuali Rice Team (rice.collab@kuali.org)
042 *
043 */
044public class InactivationBlockingDisplayServiceImpl implements InactivationBlockingDisplayService {
045        private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(InactivationBlockingDetectionServiceImpl.class);
046        
047        private PersistenceService persistenceService;
048        private DataDictionaryService dataDictionaryService;
049        private PersistenceStructureService persistenceStructureService;
050        private BusinessObjectAuthorizationService businessObjectAuthorizationService;
051        
052        /**
053         * This overridden method ...
054         *
055         * @see org.kuali.rice.krad.service.InactivationBlockingDisplayService#listAllBlockerRecords(org.kuali.rice.krad.bo.BusinessObject, org.kuali.rice.krad.datadictionary.InactivationBlockingMetadata)
056         */
057        public List<String> listAllBlockerRecords(BusinessObject blockedBo, InactivationBlockingMetadata inactivationBlockingMetadata) {
058        String inactivationBlockingDetectionServiceBeanName = inactivationBlockingMetadata.getInactivationBlockingDetectionServiceBeanName();
059        if (StringUtils.isBlank(inactivationBlockingDetectionServiceBeanName)) {
060            inactivationBlockingDetectionServiceBeanName = KRADServiceLocatorWeb.DEFAULT_INACTIVATION_BLOCKING_DETECTION_SERVICE;
061        }
062        InactivationBlockingDetectionService inactivationBlockingDetectionService = KRADServiceLocatorWeb
063                .getInactivationBlockingDetectionService(inactivationBlockingDetectionServiceBeanName);
064
065        Collection<BusinessObject> collection = inactivationBlockingDetectionService.listAllBlockerRecords(blockedBo, inactivationBlockingMetadata);
066
067        Map<String, Formatter> formatters = getFormattersForPrimaryKeyFields(inactivationBlockingMetadata.getBlockingReferenceBusinessObjectClass());
068
069        List<String> displayValues = new ArrayList<String>();
070        List<String> pkFieldNames = persistenceStructureService.listPrimaryKeyFieldNames(inactivationBlockingMetadata.getBlockingReferenceBusinessObjectClass());
071        Person user = GlobalVariables.getUserSession().getPerson();
072        
073        for (BusinessObject element : collection) {
074                StringBuilder buf = new StringBuilder();
075
076                // the following method will return a restriction for all DD-defined attributes
077                BusinessObjectRestrictions businessObjectRestrictions = getBusinessObjectAuthorizationService().getLookupResultRestrictions(element, user);
078                for (int i = 0; i < pkFieldNames.size(); i++) {
079                        String pkFieldName = pkFieldNames.get(i);
080                        Object value = ObjectUtils.getPropertyValue(element, pkFieldName);
081
082                        String displayValue = null;
083                        if (!businessObjectRestrictions.hasRestriction(pkFieldName)) {
084                                Formatter formatter = formatters.get(pkFieldName);
085                                if (formatter != null) {
086                                        displayValue = (String) formatter.format(value);
087                                }
088                                else {
089                                        displayValue = String.valueOf(value);
090                                }
091                        }
092                        else {
093                                FieldRestriction fieldRestriction = businessObjectRestrictions.getFieldRestriction(pkFieldName);
094                                if (fieldRestriction.isMasked() || fieldRestriction.isPartiallyMasked()) {
095                                        MaskFormatter maskFormatter = fieldRestriction.getMaskFormatter();
096                                                displayValue = maskFormatter.maskValue(value);
097                                }
098                                else {
099                                        // there was a restriction, but we did not know how to obey it.
100                                        LOG.warn("Restriction was defined for class: " + element.getClass() + " field name: " + pkFieldName + ", but it was not honored by the inactivation blocking display framework");
101                                }
102                        }
103
104                        buf.append(displayValue);
105                        if (i < pkFieldNames.size() - 1) {
106                                buf.append(" - ");
107                        }
108                }
109
110                displayValues.add(buf.toString());
111        }
112                return displayValues;
113        }
114
115        protected Map<String, Formatter> getFormattersForPrimaryKeyFields(Class boClass) {
116                List<String> keyNames = persistenceStructureService.listPrimaryKeyFieldNames(boClass);
117                Map<String, Formatter> formattersForPrimaryKeyFields = new HashMap<String, Formatter>();
118
119                for (String pkFieldName : keyNames) {
120                        Formatter formatter = null;
121
122                        Class<? extends Formatter> formatterClass = dataDictionaryService.getAttributeFormatter(boClass, pkFieldName);
123                        if (formatterClass != null) {
124                                try {
125                                        formatter = formatterClass.newInstance();
126                                } catch (Exception e) {
127                                        e.printStackTrace();
128                                }
129                        }
130        }
131                return formattersForPrimaryKeyFields;
132        }
133
134        public void setPersistenceService(PersistenceService persistenceService) {
135                this.persistenceService = persistenceService;
136        }
137
138        public void setPersistenceStructureService(
139                        PersistenceStructureService persistenceStructureService) {
140                this.persistenceStructureService = persistenceStructureService;
141        }
142
143        public void setDataDictionaryService(DataDictionaryService dataDictionaryService) {
144                this.dataDictionaryService = dataDictionaryService;
145        }
146        
147        protected BusinessObjectAuthorizationService getBusinessObjectAuthorizationService() {
148                if (businessObjectAuthorizationService == null) {
149                        businessObjectAuthorizationService = KNSServiceLocator.getBusinessObjectAuthorizationService();
150                }
151                return businessObjectAuthorizationService;
152        }
153}
154