View Javadoc
1   package org.kuali.ole.serviceimpl;
2   
3   import org.apache.solr.client.solrj.SolrServerException;
4   import org.kuali.ole.OLESruItemHandler;
5   import org.kuali.ole.OleSRUConstants;
6   import org.kuali.ole.bo.diagnostics.OleSRUDiagnostics;
7   import org.kuali.ole.bo.serachRetrieve.*;
8   import org.kuali.ole.docstore.common.client.DocstoreClient;
9   import org.kuali.ole.docstore.common.document.Bib;
10  import org.kuali.ole.docstore.common.document.HoldingsTree;
11  import org.kuali.ole.docstore.common.document.content.bib.dc.BibDcRecord;
12  import org.kuali.ole.docstore.common.document.content.bib.dc.DCValue;
13  import org.kuali.ole.docstore.common.document.content.bib.dc.xstream.BibDcRecordProcessor;
14  import org.kuali.ole.docstore.common.document.content.instance.*;
15  import org.kuali.ole.docstore.common.document.content.instance.xstream.HoldingOlemlRecordProcessor;
16  import org.kuali.ole.docstore.common.document.content.instance.xstream.InstanceOlemlRecordProcessor;
17  import org.kuali.ole.docstore.common.document.content.instance.xstream.ItemOlemlRecordProcessor;
18  import org.kuali.ole.docstore.discovery.service.SRUCQLQueryService;
19  import org.kuali.ole.docstore.discovery.service.SRUCQLQueryServiceImpl;
20  import org.kuali.ole.docstore.engine.client.DocstoreLocalClient;
21  import org.kuali.ole.docstore.model.bo.OleDocument;
22  import org.kuali.ole.docstore.model.bo.WorkBibDocument;
23  import org.kuali.ole.docstore.model.bo.WorkInstanceDocument;
24  import org.kuali.ole.docstore.service.OleWebServiceProvider;
25  import org.kuali.ole.docstore.service.impl.OleWebServiceProviderImpl;
26  import org.kuali.ole.handler.OleSRUDublinRecordResponseHandler;
27  import org.kuali.ole.handler.OleSRUOpacXMLResponseHandler;
28  import org.kuali.ole.pojo.OLESruItem;
29  import org.kuali.ole.service.OleDiagnosticsService;
30  import org.kuali.ole.service.OleLoanDocumentWebService;
31  import org.kuali.ole.service.OleSRUDataService;
32  import org.kuali.rice.core.api.config.property.ConfigContext;
33  import org.kuali.rice.core.api.criteria.QueryByCriteria;
34  import org.kuali.rice.coreservice.impl.parameter.ParameterBo;
35  import org.kuali.rice.krad.service.KRADServiceLocator;
36  import org.slf4j.Logger;
37  import org.slf4j.LoggerFactory;
38  
39  import java.util.*;
40  
41  
42  /**
43   * Created with IntelliJ IDEA.
44   * User: ?
45   * Date: 7/9/12
46   * Time: 7:41 PM
47   * To change this template use File | Settings | File Templates.
48   */
49  public class OleSRUDataServiceImpl implements OleSRUDataService {
50  
51      private Logger LOG = LoggerFactory.getLogger(this.getClass());
52      public SRUCQLQueryService srucqlQueryService;
53      public OleDiagnosticsService oleDiagnosticsService;
54      private DocstoreClient docstoreClient;
55  
56      private HoldingOlemlRecordProcessor holdingOlemlRecordProcessor = new HoldingOlemlRecordProcessor();
57      private InstanceOlemlRecordProcessor instanceOlemlRecordProcessor = new InstanceOlemlRecordProcessor();
58      private ItemOlemlRecordProcessor itemOlemlRecordProcessor = new ItemOlemlRecordProcessor();
59      private OLESruItemHandler oleSruItemHandler;
60  
61      public OleSRUDataServiceImpl() {
62          srucqlQueryService = SRUCQLQueryServiceImpl.getInstance();
63          oleDiagnosticsService = new OleDiagnosticsServiceImpl();
64      }
65  
66      public OLESruItemHandler getOleSruItemHandler(){
67          if(oleSruItemHandler == null){
68              oleSruItemHandler = new OLESruItemHandler();
69          }
70          return oleSruItemHandler;
71      }
72  
73      /**
74       * this method will fetch the bib id list from the docstore
75       *
76       * @param reqParamMap
77       * @param solrQuery
78       * @return list of bib id
79       */
80      public List getBibRecordsIdList(Map reqParamMap, String solrQuery) {
81          LOG.info("Inside getBibRecordsIdList method");
82          List oleBibIDList = null;
83          List<OleDocument> oleDocumentsList = null;
84          try {
85              oleBibIDList = new ArrayList();
86              oleDocumentsList = (ArrayList<OleDocument>) srucqlQueryService.queryForBibDocs(reqParamMap, solrQuery);
87              if ((oleDocumentsList != null) && (oleDocumentsList.size() > 0)) {
88                  oleBibIDList = generateBibIDList(oleDocumentsList);
89              }
90          } catch (Exception e) {
91              LOG.error(e.getMessage());
92              if(e instanceof SolrServerException){
93                      if(solrQuery.contains("LocalId"))
94                          oleBibIDList.add("Invalid Local Id");
95                      else
96                  oleBibIDList.add("Exception Occured");
97  
98                  return  oleBibIDList;
99              } else
100             return null;
101         }
102         return oleBibIDList;
103     }
104 
105     /**
106      * this method will fetch the bib details , holding details from the docstore data base , creates an object for bib and holdings , and generates OPAC xml
107      *
108      * @param oleBibIDList
109      * @param reqParamMap
110      * @return opac xml or diagnostics or oleSRUResponseDocuments as a string depends upon the record packing
111      */
112     public String getOPACXMLSearchRetrieveResponse(List oleBibIDList, Map reqParamMap) {
113         LOG.info("Inside getOPACXMLSearchRetrieveResponse method");
114         try {
115             OleSRUOpacXMLResponseHandler oleSRUOpacXMLResponseHandler = new OleSRUOpacXMLResponseHandler();
116             OleSRUSearchRetrieveResponse oleSRUSearchRetrieveResponse = new OleSRUSearchRetrieveResponse();
117             oleSRUSearchRetrieveResponse.setVersion((String) reqParamMap.get(OleSRUConstants.VERSION));
118             OleSRUResponseRecords oleSRUResponseRecords = new OleSRUResponseRecords();
119             List<OleSRUResponseRecord> oleSRUResponseRecordList = new ArrayList<OleSRUResponseRecord>();
120             if (oleBibIDList != null && oleBibIDList.size() > 0) {
121                 List<OleSRUResponseDocument> oleSRUResponseDocumentList = new ArrayList<OleSRUResponseDocument>();
122                 String bibRecordInfo = null;
123                 int startPosition = 0;
124                 if ((Integer) reqParamMap.get(OleSRUConstants.START_RECORD) != 0) {
125                     startPosition = (Integer) reqParamMap.get(OleSRUConstants.START_RECORD);
126                 }
127                 for (int i = 0; i < oleBibIDList.size(); i++) {
128                     OleSRUResponseRecord oleSRUResponseRecord = new OleSRUResponseRecord();
129                     oleSRUResponseRecord.setRecordPacking((String) reqParamMap.get(OleSRUConstants.RECORD_PACKING));
130                     if ((Integer) reqParamMap.get(OleSRUConstants.START_RECORD) == 0) {
131                         oleSRUResponseRecord.setRecordPosition(i + 1);
132                     } else {
133                         oleSRUResponseRecord.setRecordPosition(startPosition + 1);
134                         startPosition = startPosition + 1;
135                     }
136                     OleSRUResponseDocument oleSRUResponseDocument = new OleSRUResponseDocument();
137                     OleSRUData oleSRUData = (OleSRUData) oleBibIDList.get(i);
138                     bibRecordInfo = getBibliographicRecordInfo(oleSRUData.getBibId());
139                     OleSRUResponseRecordData oleSRUResponseRecordData = new OleSRUResponseRecordData();
140                     String recordSchema= (String)reqParamMap.get(OleSRUConstants.RECORD_SCHEMA);
141                     if (recordSchema.equalsIgnoreCase(OleSRUConstants.OPAC_RECORD)) {
142                         List<OleSRUInstanceDocument> oleSRUInstanceDocumentList = new ArrayList<OleSRUInstanceDocument>();
143                         if (oleSRUData.getInstanceIds() != null && oleSRUData.getInstanceIds().size() > 0) {
144                             for (String instance : oleSRUData.getInstanceIds()) {
145                                 String holdingInfo = getInstanceInfoRecordInfo(instance);
146                                 OleSRUInstanceDocument oleSRUInstanceDocument = processInstanceCollectionXml(holdingInfo);
147                                 oleSRUInstanceDocumentList.add(oleSRUInstanceDocument);
148                             }
149                         }
150                         oleSRUResponseRecordData.setHoldings(oleSRUInstanceDocumentList);
151                     }
152 
153                     if (((String) reqParamMap.get(OleSRUConstants.RECORD_SCHEMA)).equalsIgnoreCase(OleSRUConstants.DUBLIN_RECORD_SCHEMA)) {
154                         String dublinRecordInfo = null;
155                         BibDcRecordProcessor qualifiedDublinRecordHandler = new BibDcRecordProcessor();
156                         BibDcRecord workBibDublinRecord = qualifiedDublinRecordHandler.fromXML(bibRecordInfo);
157                         OleSRUDublinRecord oleSRUDublinRecord = new OleSRUDublinRecord();
158                         for (DCValue dcValue : workBibDublinRecord.getDcValues()) {
159                             oleSRUDublinRecord.put(dcValue.getElement(), dcValue.getValue());
160                         }
161                         OleSRUDublinRecordResponseHandler oleSRUDublinRecordResponseHandler = new OleSRUDublinRecordResponseHandler();
162                         String dublinInfo = oleSRUDublinRecordResponseHandler.toXML(oleSRUDublinRecord);
163                         oleSRUResponseRecordData.setBibliographicRecord(dublinInfo);
164                         oleSRUResponseDocument.setOleSRUResponseRecordData(oleSRUResponseRecordData);
165                     } else {
166                         oleSRUResponseRecordData.setBibliographicRecord(bibRecordInfo);
167                         oleSRUResponseDocument.setOleSRUResponseRecordData(oleSRUResponseRecordData);
168                     }
169                     oleSRUSearchRetrieveResponse.setNumberOfRecords((Long) (reqParamMap.get(OleSRUConstants.NUMBER_OF_REORDS)));
170                     if(recordSchema == null ||(recordSchema!=null && (recordSchema.equalsIgnoreCase(OleSRUConstants.MARC) || recordSchema.equalsIgnoreCase(OleSRUConstants.MARC_SCHEMA)))){
171                         oleSRUResponseRecord.setRecordSchema(OleSRUConstants.MARC_RECORD_RESPONSE_SCHEMA);
172                     }else if(recordSchema!=null && recordSchema!=null && recordSchema.equalsIgnoreCase(OleSRUConstants.DC_SCHEMA)){
173                         oleSRUResponseRecord.setRecordSchema(OleSRUConstants.DC_RECORD_RESPONSE_SCHEMA);
174                     }else if(recordSchema!=null && recordSchema.equalsIgnoreCase(OleSRUConstants.OPAC_RECORD)){
175                         oleSRUResponseRecord.setRecordSchema(OleSRUConstants.OPAC_RECORD_RESPONSE_SCHEMA);
176                     }
177                     if (reqParamMap.containsKey(OleSRUConstants.EXTRA_REQ_DATA_KEY))
178                         oleSRUResponseRecordData.setExtraRequestData(getExtraReqDataInfo(reqParamMap));
179                     oleSRUResponseRecord.setOleSRUResponseDocument(oleSRUResponseDocument);
180                     oleSRUResponseRecordList.add(oleSRUResponseRecord);
181                 }
182                 oleSRUResponseRecords.setOleSRUResponseRecordList(oleSRUResponseRecordList);
183                 oleSRUSearchRetrieveResponse.setOleSRUResponseRecords(oleSRUResponseRecords);
184                 int maxRecords = (Integer) reqParamMap.get(OleSRUConstants.MAXIMUM_RECORDS);
185                 if (maxRecords == 0) {
186                     oleSRUSearchRetrieveResponse = new OleSRUSearchRetrieveResponse();
187                     oleSRUSearchRetrieveResponse.setVersion((String) reqParamMap.get(OleSRUConstants.VERSION));
188                     oleSRUSearchRetrieveResponse.setNumberOfRecords((Long) (reqParamMap.get(OleSRUConstants.NUMBER_OF_REORDS)));
189                     String xml = oleSRUOpacXMLResponseHandler.toXML(oleSRUSearchRetrieveResponse,(String)reqParamMap.get(OleSRUConstants.RECORD_SCHEMA));
190                     return xml;
191                 }
192                 if (OleSRUConstants.RECORD_PACK_XML.equalsIgnoreCase((String) reqParamMap.get(OleSRUConstants.RECORD_PACKING))) {
193                     String opacXML = oleSRUOpacXMLResponseHandler.toXML(oleSRUSearchRetrieveResponse,(String)reqParamMap.get(OleSRUConstants.RECORD_SCHEMA));
194                     if (null != opacXML)
195                         opacXML = replaceStringWithSymbols(opacXML);
196                     return opacXML;
197                 } else if (OleSRUConstants.RECORD_PACK_STRING.equalsIgnoreCase((String) reqParamMap.get(OleSRUConstants.RECORD_PACKING))) {
198                     return oleSRUSearchRetrieveResponse.toString();
199                 }
200             }
201             Long numberOfRecords = (Long) (reqParamMap.get(OleSRUConstants.NUMBER_OF_REORDS));
202             oleSRUSearchRetrieveResponse.setNumberOfRecords(numberOfRecords);
203             OleSRUDiagnostics oleSRUDiagnostics = null;
204             if (numberOfRecords > 0) {
205                 oleSRUDiagnostics = oleDiagnosticsService.getDiagnosticResponse(ConfigContext.getCurrentContextConfig().getProperty(OleSRUConstants.START_RECORD_UNMATCH));
206             } else {
207                 oleSRUDiagnostics = oleDiagnosticsService.getDiagnosticResponse(ConfigContext.getCurrentContextConfig().getProperty(OleSRUConstants.NORECORDS_DIAGNOSTIC_MSG));
208             }
209             int start = (Integer) reqParamMap.get(OleSRUConstants.START_RECORD);
210             if(start > numberOfRecords){
211                 oleSRUDiagnostics = oleDiagnosticsService.getDiagnosticResponse(ConfigContext.getCurrentContextConfig().getProperty(OleSRUConstants.START_RECORD_UNMATCH));
212             }
213             oleSRUSearchRetrieveResponse.setOleSRUDiagnostics(oleSRUDiagnostics);
214             return oleSRUOpacXMLResponseHandler.toXML(oleSRUSearchRetrieveResponse,(String)reqParamMap.get(OleSRUConstants.RECORD_SCHEMA));
215         } catch (Exception e) {
216             LOG.error(e.getMessage() , e );
217         }
218         return null;
219     }
220 
221     /**
222      * this will generate the list of document from docstore
223      *
224      * @param oleDocumentsList (list of OleDocument)
225      * @return bib id list
226      */
227     public List generateBibIDList(List<OleDocument> oleDocumentsList) {
228         LOG.info("Inside generateBibIDList method");
229         List oleBibIDList = new ArrayList();
230         WorkBibDocument workBibDocument = null;
231         List<OleSRUData> oleSRUDataList = new ArrayList<OleSRUData>();
232         OleSRUData oleSRUData = null;
233         for (int i = 0; i < oleDocumentsList.size(); i++) {
234             workBibDocument = (WorkBibDocument) oleDocumentsList.get(i);
235             oleSRUData = new OleSRUData();
236             oleSRUData.setBibId(workBibDocument.getId());
237             List<String> instanceList = new ArrayList<String>();
238             if (workBibDocument.getWorkInstanceDocumentList() != null) {
239                 for (WorkInstanceDocument workInstanceDocument : workBibDocument.getWorkInstanceDocumentList()) {
240                     instanceList.add(workInstanceDocument.getInstanceIdentifier());
241                 }
242             }
243             oleSRUData.setInstanceIds(instanceList);
244             oleSRUDataList.add(oleSRUData);
245         }
246         return oleSRUDataList;
247     }
248 
249     /**
250      * this method will do checkout operation of docstore which gives the bib info details
251      *
252      * @param uuid
253      * @return bib info xml as a string
254      */
255     public String getBibliographicRecordInfo(String uuid) {
256         LOG.info("Inside getBibliographicRecordInfo method");
257         String bibRecordInfo = null;
258 
259         Bib bib =  getDocstoreClient().retrieveBib(uuid);
260         bibRecordInfo = bib.getContent();
261 //        CheckoutManager checkoutManager = new CheckoutManager();
262       /*  try {
263             Request req = new Request();
264             if (DocumentUniqueIDPrefix.hasPrefix(uuid)) {
265                 Map<String, String> categoryTypeFormat = DocumentUniqueIDPrefix.getCategoryTypeFormat(uuid);
266                 String category = categoryTypeFormat.get("category");
267                 String type = categoryTypeFormat.get("type");
268                 String format = categoryTypeFormat.get("format");
269                 RequestDocument requestDocument = new RequestDocument();
270                 requestDocument.setCategory(category);
271                 requestDocument.setType(type);
272                 requestDocument.setFormat(format);
273                 requestDocument.setUuid(uuid);
274                 List<RequestDocument> requestDocuments = new ArrayList<RequestDocument>();
275                 requestDocuments.add(requestDocument);
276                 req.setOperation("checkOut");
277                 req.setUser("checkOutUser");
278                 req.setRequestDocuments(requestDocuments);
279                 Response response = BeanLocator.getDocstoreFactory().getDocumentService().process(req);
280                 if(response.getDocuments()!=null && response.getDocuments().size()>0)
281                 bibRecordInfo = response.getDocuments().get(0).getContent().getContent();
282             } else {
283                 bibRecordInfo = checkoutManager.checkOut(uuid, "defaultUser", "checkOut");
284             }
285             LOG.info("BibRecordInfo:" + bibRecordInfo);
286             if (bibRecordInfo != null) {
287                 bibRecordInfo = bibRecordInfo.replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>", "");
288                 bibRecordInfo = bibRecordInfo.replace("<collection>","");
289                 bibRecordInfo = bibRecordInfo.replace("<collection xmlns=\"http://www.loc.gov/MARC21/slim\">", "");
290                 bibRecordInfo = bibRecordInfo.replace("</collection>", "");
291                 bibRecordInfo = bibRecordInfo.replace("<record>", "<record xmlns=\"http://www.loc.gov/MARC21/slim\">");
292             }
293         } catch (Exception e) {
294             LOG.error(e.getMessage() , e );
295         }*/
296         return bibRecordInfo;
297     }
298 
299 
300     public String getInstanceInfoRecordInfo(String uuid) {
301         String instanceXml = "";
302         InstanceCollection instanceCollection = new InstanceCollection();
303         HoldingsTree holdingsTree = getDocstoreClient().retrieveHoldingsTree(uuid);
304         OleHoldings oleHoldings = holdingOlemlRecordProcessor.fromXML(holdingsTree.getHoldings().getContent());
305         Items items = new Items();
306         for(org.kuali.ole.docstore.common.document.Item itemDoc : holdingsTree.getItems()) {
307             items.getItem().add(itemOlemlRecordProcessor.fromXML(itemDoc.getContent()));
308         }
309         Instance instance = new Instance();
310         instance.setOleHoldings(oleHoldings);
311         instance.setItems(items);
312         instanceCollection.getInstance().add(instance);
313         instanceXml = instanceOlemlRecordProcessor.toXML(instanceCollection);
314         return instanceXml;
315     }
316 
317     /**
318      * to replace the encoded value from the string to original special character to display as an xml
319      *
320      * @param opacXML
321      * @return opac xml response
322      */
323     private String replaceStringWithSymbols(String opacXML) {
324         LOG.info("Inside replaceStringWithSymbols method");
325         opacXML = opacXML.replaceAll("&lt;", "<");
326         opacXML = opacXML.replaceAll("&gt;", ">");
327         opacXML = opacXML.replaceAll("&quot;", "\"");
328         opacXML = opacXML.replaceAll("&apos;", "\'");
329         //opacXML = opacXML.replaceAll("&","&amp;");
330         //opacXML = StringEscapeUtils.unescapeHtml(opacXML).replaceAll("[^\\x20-\\x7e]", "");
331         return opacXML;
332     }
333 
334     public List<OleSRUInstanceDocument> getOleSRUInstanceDocument() {
335         LOG.info("Inside getOleSRUInstanceDocument method");
336         OleSRUInstanceDocument oleSRUInstanceDocument = new OleSRUInstanceDocument();
337         List<OleSRUInstanceDocument> oleSRUInstanceDocumentList = new ArrayList<OleSRUInstanceDocument>();
338         List<OleSRUCirculationDocument> oleSRUCirculationDocumentList = getOleSRUCirculationDocument();
339         List<OleSRUInstanceVolume> oleSRUInstanceVolumeList = getOleSRUInstanceVolumes();
340         oleSRUInstanceDocument.setCallNumber("mockCallNumber");
341         oleSRUInstanceDocument.setCompleteness("mockCompleteness");
342         oleSRUInstanceDocument.setCopyNumber("mockCopyNumber");
343         oleSRUInstanceDocument.setDateOfReport("mockDateOfReport");
344         oleSRUInstanceDocument.setEncodingLevel("mockEncodingLevel");
345         oleSRUInstanceDocument.setEnumAndChron("mockEnumAndChorn");
346         oleSRUInstanceDocument.setFormat("mockFormat");
347         oleSRUInstanceDocument.setGeneralRetention("mockGeneralRentention");
348         oleSRUInstanceDocument.setLocalLocation("mockLocalLocation");
349         oleSRUInstanceDocument.setTypeOfRecord("mockTypeOfRecord");
350         oleSRUInstanceDocument.setShelvingLocation("mockShelvingLocation");
351         oleSRUInstanceDocument.setShelvingData("mockShelvingData");
352         oleSRUInstanceDocument.setReproductionNote("mockReproductionNote");
353         oleSRUInstanceDocument.setReceiptAcqStatus("mockReceiptAcqStatus");
354         oleSRUInstanceDocument.setNucCode("mockNucCode");
355         oleSRUInstanceDocument.setPublicNote("mockPublicNote");
356         oleSRUInstanceDocument.setCirculations(oleSRUCirculationDocumentList);
357         oleSRUInstanceDocument.setVolumes(oleSRUInstanceVolumeList);
358         oleSRUInstanceDocumentList.add(oleSRUInstanceDocument);
359         return oleSRUInstanceDocumentList;
360     }
361 
362     public List<OleSRUCirculationDocument> getOleSRUCirculationDocument() {
363         LOG.info("Inside getOleSRUCirculationDocument method");
364         OleSRUCirculationDocument oleSRUCirculationDocument = new OleSRUCirculationDocument();
365         List<OleSRUCirculationDocument> oleSRUCirculationDocumentList = new ArrayList<OleSRUCirculationDocument>();
366         oleSRUCirculationDocument.setAvailabilityDate("mockAvailabilityDate");
367         oleSRUCirculationDocument.setAvailableNow("mockAvailableNow");
368         oleSRUCirculationDocument.setAvailableThru("mockAvailableThru");
369         oleSRUCirculationDocument.setEnumAndChron("mockEnumAndChron");
370         oleSRUCirculationDocument.setItemId("mockItemId");
371         oleSRUCirculationDocument.setMidspine("mockMidspine");
372         oleSRUCirculationDocument.setOnHold("mockOnHold");
373         //oleSRUCirculationDocument.setRenewable("mockRenewable");
374         oleSRUCirculationDocument.setRestrictions("mockRestrictions");
375         oleSRUCirculationDocument.setTemporaryLocation("mockTemporaryLocation");
376         oleSRUCirculationDocumentList.add(oleSRUCirculationDocument);
377         return oleSRUCirculationDocumentList;
378     }
379 
380     public List<OleSRUInstanceVolume> getOleSRUInstanceVolumes() {
381         LOG.info("Inside getOleSRUInstanceVolumes method");
382         OleSRUInstanceVolume oleSRUInstanceVolume = new OleSRUInstanceVolume();
383         List<OleSRUInstanceVolume> oleSRUInstanceVolumeList = new ArrayList<OleSRUInstanceVolume>();
384         oleSRUInstanceVolume.setChronology("mockChronology");
385         oleSRUInstanceVolume.setEnumAndChron("mockEnumAndChron");
386         oleSRUInstanceVolume.setEnumeration("mockEnumeration");
387         oleSRUInstanceVolumeList.add(oleSRUInstanceVolume);
388         return oleSRUInstanceVolumeList;
389     }
390 
391     public String getExtraReqDataInfo(Map reqParamMap) {
392         LOG.info("Inside getExtraReqDataInfo method");
393         return "<theo:" + reqParamMap.get(OleSRUConstants.EXTRA_REQ_DATA_KEY) + " xmlns:theo=\"" + ConfigContext.getCurrentContextConfig().getProperty(OleSRUConstants.EXTRA_REQ_DATA_XML_NAMESPACE) + "\">\n" +
394                 reqParamMap.get(OleSRUConstants.EXTRA_REQ_DATA_VALUE) + "\n" +
395                 "</theo:" + reqParamMap.get(OleSRUConstants.EXTRA_REQ_DATA_KEY) + ">";
396     }
397 
398     public OleSRUInstanceDocument processInstanceCollectionXml(String instanceXml) {
399         LOG.info("Inside processInstanceCollectionXml method");
400         String sruTrueValue = getParameter(OleSRUConstants.BOOLEAN_FIELD_TRUE_FORMAT);
401         String sruFalseValue = getParameter(OleSRUConstants.BOOLEAN_FIELD_FALSE_FORMAT);
402         InstanceOlemlRecordProcessor instanceOlemlRecordProcessor = new InstanceOlemlRecordProcessor();
403         InstanceCollection instanceCollection = instanceOlemlRecordProcessor.fromXML(instanceXml);
404         OleSRUInstanceDocument oleSRUInstanceDocument = null;
405         if (instanceCollection != null) {
406             List<Instance> instances = instanceCollection.getInstance();
407             if (instances != null && instances.size() > 0) {
408                 for (Instance instance : instances) {
409                     oleSRUInstanceDocument = new OleSRUInstanceDocument();
410                     if (instance.getOleHoldings() != null && instance.getOleHoldings().getCallNumber() != null) {
411                         oleSRUInstanceDocument.setCallNumber(instance.getOleHoldings().getCallNumber().getNumber());
412                         oleSRUInstanceDocument.setShelvingData(instance.getOleHoldings().getCallNumber().getPrefix());
413                     }
414                     if (instance.getOleHoldings() != null) {
415                         oleSRUInstanceDocument.setReceiptAcqStatus(instance.getOleHoldings().getReceiptStatus());
416                     }
417                     if (instance.getOleHoldings().getLocation() != null) {
418                         oleSRUInstanceDocument.setLocalLocation(getLocations(instance.getOleHoldings().getLocation(), OleSRUConstants.LOCAL_LOCATION));
419                         oleSRUInstanceDocument.setShelvingLocation(getLocations(instance.getOleHoldings().getLocation(), OleSRUConstants.SHELVING_LOCATION));
420                     }
421                     Items items = instance.getItems();
422                     List<OleSRUInstanceVolume> oleSRUInstanceVolumeList = new ArrayList<OleSRUInstanceVolume>();
423                     List<OleSRUCirculationDocument> oleSRUCirculationDocumentList = new ArrayList<OleSRUCirculationDocument>();
424                     if (items != null) {
425                         List<Item> itemList = items.getItem();
426 
427                         for(int i=0;i<itemList.size();i++){
428                             Item item = itemList.get(i);
429                       /*  for (Item item : itemList) {*/
430                             if (item != null) {
431                                 oleSRUInstanceDocument.setCopyNumber(item.getCopyNumber());
432                             }
433                             OleSRUInstanceVolume oleSRUInstanceVolume = new OleSRUInstanceVolume();
434                             oleSRUInstanceVolume.setChronology(item.getChronology());
435                             oleSRUInstanceVolume.setEnumeration(item.getEnumeration());
436                             if (item.getEnumeration() != null && item.getChronology() != null) {
437                                 oleSRUInstanceVolume.setEnumAndChron(item.getEnumeration() + "," + item.getChronology());
438                             }
439                             oleSRUInstanceVolumeList.add(oleSRUInstanceVolume);
440                             OleSRUCirculationDocument oleSRUCirculationDocument = new OleSRUCirculationDocument();
441                             oleSRUCirculationDocument.setItemId(item.getBarcodeARSL());
442                             StringBuffer locationName = new StringBuffer();
443                             if (item.getLocation() != null) {
444                                 buildLocationNameAndLocationLevel(item.getLocation(), locationName);
445                             }
446 /*                            if (locationName.length() > 0) {
447                                 oleSRUCirculationDocument.setAvailableThru(locationName.toString());
448                             }*/
449                             if (item.getItemStatus() != null && item.getItemStatus().getCodeValue().equalsIgnoreCase(OleSRUConstants.ITEM_STATUS_AVAILABLE)) {
450                                 oleSRUCirculationDocument.setAvailableNow(sruTrueValue);
451                             } else {
452                                 oleSRUCirculationDocument.setAvailableNow(sruFalseValue);
453                             }
454                             if (item.getItemStatus() != null && item.getItemStatus().getCodeValue().equalsIgnoreCase(OleSRUConstants.ITEM_STATUS_ONHOLD)) {
455                                 oleSRUCirculationDocument.setOnHold(sruTrueValue);
456                             } else {
457                                 oleSRUCirculationDocument.setOnHold(sruFalseValue);
458                             }
459                             OleWebServiceProvider oleWebServiceProvider = new OleWebServiceProviderImpl();
460                             String url = ConfigContext.getCurrentContextConfig().getProperty("oleLoanWebService.url");
461                             OleLoanDocumentWebService oleLoanDocumentService = (OleLoanDocumentWebService) oleWebServiceProvider.getService("org.kuali.ole.service.OleLoanDocumentWebService", "oleLoanWebService", url);
462                             String shelvingLocation = "";
463                             if (item.getLocation() != null) {
464                                 shelvingLocation = getShelvingLocation(item.getLocation());
465                             }
466                             String itemTypeCode = "";
467                             if (item.getItemType() != null) {
468                                 itemTypeCode = item.getItemType().getCodeValue();
469                             }
470                             String sruItemContent;
471                             OLESruItem oleSruItem;
472                             if (i == 0) {
473                                 if (instance.getOleHoldings().getLocation() != null) {
474                                     sruItemContent = oleLoanDocumentService.getItemInformation(item.getItemIdentifier(), itemTypeCode, shelvingLocation, getLocations(instance.getOleHoldings().getLocation(), OleSRUConstants.SHELVING_LOCATION), getLocations(instance.getOleHoldings().getLocation(), OleSRUConstants.LOCAL_LOCATION));
475                                     oleSruItem = (OLESruItem) getOleSruItemHandler().getObjectFromXml(sruItemContent, (Object) new OLESruItem());
476                                    if(oleSruItem!=null) {
477                                    oleSRUInstanceDocument.setLocalLocation(oleSruItem.getLocalLocation());
478                                    oleSRUInstanceDocument.setShelvingLocation(oleSruItem.getShelvingLocation());
479                                         String sruIsRenewable = oleSruItem.isRenewable() ? sruTrueValue : sruFalseValue;
480                                         oleSRUCirculationDocument.setRenewable(sruIsRenewable);
481                                    oleSRUCirculationDocument.setAvailabilityDate(oleSruItem.getItemDueDate());
482                                    }
483                                }   else{
484 
485                                    sruItemContent = oleLoanDocumentService.getItemInformation(item.getItemIdentifier(),itemTypeCode,shelvingLocation,null,null);
486                                    oleSruItem = (OLESruItem)getOleSruItemHandler().getObjectFromXml(sruItemContent,(Object)new OLESruItem());
487                                   if(oleSruItem!=null){
488                                         String sruIsRenewable = oleSruItem.isRenewable() ? sruTrueValue : sruFalseValue;
489                                         oleSRUCirculationDocument.setRenewable(sruIsRenewable);
490                                         oleSRUCirculationDocument.setAvailabilityDate(oleSruItem.getItemDueDate());
491                                     }
492                                 }
493                             }
494                             oleSRUCirculationDocumentList.add(oleSRUCirculationDocument);
495                             if (item.getEnumeration() != null && item.getChronology() != null) {
496                                 oleSRUCirculationDocument.setEnumAndChron(item.getEnumeration() + "," + item.getChronology());
497                             }
498                             if(item.getAccessInformation()!= null && item.getAccessInformation().getBarcode() != null){
499                                 oleSRUCirculationDocument.setItemId(item.getAccessInformation().getBarcode());
500                             }
501                             if(item.getItemType() !=null && item.getItemType().getFullValue()!=null){
502                                 oleSRUCirculationDocument.setRestrictions(item.getItemType().getFullValue());
503                                 oleSRUCirculationDocument.setAvailableThru(item.getItemType().getFullValue());
504                             }
505                         }
506                     }
507                     oleSRUInstanceDocument.setVolumes(oleSRUInstanceVolumeList);
508                     oleSRUInstanceDocument.setCirculations(oleSRUCirculationDocumentList);
509                 }
510             }
511         }
512         return oleSRUInstanceDocument;
513     }
514 
515     private void buildLocationNameAndLocationLevel(Location location, StringBuffer locationName) {
516         if (location.getLocationLevel() != null) {
517             locationName = locationName.append(location.getLocationLevel().getName());
518 
519             if (location.getLocationLevel().getLocationLevel() != null) {
520                 locationName = locationName.append("/").append(location.getLocationLevel().getLocationLevel().getName());
521 
522                 if (location.getLocationLevel().getLocationLevel().getLocationLevel() != null) {
523                     locationName = locationName.append("/").append(location.getLocationLevel().getLocationLevel().getLocationLevel().getName());
524 
525                     if (location.getLocationLevel().getLocationLevel().getLocationLevel().getLocationLevel() != null) {
526                         locationName = locationName.append("/").append(location.getLocationLevel().getLocationLevel().getLocationLevel().getLocationLevel().getName());
527 
528                         if (location.getLocationLevel().getLocationLevel().getLocationLevel().getLocationLevel().getLocationLevel() != null) {
529                             locationName = locationName.append("/").append(location.getLocationLevel().getLocationLevel().getLocationLevel().getLocationLevel().getLocationLevel().getName());
530                         }
531                     }
532                 }
533             }
534         }
535     }
536     public String getParameter(String name) {
537         String parameter = "";
538         try {
539             Map<String, String> criteriaMap = new HashMap<String, String>();
540             criteriaMap.put("namespaceCode", "OLE-DESC");
541             criteriaMap.put("componentCode", "Describe");
542             criteriaMap.put("name", name);
543             List<ParameterBo> parametersList = (List<ParameterBo>) KRADServiceLocator.getDataObjectService().findMatching(ParameterBo.class, QueryByCriteria.Builder.andAttributes(criteriaMap).build()).getResults();
544             for (ParameterBo parameterBo : parametersList) {
545                 parameter = parameterBo.getValue();
546             }
547         } catch (Exception e) {
548             LOG.error("Exception while getting parameter value", e);
549         }
550         return parameter;
551     }
552     private String getShelvingLocation(Location location) {
553         String locationName = "";
554         if (location.getLocationLevel() != null) {
555             locationName = location.getLocationLevel().getName();
556 
557             if (location.getLocationLevel().getLocationLevel() != null) {
558                 locationName = location.getLocationLevel().getLocationLevel().getName();
559 
560                 if (location.getLocationLevel().getLocationLevel().getLocationLevel() != null) {
561                     locationName = location.getLocationLevel().getLocationLevel().getLocationLevel().getName();
562 
563                     if (location.getLocationLevel().getLocationLevel().getLocationLevel().getLocationLevel() != null) {
564                         locationName = location.getLocationLevel().getLocationLevel().getLocationLevel().getLocationLevel().getName();
565 
566                         if (location.getLocationLevel().getLocationLevel().getLocationLevel().getLocationLevel().getLocationLevel() != null) {
567                             locationName = location.getLocationLevel().getLocationLevel().getLocationLevel().getLocationLevel().getLocationLevel().getName();
568                         }
569                     }
570                 }
571             }
572         }
573         return locationName;
574     }
575     private String getLocations(Location location,String paramName) {
576         String locationName = "";
577         String level =getParameter(paramName);
578         int i = 0;
579         LocationLevel locationLevel = location.getLocationLevel();
580         if (locationLevel != null && level!=null) {
581             while (locationLevel!=null) {
582                 if (locationLevel.getLevel()!=null && locationLevel.getLevel().equalsIgnoreCase(level)) {
583                     locationName = locationLevel.getName();
584                     break;
585                 } else {
586                     locationLevel = locationLevel.getLocationLevel();
587                 }
588 
589             }
590         }
591         return locationName;
592     }
593 
594     private DocstoreClient getDocstoreClient(){
595 
596         if (docstoreClient == null) {
597             docstoreClient = new DocstoreLocalClient();
598         }
599         return docstoreClient;
600     }
601 
602 }