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.service.impl;
017
018 import java.util.ArrayList;
019 import java.util.Collection;
020 import java.util.HashMap;
021 import java.util.List;
022 import java.util.Map;
023
024 import org.apache.commons.lang.StringUtils;
025 import org.kuali.rice.core.web.format.Formatter;
026 import org.kuali.rice.kim.api.identity.Person;
027 import org.kuali.rice.kns.document.authorization.BusinessObjectRestrictions;
028 import org.kuali.rice.kns.document.authorization.FieldRestriction;
029 import org.kuali.rice.kns.service.BusinessObjectAuthorizationService;
030 import org.kuali.rice.kns.service.KNSServiceLocator;
031 import org.kuali.rice.krad.bo.BusinessObject;
032 import org.kuali.rice.krad.datadictionary.InactivationBlockingMetadata;
033 import org.kuali.rice.krad.datadictionary.mask.MaskFormatter;
034 import org.kuali.rice.krad.service.*;
035 import org.kuali.rice.krad.util.GlobalVariables;
036 import 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 */
044 public 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