001package org.kuali.ole.service.impl; 002 003import org.apache.log4j.Logger; 004import org.kuali.ole.BibliographicRecordHandler; 005import org.kuali.ole.OLEConstants; 006import org.kuali.ole.docstore.common.client.DocstoreClientLocator; 007import org.kuali.ole.docstore.common.document.Bib; 008import org.kuali.ole.docstore.common.document.Holdings; 009import org.kuali.ole.docstore.common.document.HoldingsTree; 010import org.kuali.ole.docstore.common.document.content.bib.marc.BibMarcRecord; 011import org.kuali.ole.docstore.common.document.content.bib.marc.BibMarcRecords; 012import org.kuali.ole.docstore.common.document.content.bib.marc.xstream.BibMarcRecordProcessor; 013import org.kuali.ole.docstore.common.document.content.instance.*; 014import org.kuali.ole.docstore.common.document.content.instance.xstream.HoldingOlemlRecordProcessor; 015import org.kuali.ole.docstore.common.document.content.instance.xstream.ItemOlemlRecordProcessor; 016import org.kuali.ole.factory.OverlayFileReaderFactory; 017import org.kuali.ole.factory.OverlayOutputServiceFactory; 018import org.kuali.ole.ingest.pojo.*; 019import org.kuali.ole.pojo.OleOrderRecord; 020import org.kuali.ole.pojo.edi.LineItemOrder; 021import org.kuali.ole.service.OleOverlayActionService; 022import org.kuali.ole.service.OverlayFileReaderService; 023import org.kuali.ole.service.OverlayHelperService; 024import org.kuali.ole.service.OverlayOutputService; 025import org.kuali.ole.sys.context.SpringContext; 026import org.kuali.rice.core.api.resourceloader.GlobalResourceLoader; 027import org.kuali.rice.krad.service.KRADServiceLocator; 028 029import java.util.ArrayList; 030import java.util.HashMap; 031import java.util.List; 032 033/** 034 * Created with IntelliJ IDEA. 035 * User: vivekb 036 * Date: 3/2/13 037 * Time: 4:52 PM 038 * To change this template use File | Settings | File Templates. 039 */ 040public class OleOverlayActionServiceImpl implements OleOverlayActionService { 041 042 private static final Logger LOG = Logger.getLogger(OleOverlayActionServiceImpl.class); 043 044 private OverlayOutputService overlayDocstoreOutputService; 045 private OverlayOutputService overlayTransactionOutputService; 046 private OverlayOutputServiceFactory overlayOutputServiceFactory; 047 private OverlayFileReaderFactory overlayFileReaderFactory; 048 private BibliographicRecordHandler bibliographicRecordHandler; 049 private OverlayHelperService overlayHelperService; 050 051 private DocstoreClientLocator docstoreClientLocator; 052 private BibMarcRecordProcessor recordProcessor; 053 @Override 054 public String performOverlayLookupAction(String profileName, HashMap<String, Object> objects, String holdingId, OleOrderRecord oleOrderRecord) throws Exception { 055 String updatedResponse = null; 056 List<Item> itemList=new ArrayList<>(); 057 HoldingsTree holdingsTree = getDocstoreClientLocator().getDocstoreClient().retrieveHoldingsTree(holdingId); 058 Holdings holdings=holdingsTree.getHoldings(); 059 OleHoldings oleHoldings = new HoldingOlemlRecordProcessor().fromXML(holdingsTree.getHoldings().getContent()); 060 List<org.kuali.ole.docstore.common.document.Item> items = holdingsTree.getItems(); 061 for(org.kuali.ole.docstore.common.document.Item itemRecord:items){ 062 itemList.add(new ItemOlemlRecordProcessor().fromXML(itemRecord.getContent())); 063 } 064 HashMap<String,Boolean> persistMap = new HashMap<String, Boolean>(); 065 HashMap<String,String> actionMap = new HashMap<String, String>(); 066 OverlayOutputService overlayOutputService = null; 067 overlayDocstoreOutputService = getOverlayDocstoreOutputService(); 068 overlayTransactionOutputService = getOverlayTransactionOutputService(); 069 actionMap.put("profileName",profileName); 070 List<OleOverlayAction> oleOverlayActions = (List<OleOverlayAction>) KRADServiceLocator.getBusinessObjectService().findMatching(OleOverlayAction.class,actionMap); 071 for(OleOverlayAction oleOverlayAction : oleOverlayActions){ 072 OverlayFileReaderService overlayFileReaderService = null; 073 boolean isValid=true; 074 for(OleMappingField oleMappingField : oleOverlayAction.getOleMappingFields()){ 075 overlayFileReaderService = getOverlayFileReaderFactory().getOverlayFileReaderService(oleMappingField.getFileFormat(),objects); 076 String incomingFieldValue=null; 077 if(oleMappingField.getIncomingField()!=null){ 078 String incomingFieldFromProfile =oleMappingField.getIncomingField(); 079 incomingFieldValue = overlayFileReaderService.getInputFieldValue(incomingFieldFromProfile); 080 if (LOG.isDebugEnabled()){ 081 LOG.debug("###incomingFieldValue####"+incomingFieldValue); 082 } 083 isValid &= incomingFieldValue.equalsIgnoreCase(oleMappingField.getIncomingFieldValue()); 084 } 085 } 086 if(isValid){ 087 for(OleOutputFieldMapping oleOutputFieldMapping : oleOverlayAction.getOleOutputFieldMappings()){ 088 String targetField = getTargetField(oleOutputFieldMapping); 089 String targetFieldValue = oleOutputFieldMapping.getFieldValue(); 090 if(oleOutputFieldMapping.isLookUp() && overlayFileReaderService!=null){ 091 StringBuffer finalValueSB = new StringBuffer(); 092 List<String> dataFieldSubFieldKeyList = getDataFieldSubFieldKeyList(oleOutputFieldMapping.getFieldValue()); 093 for(String dataFieldSubField : dataFieldSubFieldKeyList){ 094 finalValueSB.append(overlayFileReaderService.getInputFieldValue(dataFieldSubField)); 095 } 096 targetFieldValue = finalValueSB.toString(); 097 } 098 performOutputMappingField(persistMap,oleOutputFieldMapping,holdings,oleHoldings,itemList,oleOrderRecord,targetField,targetFieldValue) ; 099 } 100 } 101 } 102 overlayOutputService = getOverlayOutputServiceFactory().getOverlayOutputServiceFactory(OLEConstants.OVERLAY_DOCSTORE_OUTPUT_TARGET_OBJECT); 103 if(persistMap.get(OLEConstants.OVERLAY_OLE_HOLDINGS)!=null && persistMap.get(OLEConstants.OVERLAY_OLE_HOLDINGS)){ 104 overlayOutputService.persist(oleHoldings); 105 } 106 if(persistMap.get(OLEConstants.OVERLAY_ITEM)!=null && persistMap.get(OLEConstants.OVERLAY_ITEM)){ 107 overlayOutputService.persist(items); 108 } 109 return updatedResponse; 110 } 111 @Override 112 public void updateRecordExcludingGPF(HashMap<String, String> uuids, BibMarcRecord oldMarcRecord, BibMarcRecord newBibMarcRecord,LineItemOrder lineItemOrder, List<String> gpfFieldList, List<OverlayOption> overlayOptionList, String profileName)throws Exception{ 113 String bibUUID = uuids.get(OLEConstants.BIBlIOGRAPHICUUID); 114 String holdingId = uuids.get(OLEConstants.OVERLAY_HOLDINGUUID); 115 String updatedResponse = null; 116 BibMarcRecord updateBibMarcRecord = null; 117 HashMap<String,Object> objects = new HashMap<String, Object>(); 118 objects.put(OLEConstants.MRC,newBibMarcRecord); 119 objects.put(OLEConstants.EDI,lineItemOrder); 120 Bib bib = getDocstoreClientLocator().getDocstoreClient().retrieveBib(bibUUID); 121 String bibContent=bib.getContent(); 122 BibMarcRecordProcessor recordProcessor = new BibMarcRecordProcessor(); 123 BibMarcRecords bibMarcRecords = recordProcessor.fromXML(bibContent); 124 BibMarcRecord bibMarcRecord=bibMarcRecords.getRecords().get(0); 125 updateBibMarcRecord = getOverlayHelperService().updateBibMarcRecordExcludingGPF(oldMarcRecord, newBibMarcRecord,gpfFieldList,overlayOptionList); 126 String updatedRecordContent = getBibMarcRecordHandler().generateXML(updateBibMarcRecord); 127 updatedResponse =performOverlayLookupAction(profileName, objects, holdingId, null); 128 bib.setContent(updatedRecordContent); 129 /* bib.setId(bibUUID);*/ 130 getDocstoreClientLocator().getDocstoreClient().updateBib(bib); 131 132 } 133 @Override 134 public void updateRecordIncludingGPF(HashMap<String,String> uuids,BibMarcRecord oldBibMarcRecord,BibMarcRecord newBibMarcRecord,LineItemOrder lineItemOrder,List<String> gpfFieldList,List<OverlayOption> overlayOptionList,String profileName)throws Exception{ 135 String bibUUID = uuids.get(OLEConstants.BIBlIOGRAPHICUUID); 136 String holdingId = uuids.get(OLEConstants.OVERLAY_HOLDINGUUID); 137 String updatedResponse=null; 138 HashMap<String,Object> objects = new HashMap<String, Object>(); 139 objects.put(OLEConstants.MRC,newBibMarcRecord); 140 objects.put(OLEConstants.EDI,lineItemOrder); 141 BibMarcRecord updateBibMarcRecord = null; 142 Bib bib = getDocstoreClientLocator().getDocstoreClient().retrieveBib(bibUUID); 143 String bibContent= bib.getContent(); 144 BibMarcRecordProcessor recordProcessor = new BibMarcRecordProcessor(); 145 BibMarcRecords bibMarcRecords = recordProcessor.fromXML(bibContent); 146 BibMarcRecord bibMarcRecord = bibMarcRecords.getRecords().get(0); 147 148 updateBibMarcRecord = getOverlayHelperService().updateBibMarcRecordIncludingGPF(bibMarcRecord, newBibMarcRecord, gpfFieldList, overlayOptionList); 149 String updatedRecordContent = getBibMarcRecordHandler().generateXML(updateBibMarcRecord); 150 updatedResponse = performOverlayLookupAction(profileName,objects,holdingId,null); 151 bib.setContent(updatedRecordContent); 152 153 getDocstoreClientLocator().getDocstoreClient().updateBib(bib); 154 155 156 } 157 158 private List<String> getDataFieldSubFieldKeyList(String dataFieldSubfield){ 159 String[] dataFieldSubfieldSplitArray = dataFieldSubfield.split("\\$"); 160 List<String> dataFieldSubfieldKeyList = new ArrayList<String>(); 161 StringBuffer dataFieldSubfieldKeySB = new StringBuffer(); 162 String tagName = dataFieldSubfieldSplitArray[0]; 163 for(int splitCount = 1;splitCount <dataFieldSubfieldSplitArray.length;splitCount++){ 164 dataFieldSubfieldKeySB.append(tagName).append(OLEConstants.DELIMITER_DOLLAR).append(dataFieldSubfieldSplitArray[splitCount]); 165 dataFieldSubfieldKeyList.add(dataFieldSubfieldKeySB.toString()); 166 dataFieldSubfieldKeySB = new StringBuffer(); 167 } 168 return dataFieldSubfieldKeyList; 169 } 170 private String getTargetField(OleOutputFieldMapping outputFieldMapping){ 171 String outputMappingTargeField = outputFieldMapping.getTargetField(); 172 String[] splittedOutputMappingTargeFieldArray = outputMappingTargeField.split("\\."); 173 int splittedOutputMappingTargeFieldArrayLength = splittedOutputMappingTargeFieldArray.length; 174 outputFieldMapping.setTargetObject(splittedOutputMappingTargeFieldArrayLength>1?splittedOutputMappingTargeFieldArray[0]:null); 175 outputFieldMapping.setDetailedTargetObject(splittedOutputMappingTargeFieldArrayLength>2?splittedOutputMappingTargeFieldArray[splittedOutputMappingTargeFieldArrayLength-2]:null); 176 String targetField = splittedOutputMappingTargeFieldArrayLength>0?splittedOutputMappingTargeFieldArray[splittedOutputMappingTargeFieldArrayLength-1]:null; 177 return targetField; 178 } 179 private void performOutputMappingField(HashMap<String,Boolean> persistMap,OleOutputFieldMapping outputFieldMapping,Holdings holdings ,OleHoldings oleHoldings,List<Item> itemList, OleOrderRecord oleOrderRecord,String targetField,String targetFieldValue){ 180 if(outputFieldMapping.getTargetObject().equalsIgnoreCase(OLEConstants.OVERLAY_DOCSTORE_OUTPUT_TARGET_OBJECT)){ 181 if(outputFieldMapping.getDetailedTargetObject().equals(OLEConstants.OVERLAY_INSTANCE)){ 182 overlayDocstoreOutputService.setOutPutValue(targetField,targetFieldValue,holdings); 183 persistMap.put(OLEConstants.OVERLAY_INSTANCE,true); 184 }else if(outputFieldMapping.getDetailedTargetObject().equals(OLEConstants.OVERLAY_OLE_HOLDINGS)){ 185 overlayDocstoreOutputService.setOutPutValue(targetField,targetFieldValue,oleHoldings); 186 persistMap.put(OLEConstants.OVERLAY_OLE_HOLDINGS,true); 187 }else if(outputFieldMapping.getDetailedTargetObject().equals(OLEConstants.OVERLAY_ITEM)){ 188 for(Item item : itemList){ 189 overlayDocstoreOutputService.setOutPutValue(targetField,targetFieldValue,item); 190 } 191 persistMap.put(OLEConstants.OVERLAY_ITEM,true); 192 } 193 }else if(outputFieldMapping.getTargetObject().equalsIgnoreCase(OLEConstants.OVERLAY_ORDERRECORD) && oleOrderRecord!=null){ 194 if(outputFieldMapping.getDetailedTargetObject().equalsIgnoreCase(OLEConstants.OVERLAY_TX_RECORD)) { 195 overlayTransactionOutputService.setOutPutValue(targetField,targetFieldValue,oleOrderRecord.getOleTxRecord()); 196 } 197 } 198 } 199 200 201 public OverlayOutputService getOverlayDocstoreOutputService() { 202 if(overlayDocstoreOutputService==null){ 203 overlayDocstoreOutputService = getOverlayOutputServiceFactory().getOverlayOutputServiceFactory(OLEConstants.OVERLAY_DOCSTORE_OUTPUT_TARGET_OBJECT); 204 } 205 return overlayDocstoreOutputService; 206 } 207 208 public OverlayOutputService getOverlayTransactionOutputService() { 209 if(overlayTransactionOutputService == null){ 210 overlayTransactionOutputService = getOverlayOutputServiceFactory().getOverlayOutputServiceFactory(OLEConstants.OVERLAY_ORDERRECORD); 211 } 212 return overlayTransactionOutputService; 213 } 214 215 public OverlayOutputServiceFactory getOverlayOutputServiceFactory() { 216 if(overlayOutputServiceFactory == null){ 217 overlayOutputServiceFactory =GlobalResourceLoader.getService(OLEConstants.OVERLAY_OUTPUTSERVICE_FACTORY); 218 } 219 return overlayOutputServiceFactory; 220 } 221 222 public OverlayFileReaderFactory getOverlayFileReaderFactory() { 223 if(overlayFileReaderFactory == null){ 224 overlayFileReaderFactory =GlobalResourceLoader.getService(OLEConstants.OVERLAY_FILE_READER_FACTORY); 225 } 226 return overlayFileReaderFactory; 227 } 228 private BibliographicRecordHandler getBibliographicRecordHandler(){ 229 if(bibliographicRecordHandler == null){ 230 bibliographicRecordHandler = new BibliographicRecordHandler(); 231 } 232 return bibliographicRecordHandler; 233 } 234 public OverlayHelperService getOverlayHelperService() { 235 if(overlayHelperService == null){ 236 overlayHelperService = GlobalResourceLoader.getService(OLEConstants.OVERLAY_HELPER_SERVICE); 237 } 238 return overlayHelperService; 239 } 240 241 public DocstoreClientLocator getDocstoreClientLocator() { 242 if (null == docstoreClientLocator) { 243 return SpringContext.getBean(DocstoreClientLocator.class); 244 } 245 return docstoreClientLocator; 246 } 247 248 private BibMarcRecordProcessor getBibMarcRecordHandler(){ 249 if(recordProcessor == null){ 250 recordProcessor = new BibMarcRecordProcessor(); 251 } 252 return recordProcessor; 253 } 254 255 256 257}