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}