001package org.kuali.ole.deliver.inquiry; 002 003import org.kuali.ole.OLEConstants; 004import org.kuali.ole.deliver.bo.OleDeliverRequestBo; 005import org.kuali.ole.deliver.service.OleDeliverRequestDocumentHelperServiceImpl; 006import org.kuali.ole.sys.context.SpringContext; 007import org.kuali.ole.util.DocstoreUtil; 008import org.kuali.rice.kim.impl.identity.entity.EntityBo; 009import org.kuali.rice.kim.impl.identity.name.EntityNameBo; 010import org.kuali.rice.krad.bo.BusinessObject; 011import org.kuali.rice.krad.bo.ExternalizableBusinessObject; 012import org.kuali.rice.krad.datadictionary.exception.UnknownBusinessClassAttributeException; 013import org.kuali.rice.krad.inquiry.InquirableImpl; 014import org.kuali.rice.krad.service.KRADServiceLocator; 015import org.kuali.rice.krad.service.KRADServiceLocatorWeb; 016import org.kuali.rice.krad.service.ModuleService; 017 018import java.security.GeneralSecurityException; 019import java.util.HashMap; 020import java.util.List; 021import java.util.Map; 022 023/** 024 * Created with IntelliJ IDEA. 025 * User: ? 026 * Date: 10/24/12 027 * Time: 5:19 PM 028 * To change this template use File | Settings | File Templates. 029 */ 030public class OleDeliverRequestInquirableImpl extends InquirableImpl { 031 public OleDeliverRequestDocumentHelperServiceImpl oleDeliverRequestDocumentHelperService = new OleDeliverRequestDocumentHelperServiceImpl(); 032 private DocstoreUtil docstoreUtil; 033 public DocstoreUtil getDocstoreUtil() { 034 035 if (docstoreUtil == null) { 036 docstoreUtil = SpringContext.getBean(DocstoreUtil.class); 037 038 } 039 return docstoreUtil; 040 } 041 042 043 044 private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(OleDeliverRequestInquirableImpl.class); 045 046 @Override 047 public Object retrieveDataObject(Map<String, String> parameters) { 048 if (dataObjectClass == null) { 049 LOG.error("Data object class must be set in inquirable before retrieving the object"); 050 throw new RuntimeException("Data object class must be set in inquirable before retrieving the object"); 051 } 052 053 // build list of key values from the map parameters 054 List<String> pkPropertyNames = getDataObjectMetaDataService().listPrimaryKeyFieldNames(dataObjectClass); 055 056 // some classes might have alternate keys defined for retrieving 057 List<List<String>> alternateKeyNames = this.getAlternateKeysForClass(dataObjectClass); 058 059 // add pk set as beginning so it will be checked first for match 060 alternateKeyNames.add(0, pkPropertyNames); 061 062 List<String> dataObjectKeySet = retrieveKeySetFromMap(alternateKeyNames, parameters); 063 if ((dataObjectKeySet == null) || dataObjectKeySet.isEmpty()) { 064 LOG.warn("Matching key set not found in request for class: " + getDataObjectClass()); 065 066 return null; 067 } 068 069 // found key set, now build map of key values pairs we can use to retrieve the object 070 Map<String, Object> keyPropertyValues = new HashMap<String, Object>(); 071 for (String keyPropertyName : dataObjectKeySet) { 072 String keyPropertyValue = parameters.get(keyPropertyName); 073 074 // uppercase value if needed 075 Boolean forceUppercase = Boolean.FALSE; 076 try { 077 forceUppercase = getDataDictionaryService().getAttributeForceUppercase(dataObjectClass, 078 keyPropertyName); 079 } catch (UnknownBusinessClassAttributeException ex) { 080 // swallowing exception because this check for ForceUppercase would 081 // require a DD entry for the attribute, and we will just set force uppercase to false 082 LOG.warn("Data object class " 083 + dataObjectClass 084 + " property " 085 + keyPropertyName 086 + " should probably have a DD definition.", ex); 087 } 088 089 if (forceUppercase.booleanValue() && (keyPropertyValue != null)) { 090 keyPropertyValue = keyPropertyValue.toUpperCase(); 091 } 092 093 // check security on key field 094 if (getDataObjectAuthorizationService().attributeValueNeedsToBeEncryptedOnFormsAndLinks(dataObjectClass, 095 keyPropertyName)) { 096 try { 097 keyPropertyValue = getEncryptionService().decrypt(keyPropertyValue); 098 } catch (GeneralSecurityException e) { 099 LOG.error("Data object class " 100 + dataObjectClass 101 + " property " 102 + keyPropertyName 103 + " should have been encrypted, but there was a problem decrypting it.", e); 104 throw new RuntimeException("Data object class " 105 + dataObjectClass 106 + " property " 107 + keyPropertyName 108 + " should have been encrypted, but there was a problem decrypting it.", e); 109 } 110 } 111 112 keyPropertyValues.put(keyPropertyName, keyPropertyValue); 113 } 114 115 // now retrieve the object based on the key set 116 Object dataObject = null; 117 118 ModuleService moduleService = KRADServiceLocatorWeb.getKualiModuleService().getResponsibleModuleService( 119 getDataObjectClass()); 120 if (moduleService != null && moduleService.isExternalizable(getDataObjectClass())) { 121 dataObject = moduleService.getExternalizableBusinessObject(getDataObjectClass().asSubclass( 122 ExternalizableBusinessObject.class), keyPropertyValues); 123 } else if (BusinessObject.class.isAssignableFrom(getDataObjectClass())) { 124 dataObject = getBusinessObjectService().findByPrimaryKey(getDataObjectClass().asSubclass( 125 BusinessObject.class), keyPropertyValues); 126 } 127 OleDeliverRequestBo oleDeliverRequestBo = (OleDeliverRequestBo) dataObject; 128 if (oleDeliverRequestBo.getOlePatron() != null && oleDeliverRequestBo.getOlePatron().getEntity() != null && oleDeliverRequestBo.getOlePatron().getEntity().getNames() != null && oleDeliverRequestBo.getOlePatron().getEntity().getNames().size() > 0) { 129 EntityNameBo nameBo = oleDeliverRequestBo.getOlePatron().getEntity().getNames().get(0); 130 oleDeliverRequestBo.getOlePatron().setPatronName(oleDeliverRequestBo.getOlePatron().getEntity().getNames().get(0).getFirstName() + " " + oleDeliverRequestBo.getOlePatron().getEntity().getNames().get(0).getLastName()); 131 } 132 EntityNameBo entityNameBo = getEntityNameBo(oleDeliverRequestBo.getBorrowerId()); 133 if (oleDeliverRequestBo.getBorrowerId() != null && entityNameBo != null) { 134 oleDeliverRequestBo.setFirstName(entityNameBo.getFirstName()); 135 oleDeliverRequestBo.setLastName(entityNameBo.getLastName()); 136 } 137 EntityNameBo entityNameBo1 = getEntityNameBo(oleDeliverRequestBo.getProxyBorrowerId()); 138 if (oleDeliverRequestBo.getProxyBorrowerId() != null && entityNameBo1 != null) { 139 oleDeliverRequestBo.setProxyBorrowerName(entityNameBo1.getFirstName() + entityNameBo1.getLastName()); 140 oleDeliverRequestBo.setProxyBorrowerFirstName(entityNameBo1.getFirstName()); 141 oleDeliverRequestBo.setProxyBorrowerLastName(entityNameBo1.getLastName()); 142 } 143 if (oleDeliverRequestBo.getOperatorCreateId() != null && !oleDeliverRequestBo.getOperatorCreateId().isEmpty()) { 144 oleDeliverRequestBo.setRequestCreator(OLEConstants.OleDeliverRequest.REQUESTER_OPERATOR); 145 } else if (oleDeliverRequestBo.getProxyBorrowerId() != null && !oleDeliverRequestBo.getProxyBorrowerId().isEmpty()) { 146 oleDeliverRequestBo.setRequestCreator(OLEConstants.OleDeliverRequest.REQUESTER_PROXY_PATRON); 147 } else { 148 oleDeliverRequestBo.setRequestCreator(OLEConstants.OleDeliverRequest.REQUESTER_PATRON); 149 } 150 // oleDeliverRequestBo = oleDeliverRequestDocumentHelperService.processItem(oleDeliverRequestBo); 151 getDocstoreUtil().isItemAvailableInDocStore(oleDeliverRequestBo); 152 return oleDeliverRequestBo; 153 } 154 155 public EntityNameBo getEntityNameBo(String entityId) { 156 EntityBo entityBo = getEntity(entityId); 157 if (entityBo != null) { 158 if (entityBo.getNames() != null && entityBo.getNames().size() > 0) { 159 return entityBo.getNames().get(0); 160 } 161 } 162 return null; 163 } 164 165 public EntityBo getEntity(String entityId) { 166 Map<String, String> entityMap = new HashMap<>(); 167 entityMap.put("id", entityId); 168 List<EntityBo> entityBoList = (List<EntityBo>) KRADServiceLocator.getBusinessObjectService().findMatching(EntityBo.class, entityMap); 169 if (entityBoList.size() > 0) 170 return entityBoList.get(0); 171 return null; 172 } 173 174}