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}