View Javadoc
1   package org.kuali.ole.docstore.document.rdbms;
2   
3   import org.apache.commons.lang.StringUtils;
4   import org.apache.solr.common.SolrDocument;
5   import org.kuali.ole.DocumentUniqueIDPrefix;
6   import org.kuali.ole.docstore.OleDocStoreException;
7   import org.kuali.ole.docstore.common.document.content.instance.*;
8   import org.kuali.ole.docstore.common.document.content.instance.xstream.InstanceOlemlRecordProcessor;
9   import org.kuali.ole.docstore.common.document.content.instance.xstream.ItemOlemlRecordProcessor;
10  import org.kuali.ole.docstore.model.enums.DocCategory;
11  import org.kuali.ole.docstore.model.enums.DocFormat;
12  import org.kuali.ole.docstore.model.enums.DocType;
13  import org.kuali.ole.docstore.engine.service.storage.rdbms.pojo.*;
14  import org.kuali.ole.docstore.model.xmlpojo.ingest.AdditionalAttributes;
15  import org.kuali.ole.docstore.model.xmlpojo.ingest.Content;
16  import org.kuali.ole.docstore.model.xmlpojo.ingest.Request;
17  import org.kuali.ole.docstore.model.xmlpojo.ingest.RequestDocument;
18  import org.kuali.ole.docstore.model.xmlpojo.ingest.ResponseDocument;
19  import org.kuali.ole.docstore.process.ProcessParameters;
20  import org.kuali.ole.docstore.service.ServiceLocator;
21  import org.kuali.ole.pojo.OleException;
22  import org.kuali.ole.utility.callnumber.CallNumberFactory;
23  import org.kuali.ole.utility.callnumber.CallNumberType;
24  import org.kuali.rice.krad.service.BusinessObjectService;
25  import org.kuali.rice.krad.service.KRADServiceLocator;
26  import org.slf4j.Logger;
27  import org.slf4j.LoggerFactory;
28  
29  import javax.jcr.Node;
30  import javax.jcr.RepositoryException;
31  import javax.xml.datatype.DatatypeConfigurationException;
32  import javax.xml.datatype.DatatypeFactory;
33  import javax.xml.datatype.XMLGregorianCalendar;
34  import java.io.FileNotFoundException;
35  import java.sql.Timestamp;
36  import java.text.DateFormat;
37  import java.text.Format;
38  import java.text.ParseException;
39  import java.text.SimpleDateFormat;
40  import java.util.ArrayList;
41  import java.util.Collection;
42  import java.util.Date;
43  import java.util.GregorianCalendar;
44  import java.util.HashMap;
45  import java.util.List;
46  import java.util.Map;
47  import java.util.Set;
48  
49  /**
50   * Created with IntelliJ IDEA.
51   * User: mjagan
52   * Date: 6/28/13
53   * Time: 3:11 PM
54   * To change this template use File | Settings | File Templates.
55   */
56  public class RdbmsWorkInstanceDocumentManager extends RdbmsAbstarctDocumentManager {
57  
58      private static RdbmsWorkInstanceDocumentManager ourInstanceRdbms = null;
59      private static final Logger LOG = LoggerFactory.getLogger(RdbmsWorkInstanceDocumentManager.class);
60      private BusinessObjectService businessObjectService;
61  
62      public static RdbmsWorkInstanceDocumentManager getInstance() {
63          if (null == ourInstanceRdbms) {
64              ourInstanceRdbms = new RdbmsWorkInstanceDocumentManager();
65          }
66          return ourInstanceRdbms;
67      }
68  
69      public BusinessObjectService getBusinessObjectService() {
70          if (null == businessObjectService) {
71              businessObjectService = KRADServiceLocator.getBusinessObjectService();
72          }
73          return businessObjectService;
74      }
75  
76      @Override
77      public Node storeDocument(RequestDocument requestDocument, Object object, ResponseDocument responseDocument) throws OleDocStoreException {
78          String bibUUid = null;
79          String prefixedUuid = responseDocument.getUuid();
80          if ((responseDocument.getUuid() != null) && (!"".equals(requestDocument.getUuid()))) {
81              bibUUid = DocumentUniqueIDPrefix.getDocumentId(responseDocument.getUuid());
82          }
83          try {
84              responseDocument.setUuid("");
85              InstanceOlemlRecordProcessor instanceOlemlRecordProcessor = new InstanceOlemlRecordProcessor();
86              businessObjectService = (BusinessObjectService) object;
87              if (requestDocument.getContent() == null || requestDocument.getContent().getContent() == null) {
88                  return null;
89              }
90              InstanceCollection instanceCollection = new InstanceOlemlRecordProcessor().fromXML(requestDocument.getContent().getContent());
91              if (instanceCollection.getInstance() != null && instanceCollection.getInstance().size() > 0) {
92                  Instance instance = instanceCollection.getInstance().get(0);
93                  List<String> resIdList = new ArrayList<String>();
94                  resIdList.addAll(instance.getResourceIdentifier());
95                  List<String> resIdList1 = new ArrayList<String>();
96                  resIdList1.addAll(resIdList);
97                  for (String resId : instance.getResourceIdentifier()) {
98                      Map bibMap = new HashMap();
99                      bibMap.put("bibId", DocumentUniqueIDPrefix.getDocumentId(resId));
100                     List<BibRecord> bibRecords = (List<BibRecord>) getBusinessObjectService().findMatching(BibRecord.class, bibMap);
101                     if (bibRecords != null && bibRecords.size() == 0) {
102                         resIdList1.remove(resId);
103                         return null;
104                     }
105                 }
106                 instance.setResourceIdentifier(resIdList1);
107 //                resolveLinkingWithBib(instance);
108                 if (instance.getResourceIdentifier() != null && instance.getResourceIdentifier().size() > 0) {
109                     bibUUid = DocumentUniqueIDPrefix.getDocumentId(instance.getResourceIdentifier().get(0));
110                     //TODO: If input file contains multiple ResourceIdentifiers then store the record in to bib-instance table
111                 }
112 //                if (instance.getResourceIdentifier().size() == 1) {
113 //                    if (instance.getResourceIdentifier().get(0) == null || ""
114 //                            .equals(instance.getResourceIdentifier().get(0))) {
115 //                        instance.getResourceIdentifier().remove(0);
116 //                    }
117 //                }
118                 OleHoldings oleHoldings = instance.getOleHoldings();
119                 processCallNumber(oleHoldings);
120                 Items items = instance.getItems();
121                 String uniqueIdPrefixforInstance = DocumentUniqueIDPrefix.getPrefix(requestDocument.getCategory(), requestDocument.getType(), requestDocument.getFormat());
122                 InstanceRecord instanceRecord = saveInstancerecord(bibUUid, uniqueIdPrefixforInstance);
123                 String instanceId = instanceRecord.getInstanceId();
124                 List<String> resIds = instance.getResourceIdentifier();
125                 List<String> prefixedResourceId = new ArrayList<>();
126                 for (String resId : resIds) {
127                     String prefixedBibId = DocumentUniqueIDPrefix.getPrefixedId(DocumentUniqueIDPrefix.PREFIX_WORK_BIB_MARC, resId);
128                     prefixedResourceId.add(prefixedBibId);
129                 }
130                 //saveBibInstanceRecord(resIds, instanceId);
131 
132                 String uniqueIdPrefixForHoldings = DocumentUniqueIDPrefix.getPrefix(requestDocument.getCategory(), DocType.HOLDINGS.getCode(), requestDocument.getFormat());
133                 HoldingsRecord holdingsRecord = null;
134                 if (oleHoldings.getExtension() != null && oleHoldings.getExtension().getContent() != null && oleHoldings.getExtension().getContent().size() > 0) {
135                     if (oleHoldings.getExtension().getContent().get(0) != null) {
136                         AdditionalAttributes additionalAttributes = (AdditionalAttributes) oleHoldings.getExtension().getContent().get(0);
137                         String staffOnlyFlagForHoldingsNew = additionalAttributes.getAttributeMap().get("staffOnlyFlag");
138                         if (staffOnlyFlagForHoldingsNew != null) {
139                             holdingsRecord = saveHoldingsRecord(oleHoldings, instanceId, uniqueIdPrefixForHoldings, staffOnlyFlagForHoldingsNew, additionalAttributes);
140                         } else if (requestDocument.getAdditionalAttributes() != null) {
141                             //additionalAttributes = requestDocument.getAdditionalAttributes();
142                             String staffOnlyFlagForHoldings = additionalAttributes.getAttribute(AdditionalAttributes.STAFFONLYFLAG);
143                             additionalAttributes = requestDocument.getAdditionalAttributes();
144                             holdingsRecord = saveHoldingsRecord(oleHoldings, instanceId, uniqueIdPrefixForHoldings, staffOnlyFlagForHoldings, additionalAttributes);
145                         } else {
146                             additionalAttributes = requestDocument.getAdditionalAttributes();
147                             holdingsRecord = saveHoldingsRecord(oleHoldings, instanceId, uniqueIdPrefixForHoldings, "false", additionalAttributes);
148                         }
149                     }
150                 } else {
151                     AdditionalAttributes additionalAttributes = requestDocument.getAdditionalAttributes();
152                     String staffOnlyFlagForHoldings = null;
153                     if (additionalAttributes != null) {
154                         staffOnlyFlagForHoldings = additionalAttributes.getAttribute(AdditionalAttributes.STAFFONLYFLAG);
155                         additionalAttributes = requestDocument.getAdditionalAttributes();
156                     } else {
157                         if (additionalAttributes == null) {
158                             additionalAttributes = new AdditionalAttributes();
159                             String holdingsCreatedDate = null;
160                             Format formatter = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
161                             holdingsCreatedDate = formatter.format(new Date());
162                             additionalAttributes.setAttribute(AdditionalAttributes.HOLDINGS_CREATED_BY, "BulkIngest-User");
163                             additionalAttributes.setAttribute(AdditionalAttributes.HOLDINGS_DATE_ENTERED, holdingsCreatedDate);
164                         }
165                         staffOnlyFlagForHoldings = "false";
166                     }
167                     holdingsRecord = saveHoldingsRecord(oleHoldings, instanceId, uniqueIdPrefixForHoldings, staffOnlyFlagForHoldings, additionalAttributes);
168                 }
169                 //HoldingsRecord holdingsRecord = saveHoldingsRecord(oleHoldings, instanceId, uniqueIdPrefixForHoldings);
170                 String uniqueIdPrefixForItem = DocumentUniqueIDPrefix.getPrefix(requestDocument.getCategory(), DocType.ITEM.getCode(), requestDocument.getFormat());
171                 List<ItemRecord> itemRecords = saveItemRecords(items, instanceId, uniqueIdPrefixForItem, oleHoldings);
172                 instance.setInstanceIdentifier(DocumentUniqueIDPrefix.getPrefixedId(instanceRecord.getUniqueIdPrefix(), instanceRecord.getInstanceId()));
173                 instance.getOleHoldings().setHoldingsIdentifier(DocumentUniqueIDPrefix.getPrefixedId(holdingsRecord.getUniqueIdPrefix(), holdingsRecord.getHoldingsId()));
174                 for (int i = 0; i < itemRecords.size(); i++) {
175                     instance.getItems().getItem().get(i).setItemIdentifier(DocumentUniqueIDPrefix.getPrefixedId(itemRecords.get(i).getUniqueIdPrefix(), itemRecords.get(i).getItemId()));
176                 }
177                 instance.getResourceIdentifier().clear();
178                 instance.getResourceIdentifier().addAll(prefixedResourceId);
179                 instanceCollection.getInstance().set(0, instance);
180                 requestDocument.getContent().setContentObject(instanceCollection);
181                 requestDocument.getContent().setContent(instanceOlemlRecordProcessor.toXML(instanceCollection));
182                 requestDocument.setUuid(DocumentUniqueIDPrefix.getPrefixedId(instanceRecord.getUniqueIdPrefix(), instanceId));
183                 buildResponseDocument(responseDocument, holdingsRecord, itemRecords, instanceRecord);
184             }
185         } catch (Exception e) {
186             LOG.error("Exception :" + e);
187             Map map = new HashMap();
188             map.put("bibId", bibUUid);
189             businessObjectService.deleteMatching(BibRecord.class, map);
190             buildFailureResponse(requestDocument, responseDocument);
191         }
192 
193         return null;
194     }
195 
196     private void buildFailureResponse(RequestDocument requestDocument, ResponseDocument responseDocument) {
197         responseDocument.setId(requestDocument.getId());
198         responseDocument.setStatus("Ingest Failed");
199     }
200 
201     private void buildResponseDocument(ResponseDocument responseDocument, HoldingsRecord holdingsRecord, List<ItemRecord> itemRecords, InstanceRecord instanceRecord) {
202         responseDocument.setUuid(DocumentUniqueIDPrefix.getPrefixedId(instanceRecord.getUniqueIdPrefix(), instanceRecord.getInstanceId()));
203         responseDocument.setCategory(DocCategory.WORK.getCode());
204         responseDocument.setType(DocType.INSTANCE.getCode());
205         responseDocument.setFormat(DocFormat.OLEML.getCode());
206         responseDocument.setStatus("Success");
207 
208         List<ResponseDocument> responseDocuments = new ArrayList<ResponseDocument>();
209 
210         ResponseDocument holdingResponseDocument = new ResponseDocument();
211         holdingResponseDocument.setCategory(DocCategory.WORK.getCode());
212         holdingResponseDocument.setType(DocType.HOLDINGS.getCode());
213         holdingResponseDocument.setFormat(DocFormat.OLEML.getCode());
214         holdingResponseDocument.setUuid(DocumentUniqueIDPrefix.getPrefixedId(holdingsRecord.getUniqueIdPrefix(), holdingsRecord.getHoldingsId()));
215         responseDocuments.add(holdingResponseDocument);
216 
217         for (ItemRecord itemRecord : itemRecords) {
218             ResponseDocument itemResponseDocument = new ResponseDocument();
219             itemResponseDocument.setUuid(DocumentUniqueIDPrefix.getPrefixedId(itemRecord.getUniqueIdPrefix(), itemRecord.getItemId()));
220             itemResponseDocument.setCategory(DocCategory.WORK.getCode());
221             itemResponseDocument.setType(DocType.ITEM.getCode());
222             itemResponseDocument.setFormat(DocFormat.OLEML.getCode());
223             responseDocuments.add(itemResponseDocument);
224         }
225         responseDocument.setLinkedDocuments(responseDocuments);
226 
227     }
228 
229     private InstanceRecord saveInstancerecord(String bibId, String prefix) {
230 
231         InstanceRecord instanceRecord = new InstanceRecord();
232         instanceRecord.setBibId(bibId);
233         instanceRecord.setUniqueIdPrefix(prefix);
234         getBusinessObjectService().save(instanceRecord);
235         return instanceRecord;
236     }
237 
238     /*   private void saveBibInstanceRecord(List<String> resIds, String instanceId) {
239             for (String resId : resIds) {
240                 Map bibMap = new HashMap();
241                 bibMap.put("bibId", resId);
242                 List<BibRecord> bibRecords = (List<BibRecord>) getBusinessObjectService().findMatching(BibRecord.class, bibMap);
243                 if (bibRecords != null && bibRecords.size() > 0) {
244                     BibInstanceRecord bibInstanceRecord = new BibInstanceRecord();
245                     bibInstanceRecord.setBibId(DocumentUniqueIDPrefix.getDocumentId(resId));
246                     bibInstanceRecord.setHoldingsId(instanceId);
247                     getBusinessObjectService().save(bibInstanceRecord);
248                 }
249             }
250         }
251 
252        private HoldingsRecord saveHoldingsRecord(OleHoldings oleHoldings, String instanceId, String prefix) {
253 
254             HoldingsRecord holdingsRecord = new HoldingsRecord();
255             holdingsRecord.setHoldingsId(instanceId);
256             holdingsRecord.setUniqueIdPrefix(prefix);
257             saveHoldingsRecord(oleHoldings, holdingsRecord);
258             return holdingsRecord;
259         }
260 
261         private HoldingsRecord saveHoldingsRecord(OleHoldings oleHoldings, String instanceId, String prefix, String staffOnlyFlagForHoldings) {
262 
263             HoldingsRecord holdingsRecord = new HoldingsRecord();
264             holdingsRecord.setHoldingsId(instanceId);
265             holdingsRecord.setUniqueIdPrefix(prefix);
266             holdingsRecord.setStaffOnlyFlag(Boolean.valueOf(staffOnlyFlagForHoldings));
267             saveHoldingsRecord(oleHoldings, holdingsRecord);
268             return holdingsRecord;
269         }
270     */
271     private HoldingsRecord saveHoldingsRecord(OleHoldings oleHoldings, String instanceId, String prefix, String staffOnlyFlagForHoldings,AdditionalAttributes additionalAttributes) {
272 
273         HoldingsRecord holdingsRecord = new HoldingsRecord();
274         //  holdingsRecord.setInstanceId(instanceId);
275         holdingsRecord.setUniqueIdPrefix(prefix);
276         saveHoldingsRecordAdditonalAttributesForDate(holdingsRecord, additionalAttributes);
277         if (staffOnlyFlagForHoldings != null) {
278             holdingsRecord.setStaffOnlyFlag(Boolean.valueOf(staffOnlyFlagForHoldings));
279         }
280         saveHoldingsRecord(oleHoldings, holdingsRecord);
281         return holdingsRecord;
282     }
283 
284     protected void saveHoldingsRecord(OleHoldings oleHoldings, HoldingsRecord holdingsRecord) {
285 
286         StringBuffer locationLevel = new StringBuffer("");
287         holdingsRecord.setLocation(getLocation(oleHoldings.getLocation(), locationLevel));
288         holdingsRecord.setLocationLevel(locationLevel.toString());
289         if (oleHoldings.getCallNumber() != null) {
290             CallNumber callNumber = oleHoldings.getCallNumber();
291             holdingsRecord.setCallNumberPrefix(callNumber.getPrefix());
292             holdingsRecord.setCallNumber(callNumber.getNumber());
293 
294             if (callNumber.getShelvingOrder() != null) {
295                 holdingsRecord.setShelvingOrder(callNumber.getShelvingOrder().getFullValue());
296             }
297             CallNumberTypeRecord callNumberTypeRecord = saveCallNumberTypeRecord(callNumber.getShelvingScheme());
298             holdingsRecord.setCallNumberTypeId(callNumberTypeRecord == null ? null : callNumberTypeRecord.getCallNumberTypeId());
299 
300         }
301         if (oleHoldings.getReceiptStatus() != null) {
302             ReceiptStatusRecord receiptStatusRecord = saveReceiptStatusRecord(oleHoldings.getReceiptStatus());
303             holdingsRecord.setReceiptStatusId(receiptStatusRecord == null ? null : receiptStatusRecord.getReceiptStatusId());
304         }
305         holdingsRecord.setContent("mock content");
306         holdingsRecord.setExtentOfOwnerShipRecords(null);
307         holdingsRecord.setDonorList(null);
308       //  holdingsRecord.setAccessUriRecords(null);
309         holdingsRecord.setHoldingsNoteRecords(null);
310         if (oleHoldings.getCopyNumber() != null) {
311             holdingsRecord.setCopyNumber(oleHoldings.getCopyNumber());
312         }
313         getBusinessObjectService().save(holdingsRecord);
314         saveExtentOfOwnerShip(oleHoldings.getExtentOfOwnership(), holdingsRecord.getHoldingsId());
315         saveHoldingNoteRecords(oleHoldings.getNote(), holdingsRecord.getHoldingsId());
316         saveAccessUriRecord(oleHoldings.getUri(), holdingsRecord.getHoldingsId());
317     }
318 
319 
320     private List<ItemRecord> saveItemRecords(Items items, String instanceId, String prefix, OleHoldings oleHoldings) throws OleDocStoreException {
321 
322         List<ItemRecord> itemRecords = new ArrayList<ItemRecord>();
323         for (Item item : items.getItem()) {
324             updateShelvingOrder(item, oleHoldings);
325             ItemRecord itemRecord = new ItemRecord();
326            // itemRecord.setInstanceId(instanceId);
327             itemRecord.setUniqueIdPrefix(prefix);
328             saveItemRecord(item, itemRecord);
329             itemRecords.add(itemRecord);
330         }
331 
332 
333         return itemRecords;
334     }
335 
336     protected void saveItemRecord(Item item, ItemRecord itemRecord) {
337         itemRecord.setBarCodeArsl(item.getBarcodeARSL());
338         if (item.getCallNumber() != null) {
339 
340             CallNumber callNumber = item.getCallNumber();
341             itemRecord.setCallNumberPrefix(callNumber.getPrefix());
342             itemRecord.setCallNumber(callNumber.getNumber());
343             if (callNumber.getShelvingOrder() != null) {
344                 itemRecord.setShelvingOrder(callNumber.getShelvingOrder().getFullValue());
345             }
346             if (callNumber.getShelvingScheme() != null) {
347                 CallNumberTypeRecord callNumberTypeRecord = saveCallNumberTypeRecord(callNumber.getShelvingScheme());
348                 itemRecord.setCallNumberTypeId(callNumberTypeRecord == null ? null : callNumberTypeRecord.getCallNumberTypeId());
349             }
350         }
351         if (item.getAccessInformation() != null) {
352             itemRecord.setBarCode(item.getAccessInformation().getBarcode());
353         }
354         if (item.getItemType() != null) {
355             ItemTypeRecord itemTypeRecord = saveItemTypeRecord(item.getItemType());
356             itemRecord.setItemTypeId(itemTypeRecord == null ? null : itemTypeRecord.getItemTypeId());
357         }
358         if (item.getStatisticalSearchingCode() != null) {
359             StatisticalSearchRecord statisticalSearchRecord = saveStatisticalSearchRecord(item.getStatisticalSearchingCode());
360             itemRecord.setStatisticalSearchId(statisticalSearchRecord == null ? null : statisticalSearchRecord.getStatisticalSearchId());
361         }
362         if (item.getTemporaryItemType() != null) {
363             ItemTypeRecord tempItemTypeRecord = saveItemTypeRecord(item.getTemporaryItemType());
364             itemRecord.setTempItemTypeId(tempItemTypeRecord == null ? null : tempItemTypeRecord.getItemTypeId());
365         }
366         itemRecord.setChronology(item.getChronology());
367         itemRecord.setCopyNumber(item.getCopyNumber());
368         itemRecord.setEnumeration(item.getEnumeration());
369 
370         itemRecord.setNumberOfPieces(item.getNumberOfPieces());
371         itemRecord.setPurchaseOrderItemLineId(item.getPurchaseOrderLineItemIdentifier());
372         itemRecord.setVendorLineItemId(item.getVendorLineItemIdentifier());
373         itemRecord.setFund(item.getFund());
374         itemRecord.setPrice(item.getPrice());
375         itemRecord.setCheckInNote(item.getCheckinNote());
376         itemRecord.setFastAddFlag(item.isFastAddFlag() ? Boolean.TRUE : Boolean.FALSE);
377         itemRecord.setItemDamagedStatus(item.isItemDamagedStatus());
378         itemRecord.setMissingPieceFlag(item.isMissingPieceFlag());
379         if (item.isMissingPieceFlag() == true) {
380             if (item.getMissingPieceEffectiveDate() != null && !item.getMissingPieceEffectiveDate().equalsIgnoreCase("")) {
381                 SimpleDateFormat df = new SimpleDateFormat("MM/dd/yyyy");
382                 Date parsedDate = null;
383                 try {
384                     parsedDate = df.parse(item.getMissingPieceEffectiveDate());
385                 } catch (ParseException e) {
386                     LOG.error("Exception : ", e);
387                 }
388                 Timestamp timestamp = new Timestamp(parsedDate.getTime());
389                 itemRecord.setMissingPieceEffectiveDate(timestamp);
390             } else {
391                 Timestamp timestamp = new Timestamp((new Date()).getTime());
392                 itemRecord.setMissingPieceEffectiveDate(timestamp);
393             }
394         }
395         if(item.getMissingPiecesCount()!=null && !item.getMissingPiecesCount().equalsIgnoreCase("")){
396             int missingPieceCount = Integer.parseInt(item.getMissingPiecesCount());
397             if (missingPieceCount == 0) {
398                 item.setMissingPieceFlag(false);
399                 item.setMissingPiecesCount("");
400             } else {
401                 itemRecord.setMissingPiecesCount(item.getMissingPiecesCount());
402             }
403         }
404         //itemRecord.setEffectiveDate(item.getItemStatusEffectiveDate());
405 
406 
407         itemRecord.setClaimsReturnedFlag(item.isClaimsReturnedFlag());
408 
409         String claimsReturnDate = item.getClaimsReturnedFlagCreateDate();
410         if (claimsReturnDate != null) {
411             //itemRecord.setClaimsReturnedFlagCreateDate(new Timestamp(item.getClaimsReturnedFlagCreateDate().toGregorianCalendar().getTimeInMillis()));
412             //itemRecord.setClaimsReturnedFlagCreateDate(new Timestamp(item.getClaimsReturnedFlagCreateDate()));
413             String[] claimsReturnDateArray = claimsReturnDate.split(" ");
414             if (claimsReturnDateArray.length == 1 && claimsReturnDateArray[0] != "") {
415                 claimsReturnDate = claimsReturnDate + " 00:00:00";
416                 claimsReturnsCreateDateItem(item, itemRecord, claimsReturnDate);
417             } else if (claimsReturnDateArray.length > 1) {
418                 claimsReturnsCreateDateItem(item, itemRecord, claimsReturnDate);
419             } else {
420                 itemRecord.setClaimsReturnedFlagCreateDate(null);
421             }
422         } else {
423             itemRecord.setClaimsReturnedFlagCreateDate(null);
424         }
425 
426         String dueDateItem = item.getDueDateTime();
427         if (dueDateItem != null) {
428             //Timestamp timestamp = new Timestamp(item.getDueDateTime().toGregorianCalendar().getTimeInMillis());
429             //itemRecord.setDueDateTime(timestamp);
430             String[] dueDateItemArray = dueDateItem.split(" ");
431             if (dueDateItemArray.length == 1 && dueDateItemArray[0] != "") {
432                 dueDateItem = dueDateItem + " 00:00:00";
433                 dueDateTime(item, itemRecord, dueDateItem);
434             } else if (dueDateItemArray.length > 1) {
435                 dueDateTime(item, itemRecord, dueDateItem);
436             } else {
437                 itemRecord.setDueDateTime(null);
438             }
439         } else {
440             itemRecord.setDueDateTime(null);
441         }
442 
443         itemRecord.setClaimsReturnedNote(item.getClaimsReturnedNote());
444         itemRecord.setProxyBorrower(item.getProxyBorrower());
445         itemRecord.setCurrentBorrower(item.getCurrentBorrower());
446 
447         itemRecord.setFastAddFlag(item.isFastAddFlag());
448         String effectiveDateForItem = item.getItemStatusEffectiveDate();
449         if (effectiveDateForItem != null) {
450             String[] effectiveDateForItemArray = effectiveDateForItem.split(" ");
451             if (effectiveDateForItemArray.length == 1 && effectiveDateForItemArray[0] != "") {
452                 effectiveDateForItem = effectiveDateForItem + " 00:00:00";
453                 effectiveDateItem(item, itemRecord, effectiveDateForItem);
454             } else if (effectiveDateForItemArray.length > 1) {
455                 effectiveDateItem(item, itemRecord, effectiveDateForItem);
456             } else {
457                 itemRecord.setEffectiveDate(null);
458             }
459         } else {
460             itemRecord.setEffectiveDate(null);
461         }
462 
463 
464         // itemRecord.setStaffOnly(item.isStaffOnlyFlag() ? "true" : "false");
465         String staffOnlyFlagForItem = null;
466         if (item.getExtension() != null && item.getExtension().getContent().size() > 0 && item.getExtension().getContent().get(0) != null) {
467             AdditionalAttributes additionalAttributes = (AdditionalAttributes) item.getExtension().getContent().get(0);
468             if (additionalAttributes.getAttributeMap() != null) {
469                 staffOnlyFlagForItem = additionalAttributes.getAttributeMap().get("staffOnlyFlag");
470                 if (staffOnlyFlagForItem != null) {
471                     itemRecord.setStaffOnlyFlag(Boolean.valueOf(staffOnlyFlagForItem));
472                 }
473             }
474         } else {
475             itemRecord.setStaffOnlyFlag(false);
476         }
477         if (item.getItemStatus() != null) {
478             ItemStatusRecord itemStatusRecord = saveItemStatusRecord(item.getItemStatus().getCodeValue());
479             itemRecord.setItemStatusId(itemStatusRecord == null ? null : itemStatusRecord.getItemStatusId());
480         }
481         if (item.getHighDensityStorage() != null) {
482             HighDensityStorageRecord highDensityStorageRecord = saveHighDensityStorageRecord(item.getHighDensityStorage());
483             itemRecord.setHighDensityStorageId(highDensityStorageRecord == null ? null : highDensityStorageRecord.getHighDensityStorageId());
484         }
485         StringBuffer locationLevel = new StringBuffer("");
486         itemRecord.setLocation(getLocation(item.getLocation(), locationLevel));
487         itemRecord.setLocationLevel(locationLevel.toString());
488         itemRecord.setFormerIdentifierRecords(null);
489         itemRecord.setLocationsCheckinCountRecords(null);
490         itemRecord.setItemNoteRecords(null);
491         if(item.getDamagedItemNote()!=null){
492             itemRecord.setDamagedItemNote(item.getDamagedItemNote());
493         }
494         if(item.getMissingPieceFlagNote()!=null){
495             itemRecord.setMissingPieceFlagNote(item.getMissingPieceFlagNote());
496         }
497         if (item.getAccessInformation() != null && item.getAccessInformation().getUri() != null) {
498             itemRecord.setUri(item.getAccessInformation().getUri().getValue());
499         }
500         getBusinessObjectService().save(itemRecord);
501 
502         if (item.getFormerIdentifier() != null && item.getFormerIdentifier().size() > 0 && item.getFormerIdentifier().get(0).getIdentifier() != null) {
503             saveFormerIdentifierRecords(item.getFormerIdentifier(), itemRecord.getItemId());
504         }
505         if (item.getNote() != null && item.getNote().size() > 0) {
506             saveItemNoteRecord(item.getNote(), itemRecord.getItemId());
507         }
508         if (item.getNumberOfCirculations() != null && item.getNumberOfCirculations().getCheckInLocation() != null && item.getNumberOfCirculations().getCheckInLocation().size() > 0) {
509             saveCheckInLocationRecord(item.getNumberOfCirculations().getCheckInLocation(), itemRecord.getItemId());
510         }
511         if (item.getDonorInfo() != null && item.getDonorInfo().size() >= 0) {
512             saveDonorList(item.getDonorInfo(), itemRecord.getItemId());
513         }
514 
515 
516     }
517 
518 
519     @Override
520     public void deleteDocs(RequestDocument requestDocument, Object object) {
521         ResponseDocument responseDocument = new ResponseDocument();
522         BusinessObjectService businessObjectService = (BusinessObjectService) object;
523         InstanceRecord instanceRecord = new InstanceRecord();
524         Map instanceMap = new HashMap();
525         instanceMap.put("instanceId", DocumentUniqueIDPrefix.getDocumentId(requestDocument.getUuid()));
526         List<InstanceRecord> instanceRecords = (List<InstanceRecord>) businessObjectService.findMatching(InstanceRecord.class, instanceMap);
527         if (instanceRecords != null && instanceRecords.size() > 0) {
528             instanceRecord = instanceRecords.get(0);
529             if (instanceRecord.getHoldingsRecords() != null && instanceRecord.getHoldingsRecords().size() > 0) {
530                 HoldingsRecord holdingsRecord = instanceRecord.getHoldingsRecords().get(0);
531 
532                 if (holdingsRecord.getExtentOfOwnerShipRecords() != null && holdingsRecord.getExtentOfOwnerShipRecords().size() > 0) {
533                     List<ExtentOfOwnerShipRecord> extentOfOwnerShipRecords = holdingsRecord.getExtentOfOwnerShipRecords();
534                     for (int i = 0; i < extentOfOwnerShipRecords.size(); i++) {
535                         List<ExtentNoteRecord> extentNoteRecords = extentOfOwnerShipRecords.get(i).getExtentNoteRecords();
536                         if (extentNoteRecords != null && extentNoteRecords.size() > 0) {
537                             businessObjectService.delete(extentNoteRecords);
538                         }
539                     }
540                     businessObjectService.delete(extentOfOwnerShipRecords);
541                 }
542 
543 
544                 if (holdingsRecord.getHoldingsNoteRecords() != null && holdingsRecord.getHoldingsNoteRecords().size() > 0) {
545                     List<HoldingsNoteRecord> holdingsNoteRecords = holdingsRecord.getHoldingsNoteRecords();
546                     businessObjectService.delete(holdingsNoteRecords);
547                 }
548 
549                /* if (holdingsRecord.getAccessUriRecords() != null && holdingsRecord.getAccessUriRecords().size() > 0) {
550                     List<AccessUriRecord> accessUriRecords = holdingsRecord.getAccessUriRecords();
551                     businessObjectService.delete(accessUriRecords);
552                 }*/
553                 holdingsRecord.setCallNumberTypeId(null);
554                 holdingsRecord.setReceiptStatusId(null);
555 
556                 businessObjectService.delete(holdingsRecord);
557             }
558 
559             List<ItemRecord> itemRecords = instanceRecord.getItemRecords();
560             for (ItemRecord itemRecord : itemRecords) {
561 
562                 if (itemRecord.getFormerIdentifierRecords() != null && itemRecord.getFormerIdentifierRecords().size() > 0) {
563                     List<FormerIdentifierRecord> formerIdentifierRecords = itemRecord.getFormerIdentifierRecords();
564                     businessObjectService.delete(formerIdentifierRecords);
565                 }
566 
567 
568                 if (itemRecord.getItemNoteRecords() != null && itemRecord.getItemNoteRecords().size() > 0) {
569                     List<ItemNoteRecord> itemNoteRecords = itemRecord.getItemNoteRecords();
570                     businessObjectService.delete(itemNoteRecords);
571                 }
572 
573 
574                 if (itemRecord.getLocationsCheckinCountRecords() != null && itemRecord.getLocationsCheckinCountRecords().size() > 0) {
575                     List<LocationsCheckinCountRecord> locationsCheckinCountRecords = itemRecord.getLocationsCheckinCountRecords();
576                     businessObjectService.delete(locationsCheckinCountRecords);
577                 }
578                 if (itemRecord.getDonorList() != null && itemRecord.getDonorList().size() > 0) {
579                     List<OLEItemDonorRecord> donorList = itemRecord.getDonorList();
580                     businessObjectService.delete(donorList);
581                 }
582                 itemRecord.setItemStatusId(null);
583                 itemRecord.setItemTypeId(null);
584                 itemRecord.setTempItemTypeId(null);
585                 itemRecord.setStatisticalSearchId(null);
586                 itemRecord.setHighDensityStorageId(null);
587                 businessObjectService.delete(itemRecord);
588 
589             }
590             businessObjectService.delete(instanceRecord);
591 
592         }
593         buildResponseDocument(requestDocument, instanceRecord, responseDocument);
594 
595     }
596 
597     @Override
598     public ResponseDocument checkoutContent(RequestDocument requestDocument, Object object) {
599         ResponseDocument respDoc = new ResponseDocument();
600         Map instanceMap = new HashMap();
601         instanceMap.put("instanceId", DocumentUniqueIDPrefix.getDocumentId(requestDocument.getUuid()));
602         List<InstanceRecord> instanceRecords = (List<InstanceRecord>) getBusinessObjectService().findMatching(InstanceRecord.class, instanceMap);
603         if(instanceRecords != null && instanceRecords.size() > 0) {
604             InstanceRecord instanceRecord =  instanceRecords.get(0);
605             String content = buildInstanceContent(instanceRecord);
606             if (content != null && instanceRecord.getHoldingsRecords()!=null && instanceRecord.getHoldingsRecords().size() > 0) {
607                 HoldingsRecord holdingsRecord = instanceRecord.getHoldingsRecords().get(0);
608                 AdditionalAttributes additionalAttributes = new AdditionalAttributes();
609                 additionalAttributes.setAttribute(AdditionalAttributes.STAFFONLYFLAG, holdingsRecord.getStaffOnlyFlag().toString());
610                 Content contentObj = new Content();
611                 contentObj.setContent(content);
612                 respDoc.setUuid(requestDocument.getUuid());
613                 respDoc.setCategory(requestDocument.getCategory());
614                 respDoc.setType(requestDocument.getType());
615                 respDoc.setFormat(requestDocument.getFormat());
616                 respDoc.setContent(contentObj);
617                 respDoc.setAdditionalAttributes(additionalAttributes);
618             }
619         } else {
620             respDoc.setStatus("Failed");
621             respDoc.setStatusMessage("Instance does not exist.");
622         }
623         return respDoc;
624     }
625 
626     @Override
627     public void checkInContent(RequestDocument requestDocument, Object object, ResponseDocument responseDocument) throws OleDocStoreException {
628         //In case of adding a new Item
629         String instanceId = requestDocument.getId();
630         if (requestDocument.getLinkedRequestDocuments() != null) {
631             for (RequestDocument linkedRequestDocument : requestDocument.getLinkedRequestDocuments()) {
632                 ItemOlemlRecordProcessor recordProcessor = new ItemOlemlRecordProcessor();
633                 Item item = recordProcessor.fromXML(linkedRequestDocument.getContent().getContent());
634                 HoldingsRecord holdingsRecord = null;
635                 Map instanceMap = new HashMap();
636                 instanceMap.put("instanceId", DocumentUniqueIDPrefix.getDocumentId(instanceId));
637                 List<HoldingsRecord> holdingsRecords = (List<HoldingsRecord>) getBusinessObjectService().findMatching(HoldingsRecord.class, instanceMap);
638                 if (holdingsRecords != null && holdingsRecords.size() > 0) {
639                     holdingsRecord = holdingsRecords.get(0);
640                 }
641                 OleHoldings oleHoldings = buildHoldingsContent(holdingsRecord);
642                 buildShelvingOrderForItem(item, oleHoldings);
643                 ItemRecord itemRecord = new ItemRecord();
644               //  itemRecord.setInstanceId(DocumentUniqueIDPrefix.getDocumentId(instanceId));
645                 itemRecord.setUniqueIdPrefix(DocumentUniqueIDPrefix.getPrefix(linkedRequestDocument.getCategory(), linkedRequestDocument.getType(), linkedRequestDocument.getFormat()));
646                 if (requestDocument.getAdditionalAttributes() != null) {
647                     AdditionalAttributes additionalAttributes = requestDocument.getAdditionalAttributes();
648                     String staffOnlyFlagForHoldings = additionalAttributes.getAttribute(AdditionalAttributes.STAFFONLYFLAG);
649                     if (staffOnlyFlagForHoldings != null) {
650                         itemRecord.setStaffOnlyFlag(Boolean.valueOf(staffOnlyFlagForHoldings));
651                     }
652                 }
653 
654                 saveItemRecord(item, itemRecord);
655                 // getBusinessObjectService().save(itemRecord);
656                 linkedRequestDocument.setId(DocumentUniqueIDPrefix.getPrefixedId(itemRecord.getUniqueIdPrefix(), itemRecord.getItemId()));
657                 buildResponseWithLinkedDocument(requestDocument, responseDocument);
658             }
659 
660         }
661     }
662 
663     private void buildShelvingOrderForItem(Item item, OleHoldings oleHoldings) throws OleDocStoreException {
664         if (item != null) {
665             if (item.getCallNumber() == null) {
666                 item.setCallNumber(new CallNumber());
667             }
668             updateShelvingOrder(item, oleHoldings);
669         }
670     }
671 
672     private String buildInstanceContent(InstanceRecord instanceRecord) {
673         String content = null;
674         if (instanceRecord != null) {
675             Instance instance = new Instance();
676             List<Instance> instanceList = new ArrayList<Instance>();
677             InstanceCollection instanceCollection = new InstanceCollection();
678             Items items = new Items();
679             List<Item> itemList = new ArrayList<Item>();
680             instance.setInstanceIdentifier(DocumentUniqueIDPrefix.getPrefixedId(instanceRecord.getUniqueIdPrefix(), instanceRecord.getInstanceId()));
681             /*Map instanceMap = new HashMap();
682             instanceMap.put("instanceId", instanceRecord.getHoldingsId());
683             List<HoldingsRecord> holdingsRecords = (List<HoldingsRecord>) getBusinessObjectService().findMatching(HoldingsRecord.class, instanceMap);*/
684             List<HoldingsRecord> holdingsRecords = instanceRecord.getHoldingsRecords();
685             if(holdingsRecords!=null && holdingsRecords.size()>0) {
686                 OleHoldings oleHoldings = buildHoldingsContent(holdingsRecords.get(0));
687                 instance.setOleHoldings(oleHoldings);
688             }
689             //List<ItemRecord> oleItemRecords = (List<ItemRecord>) getBusinessObjectService().findMatching(ItemRecord.class, instanceMap);
690             List<ItemRecord> oleItemRecords = instanceRecord.getItemRecords();
691             instanceRecord.setItemRecords(oleItemRecords);
692             for (ItemRecord itemRecord : oleItemRecords) {
693                 Item item = buildItemContent(itemRecord);
694                 itemList.add(item);
695             }
696             items.setItem(itemList);
697             instance.setItems(items);
698             instanceList.add(instance);
699             if(StringUtils.isNotEmpty(instanceRecord.getBibId())) {
700                 instance.getResourceIdentifier().add(DocumentUniqueIDPrefix.getPrefixedId(DocumentUniqueIDPrefix.PREFIX_WORK_BIB_MARC, instanceRecord.getBibId()));
701             }
702             instanceCollection.setInstance(instanceList);
703             content = new InstanceOlemlRecordProcessor().toXML(instanceCollection);
704         }
705         return content;
706     }
707 
708     public ResponseDocument buildResponseDocument(RequestDocument requestDocument, InstanceRecord instanceRecord, ResponseDocument responseDocument) {
709         responseDocument.setId(instanceRecord.getInstanceId());
710         responseDocument.setCategory(requestDocument.getCategory());
711         responseDocument.setType(requestDocument.getType());
712         responseDocument.setFormat(requestDocument.getFormat());
713         responseDocument.setUuid(DocumentUniqueIDPrefix.getPrefixedId(instanceRecord.getUniqueIdPrefix(),instanceRecord.getInstanceId()));
714         responseDocument.setId(instanceRecord.getInstanceId());
715         return responseDocument;
716     }
717 
718     @Override
719     public ResponseDocument bind(RequestDocument requestDocument, Object object, String operation)
720             throws OleDocStoreException, RepositoryException, OleException, FileNotFoundException {
721         BusinessObjectService businessObjectService = (BusinessObjectService) object;
722         if (operation.equalsIgnoreCase(Request.Operation.bind.toString())) {
723             updateInstanceData(requestDocument, businessObjectService);
724         }
725         return buildResponseForBind(requestDocument);
726     }
727 
728     @Override
729     public void validateInput(RequestDocument requestDocument, Object object, List<String> fieldValues) throws OleDocStoreException {
730         businessObjectService = (BusinessObjectService) object;
731         String content = requestDocument.getContent().getContent();
732         if (content == null) {
733             if (requestDocument.getLinkedRequestDocuments().size() > 0) {
734                 List<RequestDocument> linkedRequestDocuments = requestDocument.getLinkedRequestDocuments();
735                 for (RequestDocument linkedRequestDocument : linkedRequestDocuments) {
736                     if (linkedRequestDocument.getType().equalsIgnoreCase(DocType.ITEM.getCode())) {
737                         RdbmsWorkItemDocumentManager.getInstance().validateNewItem(linkedRequestDocument, businessObjectService, fieldValues, DocumentUniqueIDPrefix.getDocumentId(
738                                 requestDocument.getId()));
739                     }
740                 }
741             }
742         } else {
743             InstanceOlemlRecordProcessor instProcessor = new InstanceOlemlRecordProcessor();
744             InstanceCollection instanceCollection = instProcessor.fromXML(content);
745             List<Instance> instanceList = instanceCollection.getInstance();
746             for (Instance instance : instanceList) {
747                 if (instance.getOleHoldings() != null) {
748                     OleHoldings oleHoldings = instance.getOleHoldings();
749                     RdbmsWorkHoldingsDocumentManager.getInstance().validateHoldings(oleHoldings);
750                 }
751                 if (instance.getItems() != null) {
752                     Items items = instance.getItems();
753                     List<Item> itemList = items.getItem();
754                     if (itemList.size() > 0) {
755                         for (Item item : itemList) {
756                             RdbmsWorkItemDocumentManager.getInstance().itemBarcodeValidation(item, fieldValues, null);
757                             if (item.getCallNumber() != null) {
758                                 CallNumber callNumber = item.getCallNumber();
759                                 if (instance.getOleHoldings() != null) {
760                                     OleHoldings oleHoldings = instance.getOleHoldings();
761                                     validateCallNumber(callNumber, oleHoldings);
762                                 } else {
763                                     validateCallNumber(callNumber, null);
764                                 }
765                             }
766                         }
767                     }
768                 }
769             }
770         }
771     }
772 
773     public void validateCallNumber(CallNumber itemCNum, OleHoldings holdings) throws OleDocStoreException {
774         // item call number and type verification
775         if ((itemCNum.getNumber() != null && itemCNum.getNumber().length() > 0)) {
776             validateCNumNCNumType(itemCNum);
777             validateShelvingOrderNCNum(itemCNum);
778         }
779         // if item call number is null consider holdings call number
780         else if (holdings != null) {
781             if (holdings.getCallNumber() != null) {
782                 CallNumber holCNum = holdings.getCallNumber();
783                 validateCNumNCNumType(holCNum);
784                 // consider item shelving order and holdings call number information.
785                 if (itemCNum.getShelvingOrder() != null && itemCNum.getShelvingOrder().getFullValue() != null &&
786                         itemCNum.getShelvingOrder().getFullValue().trim().length() > 0) {
787                     if (!(holCNum.getNumber() != null && holCNum.getNumber().length() > 0)) {
788                         throw new OleDocStoreException("Shelving order value is available, Please enter call number information");
789                     }
790                 }
791             }
792             // item shelving order is not null and holdings call number is null
793             else if (itemCNum.getShelvingOrder() != null && itemCNum.getShelvingOrder().getFullValue() != null &&
794                     itemCNum.getShelvingOrder().getFullValue().trim().length() > 0) {
795                 throw new OleDocStoreException("Shelving order value is available, Please enter call number information");
796             }
797 
798         }
799     }
800 
801     /**
802      * Verifies that callNumberType is valid when callNumber is present.
803      * Else throws exception.
804      */
805     private void validateCNumNCNumType(CallNumber cNum) throws OleDocStoreException {
806         String callNumber = "";
807         String callNumberType = "";
808         // Get callNumber and callNumberType
809         if (cNum != null) {
810             callNumber = cNum.getNumber();
811             if (cNum.getShelvingScheme() != null) {
812                 callNumberType = cNum.getShelvingScheme().getCodeValue();
813             }
814         }
815         // Check if CallNumber is present
816         if (StringUtils.isNotEmpty(callNumber)) {
817             // Check if callNumberType is empty or #
818             if ((callNumberType == null) || (callNumberType.length() == 0) || (callNumberType.equals("NOINFO"))) {
819                 throw new OleDocStoreException("Please enter valid call number type value in call number information ");
820             }
821         }
822     }
823 
824     private void validateShelvingOrderNCNum(CallNumber cNum) throws OleDocStoreException {
825         if (cNum.getShelvingOrder() != null && cNum.getShelvingOrder().getFullValue() != null &&
826                 cNum.getShelvingOrder().getFullValue().trim().length() > 0) {
827             if (!(cNum.getNumber() != null && cNum.getNumber().length() > 0)) {
828                 throw new OleDocStoreException("Shelving order value is available, so please enter call number information");
829             }
830         }
831     }
832 
833     public void validateCallNumber(CallNumber cNum) throws OleDocStoreException {
834         validateCNumNCNumType(cNum);
835         validateShelvingOrderNCNum(cNum);
836     }
837 
838 
839     private void updateInstanceData(RequestDocument requestDocument, BusinessObjectService businessObjectService) {
840         Map instanceMap = new HashMap();
841         instanceMap.put("instanceId", DocumentUniqueIDPrefix.getDocumentId(requestDocument.getUuid()));
842         InstanceRecord instanceRecord = businessObjectService.findByPrimaryKey(InstanceRecord.class, instanceMap);
843         if (instanceRecord != null) {
844             BibInstanceRecord bibInstanceRecord = new BibInstanceRecord();
845             bibInstanceRecord.setBibId(instanceRecord.getBibId());
846             bibInstanceRecord.setInstanceId(instanceRecord.getInstanceId());
847             businessObjectService.save(bibInstanceRecord);
848         }
849         List<RequestDocument> linkedRequestDocuments = requestDocument.getLinkedRequestDocuments();
850         for (RequestDocument linkedRequestDocument : linkedRequestDocuments) {
851             BibInstanceRecord bibInstanceRecord = new BibInstanceRecord();
852             bibInstanceRecord.setInstanceId(DocumentUniqueIDPrefix.getDocumentId(requestDocument.getUuid()));
853             bibInstanceRecord.setBibId(DocumentUniqueIDPrefix.getDocumentId(linkedRequestDocument.getUuid()));
854             businessObjectService.save(bibInstanceRecord);
855         }
856     }
857 
858     private ResponseDocument buildResponseForBind(RequestDocument requestDocument) {
859         ResponseDocument responseDocument = new ResponseDocument();
860         responseDocument.setId(requestDocument.getId());
861         responseDocument.setCategory(requestDocument.getCategory());
862         responseDocument.setType(requestDocument.getType());
863         responseDocument.setFormat(requestDocument.getFormat());
864         responseDocument.setUuid(requestDocument.getUuid());
865         List<RequestDocument> linkedRequestDocuments = requestDocument.getLinkedRequestDocuments();
866         List<ResponseDocument> linkedResponseDocumentsList = new ArrayList<ResponseDocument>();
867         for (RequestDocument linkedRequestDocument : linkedRequestDocuments) {
868 
869             ResponseDocument linkedResponseDocument = new ResponseDocument();
870             linkedResponseDocument.setCategory(linkedRequestDocument.getCategory());
871             linkedResponseDocument.setType(linkedRequestDocument.getType());
872             linkedResponseDocument.setFormat(linkedRequestDocument.getFormat());
873             linkedResponseDocument.setId(linkedRequestDocument.getId());
874             linkedRequestDocument.setUser(linkedRequestDocument.getUuid());
875             linkedResponseDocumentsList.add(linkedResponseDocument);
876 
877         }
878         responseDocument.setLinkedDocuments(linkedResponseDocumentsList);
879 
880 
881         return responseDocument;
882     }
883 
884     private void buildResponseWithLinkedDocument(RequestDocument requestDocument, ResponseDocument responseDocument) {
885         responseDocument.setId(requestDocument.getId());
886         responseDocument.setCategory(requestDocument.getCategory());
887         responseDocument.setType(requestDocument.getType());
888         responseDocument.setFormat(requestDocument.getFormat());
889         responseDocument.setUuid(requestDocument.getUuid());
890         responseDocument.setStatus("Success");
891         List<RequestDocument> linkedRequestDocuments = requestDocument.getLinkedRequestDocuments();
892         List<ResponseDocument> linkedResponseDocumentsList = new ArrayList<ResponseDocument>();
893         for (RequestDocument linkedRequestDocument : linkedRequestDocuments) {
894 
895             ResponseDocument linkedResponseDocument = new ResponseDocument();
896             linkedResponseDocument.setCategory(linkedRequestDocument.getCategory());
897             linkedResponseDocument.setType(linkedRequestDocument.getType());
898             linkedResponseDocument.setFormat(linkedRequestDocument.getFormat());
899             linkedResponseDocument.setId(linkedRequestDocument.getId());
900             linkedResponseDocument.setUuid(linkedRequestDocument.getId());
901             linkedRequestDocument.setUser(linkedRequestDocument.getUuid());
902             linkedResponseDocument.setStatus("Success");
903             linkedResponseDocumentsList.add(linkedResponseDocument);
904 
905         }
906         responseDocument.setLinkedDocuments(linkedResponseDocumentsList);
907     }
908 
909 
910     public void transferInstances(List<RequestDocument> requestDocuments, BusinessObjectService businessObjectService)
911             throws Exception {
912         LOG.debug("RdbmsWorkInstanceDocumentManager transferInstances");
913         Collection<InstanceRecord> instanceRecords = null;
914         String desBibIdentifier = requestDocuments.get(requestDocuments.size() - 1).getUuid();
915         LOG.debug("RdbmsWorkInstanceDocumentManager transferInstances desBibIdentifier " + desBibIdentifier);
916         Map instanceMap = new HashMap();
917         Map bibInstanceMap = new HashMap();
918         for (int i = 0; i < requestDocuments.size() - 1; i++) {
919             RequestDocument requestDocument = requestDocuments.get(i);
920             instanceMap.put("instanceId", DocumentUniqueIDPrefix.getDocumentId(requestDocument.getUuid()));
921             bibInstanceMap.put("instanceId", DocumentUniqueIDPrefix.getDocumentId(requestDocument.getUuid()));
922             List<BibInstanceRecord> bibInstanceRecordList = (List<BibInstanceRecord>) businessObjectService
923                     .findMatching(BibInstanceRecord.class, bibInstanceMap);
924             if (bibInstanceRecordList.size() > 1) {
925                 //Instances are associated with multiple bibs means it has bound with with other bib. So we cant transfer. So throw exception
926                 LOG.error(requestDocument.getUuid() + " is bounded with other bib and cant be transferred");
927                 throw new Exception(requestDocument.getUuid() + " is bounded with other bib and cant be transferred");
928             }
929             //else {
930             //    BibInstanceRecord bibInstanceRecord = bibInstanceRecordList.get(0);
931             //    bibInstanceRecord.setBibId(DocumentUniqueIDPrefix.getDocumentId(desBibIdentifier));
932             //    businessObjectService.save(bibInstanceRecord);
933             //}
934             InstanceRecord instanceRecord = businessObjectService.findByPrimaryKey(InstanceRecord.class, instanceMap);
935             instanceRecord.setBibId(DocumentUniqueIDPrefix.getDocumentId(desBibIdentifier));
936             businessObjectService.save(instanceRecord);
937         }
938     }
939 
940     public void transferItems(List<RequestDocument> requestDocuments, BusinessObjectService businessObjectService)
941             throws Exception {
942         String destInstanceIdentifier = requestDocuments.get(requestDocuments.size() - 1).getUuid();
943         Map itemMap = new HashMap();
944         for (int i = 0; i < requestDocuments.size() - 1; i++) {
945             RequestDocument requestDocument = requestDocuments.get(i);
946             itemMap.put("ITEM_ID", DocumentUniqueIDPrefix.getDocumentId(requestDocument.getUuid()));
947             ItemRecord itemRecord = businessObjectService.findByPrimaryKey(ItemRecord.class, itemMap);
948           //  itemRecord.setInstanceId(DocumentUniqueIDPrefix.getDocumentId(destInstanceIdentifier));
949             businessObjectService.save(itemRecord);
950         }
951     }
952 
953     @Override
954     public ResponseDocument deleteVerify(RequestDocument requestDocument, Object object) throws Exception {
955         // List<String> bibIdentifierList = new ArrayList<String>();
956         businessObjectService = (BusinessObjectService) object;
957         List<String> bibIdentifierList = new ArrayList<String>();
958         ResponseDocument responseDocument = new ResponseDocument();
959         Map instanceMap = new HashMap();
960         instanceMap.put("instanceId", DocumentUniqueIDPrefix.getDocumentId(requestDocument.getUuid()));
961         List<BibInstanceRecord> bibInstanceRecords = (List<BibInstanceRecord>) businessObjectService
962                 .findMatching(BibInstanceRecord.class, instanceMap);
963         if (bibInstanceRecords.size() > 0) {
964             for (BibInstanceRecord bibInstanceRecord : bibInstanceRecords) {
965                 bibIdentifierList.add(bibInstanceRecord.getBibId());
966             }
967 
968 
969             if (bibIdentifierList.size() > 1) {
970                 responseDocument.setCategory(requestDocument.getCategory());
971                 responseDocument.setType(requestDocument.getType());
972                 responseDocument.setFormat(requestDocument.getFormat());
973                 responseDocument.setUuid(requestDocument.getUuid());
974                 responseDocument.setStatus("failure'");
975                 responseDocument.setStatusMessage("Instance is bound with more than one bib. So deletion cannot be done");
976                 return responseDocument;
977             }
978             boolean exists = checkInstancesOrItemsExistsInOLE(requestDocument.getUuid(), object);
979             if (exists) {
980                 responseDocument.setId(requestDocument.getId());
981                 responseDocument.setCategory(requestDocument.getCategory());
982                 responseDocument.setType(requestDocument.getType());
983                 responseDocument.setFormat(requestDocument.getFormat());
984                 responseDocument.setUuid(requestDocument.getUuid());
985                 responseDocument.setStatus("failure'");
986                 responseDocument.setStatusMessage("Instances or Items in use. So deletion cannot be done");
987                 return responseDocument;
988             }
989             String bibIdentifierValue = bibIdentifierList.get(0);
990             Map bibMap = new HashMap();
991             bibMap.put("bibId", bibIdentifierValue);
992             bibInstanceRecords = (List<BibInstanceRecord>) businessObjectService
993                     .findMatching(BibInstanceRecord.class, bibMap);
994             List<String> instanceIdentifierList = new ArrayList<>();
995             for (BibInstanceRecord bibInstanceRecord : bibInstanceRecords) {
996                 instanceIdentifierList.add(bibInstanceRecord.getInstanceId());
997             }
998             if (instanceIdentifierList.size() == 1) {
999                 String prefix = DocumentUniqueIDPrefix.getPrefix(DocCategory.WORK.getCode(), DocType.BIB.getDescription(), DocFormat.MARC.getCode());
1000                 requestDocument.setUuid(DocumentUniqueIDPrefix.getPrefixedId(prefix, bibIdentifierValue));
1001                 requestDocument.setCategory(DocCategory.WORK.getCode());
1002                 requestDocument.setType(DocType.BIB.getDescription());
1003                 requestDocument.setFormat(DocFormat.MARC.getCode());
1004                 responseDocument.setStatus("success");
1005                 responseDocument.setStatusMessage("success");
1006                 responseDocument = RdbmsWorkBibDocumentManager.getInstance().deleteVerify(requestDocument, businessObjectService);
1007             } else {
1008                 responseDocument.setUuid(requestDocument.getUuid());
1009                 responseDocument.setId(requestDocument.getId());
1010                 responseDocument.setCategory(requestDocument.getCategory());
1011                 responseDocument.setType(requestDocument.getType());
1012                 responseDocument.setFormat(requestDocument.getFormat());
1013                 responseDocument.setStatus("success");
1014                 responseDocument.setStatusMessage("success");
1015             }
1016         } else {
1017             responseDocument.setUuid(requestDocument.getUuid());
1018             responseDocument.setId(requestDocument.getId());
1019             responseDocument.setCategory(requestDocument.getCategory());
1020             responseDocument.setType(requestDocument.getType());
1021             responseDocument.setFormat(requestDocument.getFormat());
1022             responseDocument.setStatus("success");
1023             responseDocument.setStatusMessage("success");
1024         }
1025 
1026         return responseDocument;
1027 
1028     }
1029 
1030 
1031     protected CallNumberTypeRecord saveCallNumberTypeRecord(ShelvingScheme scheme) {
1032 
1033         Map callMap = new HashMap();
1034         callMap.put("code", scheme.getCodeValue());
1035         List<CallNumberTypeRecord> callNumberTypeRecords = (List<CallNumberTypeRecord>) getBusinessObjectService().findMatching(CallNumberTypeRecord.class, callMap);
1036         if (callNumberTypeRecords.size() == 0) {
1037             if (scheme.getCodeValue() != null && !"".equals(scheme.getCodeValue())) {
1038                 CallNumberTypeRecord callNumberTypeRecord = new CallNumberTypeRecord();
1039                 callNumberTypeRecord.setCode(scheme.getCodeValue());
1040                 callNumberTypeRecord.setName(scheme.getFullValue());
1041                 getBusinessObjectService().save(callNumberTypeRecord);
1042                 return callNumberTypeRecord;
1043             } else
1044                 return null;
1045         }
1046         return callNumberTypeRecords.get(0);
1047     }
1048 
1049     protected String getLocation(Location location, StringBuffer locationLevel) {
1050         StringBuffer locationName = new StringBuffer("");
1051         //StringBuffer locationLevel = new StringBuffer("");
1052         if (location != null && location.getLocationLevel() != null) {
1053             locationName = locationName.append(location.getLocationLevel().getName());
1054             locationLevel = locationLevel.append(location.getLocationLevel().getLevel());
1055 
1056             if (location.getLocationLevel().getLocationLevel() != null) {
1057                 locationName = locationName.append("/").append(location.getLocationLevel().getLocationLevel().getName());
1058                 locationLevel = locationLevel.append("/").append(location.getLocationLevel().getLocationLevel().getLevel());
1059 
1060                 if (location.getLocationLevel().getLocationLevel().getLocationLevel() != null) {
1061                     locationName = locationName.append("/").append(location.getLocationLevel().getLocationLevel().getLocationLevel().getName());
1062                     locationLevel = locationLevel.append("/").append(location.getLocationLevel().getLocationLevel().getLocationLevel().getLevel());
1063 
1064                     if (location.getLocationLevel().getLocationLevel().getLocationLevel().getLocationLevel() != null) {
1065                         locationName = locationName.append("/").append(location.getLocationLevel().getLocationLevel().getLocationLevel().getLocationLevel().getName());
1066                         locationLevel = locationLevel.append("/").append(location.getLocationLevel().getLocationLevel().getLocationLevel().getLocationLevel().getLevel());
1067 
1068                         if (location.getLocationLevel().getLocationLevel().getLocationLevel().getLocationLevel().getLocationLevel() != null) {
1069                             locationName = locationName.append("/").append(location.getLocationLevel().getLocationLevel().getLocationLevel().getLocationLevel().getLocationLevel().getName());
1070                             locationLevel = locationLevel.append("/").append(location.getLocationLevel().getLocationLevel().getLocationLevel().getLocationLevel().getLocationLevel().getLevel());
1071                         }
1072                     }
1073                 }
1074             }
1075         }
1076         return locationName.toString();
1077     }
1078 
1079 
1080     protected void saveExtentNoteRecord(String extOfOwnerShipID, List<Note> notes) {
1081         Map map = new HashMap();
1082         map.put("extOfOwnerShipID", extOfOwnerShipID);
1083         List<ExtentNoteRecord> extentNoteRecords = (List<ExtentNoteRecord>) getBusinessObjectService().findMatching(ExtentNoteRecord.class, map);
1084         if (notes != null && notes.size() > 0) {
1085             for (int i = 0; i < notes.size(); i++) {
1086                 Note note = notes.get(i);
1087                 if (note.getType() != null && ("public".equalsIgnoreCase(note.getType()) || "nonPublic".equalsIgnoreCase(note.getType()))) {
1088                     ExtentNoteRecord noteRecord = new ExtentNoteRecord();
1089                     if (i < extentNoteRecords.size()) {
1090                         noteRecord = extentNoteRecords.get(i);
1091                     }
1092 
1093                 //    noteRecord.setExtOfOwnerShipID(extOfOwnerShipID);
1094                     noteRecord.setType(note.getType());
1095                     noteRecord.setNote(note.getValue());
1096                     getBusinessObjectService().save(noteRecord);
1097                 }
1098             }
1099 
1100             if (extentNoteRecords.size() > notes.size()) {
1101                 getBusinessObjectService().delete(extentNoteRecords.subList(notes.size() - 1, extentNoteRecords.size()));
1102             }
1103         }
1104 
1105     }
1106 
1107     protected void saveExtentOfOwnerShip(List<ExtentOfOwnership> extentOfOwnershipList, String holdingsId) {
1108 
1109         Map map = new HashMap();
1110         map.put("holdingsId", holdingsId);
1111         List<ExtentOfOwnerShipRecord> extentOfOwnerShipRecords = (List<ExtentOfOwnerShipRecord>) getBusinessObjectService().findMatching(ExtentOfOwnerShipRecord.class, map);
1112         if (extentOfOwnershipList != null && extentOfOwnershipList.size() > 0) {
1113             for (int i = 0; i < extentOfOwnershipList.size(); i++) {
1114                 ExtentOfOwnerShipRecord extentOfOwnerShipRecord = new ExtentOfOwnerShipRecord();
1115                 ExtentOfOwnership extentOfOwnership = extentOfOwnershipList.get(i);
1116                 if (i < extentOfOwnerShipRecords.size()) {
1117                     extentOfOwnerShipRecord = extentOfOwnerShipRecords.get(i);
1118                 }
1119                 ExtentOfOwnerShipTypeRecord extentOfOwnerShipTypeRecord = saveExtentOfOwnerShipType(extentOfOwnership.getType());
1120                 extentOfOwnerShipRecord.setExtOfOwnerShipTypeId(extentOfOwnerShipTypeRecord != null ? extentOfOwnerShipTypeRecord.getExtOfOwnerShipTypeId() : null);
1121                 extentOfOwnerShipRecord.setText(extentOfOwnership.getTextualHoldings());
1122                 extentOfOwnerShipRecord.setHoldingsId(holdingsId);
1123                 getBusinessObjectService().save(extentOfOwnerShipRecord);
1124                 List<Note> notes = extentOfOwnership.getNote();
1125                 /*if (notes.size() > 0) {
1126                     saveExtentNoteRecord(extentOfOwnerShipRecord.getExtOfOwnerShipID(), notes);
1127                 }*/
1128             }
1129 
1130             if (extentOfOwnershipList.size() < extentOfOwnerShipRecords.size()) {
1131                 getBusinessObjectService().delete(extentOfOwnerShipRecords.subList(extentOfOwnershipList.size() - 1, extentOfOwnerShipRecords.size()));
1132 
1133             }
1134         }
1135 
1136     }
1137 
1138     protected ExtentOfOwnerShipTypeRecord saveExtentOfOwnerShipType(String type) {
1139         Map map = new HashMap();
1140         map.put("code", type);
1141         List<ExtentOfOwnerShipTypeRecord> extentOfOwnerShipTypeRecords = (List<ExtentOfOwnerShipTypeRecord>) getBusinessObjectService().findMatching(ExtentOfOwnerShipTypeRecord.class, map);
1142         if (extentOfOwnerShipTypeRecords.size() == 0) {
1143             if (type != null && !"".equals(type)) {
1144                 ExtentOfOwnerShipTypeRecord extentOfOwnerShipTypeRecord = new ExtentOfOwnerShipTypeRecord();
1145                 extentOfOwnerShipTypeRecord.setCode(type);
1146                 extentOfOwnerShipTypeRecord.setName(type);
1147                 getBusinessObjectService().save(extentOfOwnerShipTypeRecord);
1148                 return extentOfOwnerShipTypeRecord;
1149             } else {
1150                 return null;
1151             }
1152         }
1153         return extentOfOwnerShipTypeRecords.get(0);
1154     }
1155 
1156 
1157 /*    protected HoldingsExtendInfoRecord saveExtensionRecord(OleHoldings oleHoldings) {
1158 
1159         HoldingsExtendInfoRecord holdingsExtendInfoRecord = new HoldingsExtendInfoRecord();
1160         ReceiptStatusRecord receiptStatusRecord = saveReceiptStatusRecord(oleHoldings.getReceiptStatus());
1161         holdingsExtendInfoRecord.setReceiptStatusId(receiptStatusRecord == null ? null : receiptStatusRecord.getReceiptStatusId());
1162         getBusinessObjectService().save(holdingsExtendInfoRecord);
1163         List<Uri> uriList = oleHoldings.getUri();
1164         if (uriList.size() > 0) {
1165             List<AccessUriRecord> accessInfoRecords = new ArrayList<AccessUriRecord>();
1166             for (Uri uri : uriList) {
1167                 AccessUriRecord accessInfoRecord = new AccessUriRecord();
1168                 accessInfoRecord.setText(uri.getValue());
1169                 accessInfoRecord.setHoldingsExtendInfoId(holdingsExtendInfoRecord.getExtendInfoId());
1170                 accessInfoRecords.add(accessInfoRecord);
1171             }
1172             if (accessInfoRecords.size() > 0)
1173                 getBusinessObjectService().save(accessInfoRecords);
1174         }
1175         return holdingsExtendInfoRecord;
1176     }*/
1177 
1178 
1179     protected void saveAccessUriRecord(List<Uri> uriList, String holdingsId) {
1180 
1181         Map map = new HashMap();
1182         map.put("holdingsId", holdingsId);
1183        /* List<AccessUriRecord> accessUriRecordList = (List<AccessUriRecord>) getBusinessObjectService().findMatching(AccessUriRecord.class, map);
1184         if (uriList.size() > 0) {
1185             List<AccessUriRecord> accessUriRecords = new ArrayList<AccessUriRecord>();
1186             for (int i = 0; i < uriList.size(); i++) {
1187                 AccessUriRecord accessUriRecord = new AccessUriRecord();
1188                 if (i < accessUriRecordList.size()) {
1189                     accessUriRecord = accessUriRecordList.get(i);
1190                 }
1191                 Uri uri = uriList.get(i);
1192                 accessUriRecord.setText(uri.getValue());
1193                 accessUriRecord.setHoldingsId(holdingsId);
1194                 accessUriRecords.add(accessUriRecord);
1195             }
1196 
1197             if (accessUriRecords.size() > 0)
1198                 getBusinessObjectService().save(accessUriRecords);
1199 
1200             if (uriList.size() < accessUriRecordList.size()) {
1201                 getBusinessObjectService().delete(accessUriRecordList.subList(uriList.size() - 1, accessUriRecordList.size()));
1202             }
1203         }*/
1204     }
1205 
1206 
1207     protected ReceiptStatusRecord saveReceiptStatusRecord(String receiptStatus) {
1208         Map map = new HashMap();
1209         map.put("code", receiptStatus);
1210         List<ReceiptStatusRecord> receiptStatusRecords = (List<ReceiptStatusRecord>) getBusinessObjectService().findMatching(ReceiptStatusRecord.class, map);
1211         if (receiptStatusRecords.size() == 0) {
1212             if (receiptStatus != null && !"".equals(receiptStatus)) {
1213                 ReceiptStatusRecord receiptStatusRecord = new ReceiptStatusRecord();
1214                 receiptStatusRecord.setCode(receiptStatus);
1215                 receiptStatusRecord.setName(receiptStatus);
1216                 getBusinessObjectService().save(receiptStatusRecord);
1217                 return receiptStatusRecord;
1218             } else {
1219                 return null;
1220             }
1221         }
1222         return receiptStatusRecords.get(0);
1223     }
1224 
1225     protected void saveHoldingNoteRecords(List<Note> noteList, String holdingsId) {
1226 
1227         Map map = new HashMap();
1228         map.put("holdingsId", holdingsId);
1229         List<HoldingsNoteRecord> holdingsNoteRecordList = (List<HoldingsNoteRecord>) getBusinessObjectService().findMatching(HoldingsNoteRecord.class, map);
1230         if (noteList.size() > 0) {
1231             List<HoldingsNoteRecord> holdingsNoteRecords = new ArrayList<HoldingsNoteRecord>();
1232             for (int i = 0; i < noteList.size(); i++) {
1233                 Note note = noteList.get(i);
1234                 if (note.getType() != null && ("public".equalsIgnoreCase(note.getType()) || "nonPublic".equalsIgnoreCase(note.getType()))) {
1235                     HoldingsNoteRecord holdingsNoteRecord = new HoldingsNoteRecord();
1236                     if (i < holdingsNoteRecordList.size()) {
1237                         holdingsNoteRecord = holdingsNoteRecordList.get(i);
1238                     }
1239                     holdingsNoteRecord.setType(note.getType());
1240                     holdingsNoteRecord.setNote(note.getValue());
1241                     holdingsNoteRecord.setHoldingsId(holdingsId);
1242                     holdingsNoteRecords.add(holdingsNoteRecord);
1243                 }
1244                 if (holdingsNoteRecords.size() > 0) {
1245                     getBusinessObjectService().save(holdingsNoteRecords);
1246                 }
1247             }
1248 
1249             if (noteList.size() < holdingsNoteRecordList.size()) {
1250                 getBusinessObjectService().delete(holdingsNoteRecordList.subList(noteList.size() - 1, holdingsNoteRecordList.size()));
1251             }
1252         }
1253     }
1254 
1255 
1256     protected ItemTypeRecord saveItemTypeRecord(ItemType itemType) {
1257         Map map = new HashMap();
1258         map.put("code", itemType.getCodeValue());
1259         List<ItemTypeRecord> itemTypeRecords = (List<ItemTypeRecord>) getBusinessObjectService().findMatching(ItemTypeRecord.class, map);
1260         if (itemTypeRecords.size() == 0) {
1261             if (itemType.getCodeValue() != null && !"".equals(itemType.getCodeValue())) {
1262                 ItemTypeRecord itemTypeRecord = new ItemTypeRecord();
1263                 itemTypeRecord.setCode(itemType.getCodeValue());
1264                 itemTypeRecord.setName(itemType.getFullValue());
1265                 getBusinessObjectService().save(itemTypeRecord);
1266                 return itemTypeRecord;
1267             } else {
1268                 return null;
1269             }
1270         }
1271         return itemTypeRecords.get(0);
1272 
1273     }
1274 
1275 /*
1276     protected void updateItemTypeRecord(ItemType itemType, ItemTypeRecord itemTypeRecord) {
1277 
1278         itemTypeRecord.setCode(itemType.getCodeValue());
1279         itemTypeRecord.setName(itemType.getFullValue());
1280         getBusinessObjectService().save(itemTypeRecord);
1281     }
1282 
1283 
1284     protected void updateStatisticalSearchRecord(List<StatisticalSearchingCode> statisticalSearchingCodes, StatisticalSearchRecord statisticalSearchRecord) {
1285 
1286         statisticalSearchRecord.setCode(statisticalSearchingCodes.get(0).getCodeValue());
1287         statisticalSearchRecord.setName(statisticalSearchingCodes.get(0).getFullValue());
1288         getBusinessObjectService().save(statisticalSearchRecord);
1289 
1290     }*/
1291 
1292     protected StatisticalSearchRecord saveStatisticalSearchRecord(List<StatisticalSearchingCode> statisticalSearchingCodes) {
1293 
1294         if (statisticalSearchingCodes.size() > 0) {
1295             Map map = new HashMap();
1296             map.put("code", statisticalSearchingCodes.get(0).getCodeValue());
1297             List<StatisticalSearchRecord> statisticalSearchRecords = (List<StatisticalSearchRecord>) getBusinessObjectService().findMatching(StatisticalSearchRecord.class, map);
1298             if (statisticalSearchRecords.size() == 0) {
1299                 if (statisticalSearchingCodes.get(0).getCodeValue() != null && !"".equals(statisticalSearchingCodes.get(0).getCodeValue())) {
1300                     StatisticalSearchRecord statisticalSearchRecord = new StatisticalSearchRecord();
1301                     statisticalSearchRecord.setCode(statisticalSearchingCodes.get(0).getCodeValue());
1302                     statisticalSearchRecord.setName(statisticalSearchingCodes.get(0).getFullValue());
1303                     getBusinessObjectService().save(statisticalSearchRecord);
1304                     return statisticalSearchRecord;
1305                 } else {
1306                     return null;
1307                 }
1308             }
1309             return statisticalSearchRecords.get(0);
1310         }
1311         return null;
1312     }
1313 
1314 
1315     /* protected void updateTempItemTypeRecord(ItemType itemType, ItemTypeRecord tempItemTypeRecord) {
1316       tempItemTypeRecord.setCode(itemType.getCodeValue());
1317       tempItemTypeRecord.setName(itemType.getFullValue());
1318       getBusinessObjectService().save(tempItemTypeRecord);
1319   }
1320 
1321 
1322   protected TempItemTypeRecord saveTempItemTypeRecord(ItemType itemType) {
1323       Map map = new HashMap();
1324       map.put("code", itemType.getCodeValue());
1325       List<TempItemTypeRecord> tempItemTypeRecords = (List<TempItemTypeRecord>) getBusinessObjectService().findMatching(TempItemTypeRecord.class, map);
1326       if (tempItemTypeRecords.size() == 0) {
1327           if (itemType.getCodeValue() != null && !"".equals(itemType.getCodeValue())) {
1328               TempItemTypeRecord itemTypeRecord = new TempItemTypeRecord();
1329               itemTypeRecord.setCode(itemType.getCodeValue());
1330               itemTypeRecord.setDescription(itemType.getFullValue());
1331               getBusinessObjectService().save(itemTypeRecord);
1332               return itemTypeRecord;
1333           } else {
1334               return null;
1335           }
1336       }
1337       return tempItemTypeRecords.get(0);
1338   }
1339 
1340 
1341   protected void updateItemStatusRecord(String itemStatus, ItemStatusRecord itemStatusRecord) {
1342 
1343       itemStatusRecord.setCode(itemStatus);
1344       itemStatusRecord.setName(itemStatus);
1345       getBusinessObjectService().save(itemStatusRecord);
1346 
1347   }  */
1348 
1349 
1350     protected ItemStatusRecord saveItemStatusRecord(String itemStatus) {
1351         Map map = new HashMap();
1352         map.put("code", itemStatus);
1353         List<ItemStatusRecord> itemStatusRecords = (List<ItemStatusRecord>) getBusinessObjectService().findMatching(ItemStatusRecord.class, map);
1354         if (itemStatusRecords.size() == 0) {
1355             if (itemStatus != null && !"".equals(itemStatus)) {
1356                 ItemStatusRecord itemStatusRecord = new ItemStatusRecord();
1357                 itemStatusRecord.setCode(itemStatus);
1358                 itemStatusRecord.setName(itemStatus);
1359                 getBusinessObjectService().save(itemStatusRecord);
1360                 return itemStatusRecord;
1361             } else {
1362                 return null;
1363             }
1364         }
1365         return itemStatusRecords.get(0);
1366     }
1367 
1368     protected HighDensityStorageRecord saveHighDensityStorageRecord(HighDensityStorage highDensityStorage) {
1369 
1370         HighDensityStorageRecord highDensityStorageRecord = new HighDensityStorageRecord();
1371         highDensityStorageRecord.setRow(highDensityStorage.getRow());
1372         highDensityStorageRecord.setModule(highDensityStorage.getModule());
1373         highDensityStorageRecord.setShelf(highDensityStorage.getShelf());
1374         getBusinessObjectService().save(highDensityStorageRecord);
1375         return highDensityStorageRecord;
1376     }
1377 
1378     /*   protected void updateItemExtendInfoRecord(Item item, ItemExtendInfoRecord itemExtendInfoRecord) {
1379 
1380         if (item != null && item.getHighDensityStorage() != null && itemExtendInfoRecord.getHighDensityStorageId() != null && !itemExtendInfoRecord.getHighDensityStorageId().isEmpty()) {
1381             updateHighDensityStorageRecord(item.getHighDensityStorage(), itemExtendInfoRecord.getHighDensityStorageRecord());
1382         } else {
1383             HighDensityStorageRecord highDensityStorageRecord = saveHighDensityStorageRecord(item.getHighDensityStorage());
1384             itemExtendInfoRecord.setHighDensityStorageId(highDensityStorageRecord.getHighDensityStorageId());
1385         }
1386         getBusinessObjectService().save(itemExtendInfoRecord);
1387         if (item.getNote() != null && itemExtendInfoRecord.getItemNoteRecords() != null && itemExtendInfoRecord.getItemNoteRecords().size() > 0) {
1388             updateItemNoteRecords(item.getNote(), itemExtendInfoRecord.getExtendInfoId(), itemExtendInfoRecord.getItemNoteRecords());
1389         } else {
1390             saveItemNoteRecord(item.getNote(), itemExtendInfoRecord.getExtendInfoId());
1391         }
1392     }
1393 
1394 
1395     protected void updateHighDensityStorageRecord(HighDensityStorage highDensityStorage, HighDensityStorageRecord highDensityStorageRecord) {
1396 
1397         highDensityStorageRecord.setRow(highDensityStorage.getRow());
1398         highDensityStorageRecord.setModule(highDensityStorage.getModule());
1399         highDensityStorageRecord.setShelf(highDensityStorage.getShelf());
1400         getBusinessObjectService().save(highDensityStorageRecord);
1401 
1402     }
1403 
1404     protected void updateItemNoteRecords(List<Note> noteList, String extendInfoId, List<ItemNoteRecord> itemNoteRecords) {
1405 
1406         getBusinessObjectService().delete(itemNoteRecords);
1407         saveItemNoteRecord(noteList, extendInfoId);
1408     }
1409 
1410 
1411      protected void updateCallNumberRecord(CallNumber callNumber, HoldingsRecord holdingsRecord) {
1412 
1413         ShelvingScheme scheme = callNumber.getShelvingScheme();
1414         ShelvingOrder order = callNumber.getShelvingOrder();
1415         if (scheme != null && scheme.getCodeValue() != null && !scheme.getCodeValue().isEmpty()) {
1416 
1417             holdingsRecord.setCallNumber(callNumber.getNumber());
1418             holdingsRecord.setCallNumberPrefix(callNumber.getPrefix());
1419             holdingsRecord.setShelvingOrder(order.getCodeValue());
1420             CallNumberTypeRecord callNumberTypeRecord = saveCallNumberTypeRecord(callNumber.getShelvingScheme());
1421             holdingsRecord.setCallNumberTypeId(callNumberTypeRecord == null ? null : callNumberTypeRecord.getCallNumberTypeId());
1422         } else if (order != null && scheme != null && !scheme.getCodeValue().isEmpty() && (!order.getCodeValue().isEmpty() || !callNumber.getPrefix().isEmpty() || !callNumber.getNumber().isEmpty())) {
1423             holdingsRecord.setCallNumber(callNumber.getNumber());
1424             holdingsRecord.setCallNumberPrefix(callNumber.getPrefix());
1425             holdingsRecord.setShelvingOrder(order.getCodeValue());
1426             holdingsRecord.setCallNumberTypeId(null);
1427         }
1428     }*/
1429 
1430 
1431     protected void saveFormerIdentifierRecords(List<FormerIdentifier> formerIdentifierList, String itemId) {
1432         Map map = new HashMap();
1433         map.put("itemId", itemId);
1434         List<FormerIdentifierRecord> formerIdentifierRecordList = (List<FormerIdentifierRecord>) getBusinessObjectService().findMatching(FormerIdentifierRecord.class, map);
1435         if (formerIdentifierList.size() > 0) {
1436             List<FormerIdentifierRecord> formerIdentifierRecords = new ArrayList<FormerIdentifierRecord>();
1437             for (int i = 0; i < formerIdentifierList.size(); i++) {
1438                 FormerIdentifier formerIdentifier = formerIdentifierList.get(i);
1439                 if (formerIdentifier.getIdentifier() != null && formerIdentifier.getIdentifier().getIdentifierValue() != null && !"".equals(formerIdentifier.getIdentifier().getIdentifierValue())) {
1440 
1441                     FormerIdentifierRecord formerIdentifierRecord = new FormerIdentifierRecord();
1442                     if (i < formerIdentifierRecordList.size()) {
1443                         formerIdentifierRecord = formerIdentifierRecordList.get(i);
1444                     }
1445                     formerIdentifierRecord.setType(formerIdentifier.getIdentifierType());
1446                     if (formerIdentifier.getIdentifier() != null)
1447                         formerIdentifierRecord.setValue(formerIdentifier.getIdentifier().getIdentifierValue());
1448                     formerIdentifierRecord.setItemId(itemId);
1449                     formerIdentifierRecords.add(formerIdentifierRecord);
1450                 }
1451             }
1452             if (formerIdentifierRecords.size() > 0) {
1453                 getBusinessObjectService().save(formerIdentifierRecords);
1454             }
1455 
1456             if (formerIdentifierRecordList.size() > formerIdentifierList.size()) {
1457                 getBusinessObjectService().delete(formerIdentifierRecordList.subList(formerIdentifierList.size() - 1, formerIdentifierRecordList.size()));
1458             }
1459         }
1460     }
1461 
1462     protected void saveItemNoteRecord(List<Note> noteList, String itemId) {
1463 
1464         Map map = new HashMap();
1465         map.put("itemId", itemId);
1466         List<ItemNoteRecord> itemNoteRecordList = (List<ItemNoteRecord>) getBusinessObjectService().findMatching(ItemNoteRecord.class, map);
1467 
1468 
1469         if (noteList.size() > 0) {
1470             List<ItemNoteRecord> itemNoteRecords = new ArrayList<ItemNoteRecord>();
1471             for (int i = 0; i < noteList.size(); i++) {
1472                 Note note = noteList.get(i);
1473                 if (note.getType() != null && ("public".equalsIgnoreCase(note.getType()) || "nonPublic".equalsIgnoreCase(note.getType()))) {
1474                     ItemNoteRecord itemNoteRecord = new ItemNoteRecord();
1475                     if (i < itemNoteRecordList.size()) {
1476                         itemNoteRecord = itemNoteRecordList.get(i);
1477                     }
1478                     itemNoteRecord.setType(note.getType());
1479                     itemNoteRecord.setNote(note.getValue());
1480                     itemNoteRecord.setItemId(itemId);
1481                     itemNoteRecords.add(itemNoteRecord);
1482                 }
1483             }
1484             if (itemNoteRecords.size() > 0) {
1485                 getBusinessObjectService().save(itemNoteRecords);
1486             }
1487 
1488             if (noteList.size() < itemNoteRecordList.size()) {
1489                 getBusinessObjectService().delete(itemNoteRecordList.subList(noteList.size() - 1, itemNoteRecordList.size()));
1490             }
1491 
1492         }
1493     }
1494 
1495     protected void saveDonorList(List<DonorInfo> donorslist, String itemId) {
1496         Map map = new HashMap();
1497         map.put("itemId", itemId);
1498         List<OLEItemDonorRecord> itemDonorRecordList = (List<OLEItemDonorRecord>) getBusinessObjectService().findMatching(OLEItemDonorRecord.class, map);
1499         if(itemDonorRecordList!=null && itemDonorRecordList.size() >= 0) {
1500             getBusinessObjectService().delete(itemDonorRecordList);
1501         }
1502         if (donorslist.size() > 0) {
1503             List<OLEItemDonorRecord> oleItemDonorRecords = new ArrayList<OLEItemDonorRecord>();
1504             for (int i = 0; i < donorslist.size(); i++) {
1505                 DonorInfo donorinfo = donorslist.get(i);
1506                 if (donorinfo.getDonorCode() != null ) {
1507                     OLEItemDonorRecord oleItemDonorRecord = new OLEItemDonorRecord();
1508                     oleItemDonorRecord.setDonorPublicDisplay(donorinfo.getDonorPublicDisplay());
1509                     oleItemDonorRecord.setDonorCode(donorinfo.getDonorCode());
1510                     oleItemDonorRecord.setDonorNote(donorinfo.getDonorNote());
1511                     oleItemDonorRecord.setItemId(itemId);
1512                     oleItemDonorRecords.add(oleItemDonorRecord);
1513                 }
1514             }
1515             if (oleItemDonorRecords.size() > 0) {
1516                 getBusinessObjectService().save(oleItemDonorRecords);
1517             }
1518         }
1519     }
1520 
1521     protected void saveCheckInLocationRecord(List<CheckInLocation> checkInLocationList, String itemId) {
1522 
1523         Map map = new HashMap();
1524         map.put("itemId", itemId);
1525         List<LocationsCheckinCountRecord> locationsCheckinCountRecordList = (List<LocationsCheckinCountRecord>) getBusinessObjectService().findMatching(LocationsCheckinCountRecord.class, map);
1526         if (locationsCheckinCountRecordList != null && locationsCheckinCountRecordList.size() > 0) {
1527             LocationsCheckinCountRecord locationsCheckinCountRecord = locationsCheckinCountRecordList.get(0);
1528             CheckInLocation checkInLocation = checkInLocationList.get(0);
1529             locationsCheckinCountRecord.setLocationCount(checkInLocation.getCount());
1530             locationsCheckinCountRecord.setLocationName(checkInLocation.getName());
1531             locationsCheckinCountRecord.setLocationInhouseCount(checkInLocation.getInHouseCount());
1532             getBusinessObjectService().save(locationsCheckinCountRecord);
1533         } else {
1534 
1535             CheckInLocation checkInLocation = checkInLocationList.get(0);
1536             LocationsCheckinCountRecord locationsCheckinCountRecord = new LocationsCheckinCountRecord();
1537             locationsCheckinCountRecord.setLocationCount(checkInLocation.getCount());
1538             locationsCheckinCountRecord.setLocationName(checkInLocation.getName());
1539             locationsCheckinCountRecord.setLocationInhouseCount(checkInLocation.getInHouseCount());
1540             locationsCheckinCountRecord.setItemId(itemId);
1541             getBusinessObjectService().save(locationsCheckinCountRecord);
1542 
1543         }
1544 
1545     }
1546 
1547 /*    protected void updateExtensionRecord(OleHoldings oleHoldings, HoldingsExtendInfoRecord holdingsExtendInfoRecord) {
1548 
1549         ReceiptStatusRecord receiptStatusRecord = saveReceiptStatusRecord(oleHoldings.getReceiptStatus());
1550         holdingsExtendInfoRecord.setReceiptStatusId(receiptStatusRecord == null ? null : receiptStatusRecord.getReceiptStatusId());
1551         getBusinessObjectService().save(holdingsExtendInfoRecord);
1552         List<Uri> uriList = oleHoldings.getUri();
1553         if (uriList.size() > 0) {
1554             List<AccessUriRecord> accessInfoRecords = new ArrayList<AccessUriRecord>();
1555             for (Uri uri : uriList) {
1556                 AccessUriRecord accessInfoRecord = new AccessUriRecord();
1557                 accessInfoRecord.setText(uri.getValue());
1558                 accessInfoRecord.setHoldingsExtendInfoId(holdingsExtendInfoRecord.getExtendInfoId());
1559                 accessInfoRecords.add(accessInfoRecord);
1560             }
1561             if (accessInfoRecords.size() > 0)
1562                 getBusinessObjectService().save(accessInfoRecords);
1563         }
1564     }
1565 
1566     protected void saveExtentOfOwnerShips(List<ExtentOfOwnership> extentOfOwnershipList, String holdingsId) {
1567 
1568         for (ExtentOfOwnership extentOfOwnership : extentOfOwnershipList) {
1569             ExtentOfOwnerShipRecord extentOfOwnerShipRecord = new ExtentOfOwnerShipRecord();
1570             extentOfOwnerShipRecord.setCode(extentOfOwnership.getType());
1571             extentOfOwnerShipRecord.setDescription(extentOfOwnership.getType());
1572             extentOfOwnerShipRecord.setText(extentOfOwnership.getTextualHoldings());
1573             extentOfOwnerShipRecord.setHoldingsId(holdingsId);
1574             getBusinessObjectService().save(extentOfOwnerShipRecord);
1575             List<Note> notes = extentOfOwnership.getNote();
1576             if (notes.size() > 0) {
1577                 List<ExtentNoteRecord> extentNoteRecords = new ArrayList<>();
1578                 for (Note note : notes) {
1579                     ExtentNoteRecord noteRecord = new ExtentNoteRecord();
1580                     noteRecord.setExtentOfOwnerShipId(extentOfOwnerShipRecord.getExtOfOwnerShipID());
1581                     noteRecord.setType(note.getType());
1582                     noteRecord.setNote(note.getValue());
1583                     extentNoteRecords.add(noteRecord);
1584                 }
1585                 if (extentNoteRecords.size() > 0)
1586                     getBusinessObjectService().save(extentNoteRecords);
1587             }
1588         }
1589     }
1590 
1591     protected void updateExtentOfOwnerShip(List<ExtentOfOwnership> extentOfOwnershipList, String holdingsId, List<ExtentOfOwnerShipRecord> extentOfOwnerShipRecords) {
1592 
1593         getBusinessObjectService().delete(extentOfOwnerShipRecords);
1594         saveExtentOfOwnerShip(extentOfOwnershipList, holdingsId);
1595     }
1596 
1597     protected void updateHoldingsNoteRecord(List<Note> noteList, String holdingsId, List<HoldingsNoteRecord> holdingsNoteRecords) {
1598         getBusinessObjectService().delete(holdingsNoteRecords);
1599         saveHoldingNoteRecord(noteList, holdingsId);
1600     }  */
1601 
1602 /*    protected void saveHoldingNoteRecord(List<Note> noteList, String holdingsId) {
1603 
1604         List<HoldingsNoteRecord> holdingsNoteRecords = new ArrayList<HoldingsNoteRecord>();
1605         for (Note note : noteList) {
1606             HoldingsNoteRecord holdingsNoteRecord = new HoldingsNoteRecord();
1607             holdingsNoteRecord.setType(note.getType());
1608             holdingsNoteRecord.setNote(note.getValue());
1609             holdingsNoteRecord.setHoldingsId(holdingsId);
1610             holdingsNoteRecords.add(holdingsNoteRecord);
1611         }
1612         if (holdingsNoteRecords.size() > 0)
1613             getBusinessObjectService().save(holdingsNoteRecords);
1614     }*/
1615 
1616     protected Item buildItemContent(ItemRecord itemRecord) {
1617         Item item = new Item();
1618         item.setItemIdentifier(DocumentUniqueIDPrefix.getPrefixedId(itemRecord.getUniqueIdPrefix(), itemRecord.getItemId()));
1619         item.setPurchaseOrderLineItemIdentifier(itemRecord.getPurchaseOrderItemLineId());
1620         item.setVendorLineItemIdentifier(itemRecord.getVendorLineItemId());
1621         item.setFund(itemRecord.getFund());
1622         item.setPrice(itemRecord.getPrice());
1623         item.setBarcodeARSL(itemRecord.getBarCodeArsl());
1624         item.setCopyNumber(itemRecord.getCopyNumber());
1625         item.setEnumeration(itemRecord.getEnumeration());
1626         item.setChronology(itemRecord.getChronology());
1627         item.setNumberOfPieces(itemRecord.getNumberOfPieces());
1628         item.setCheckinNote(itemRecord.getCheckInNote());
1629         item.setLocation(getLocationDetails(itemRecord.getLocation(), itemRecord.getLocationLevel()));
1630         if (itemRecord.getFormerIdentifierRecords() != null) {
1631             List<FormerIdentifier> formerIdList = new ArrayList<FormerIdentifier>();
1632             for (FormerIdentifierRecord formerIdentifierRecord : itemRecord.getFormerIdentifierRecords()) {
1633                 FormerIdentifier formerIdentifier = new FormerIdentifier();
1634                 Identifier identifier = new Identifier();
1635                 identifier.setIdentifierValue(formerIdentifierRecord.getValue());
1636                 formerIdentifier.setIdentifier(identifier);
1637                 formerIdList.add(formerIdentifier);
1638                 item.setFormerIdentifier(formerIdList);
1639             }
1640         }
1641 
1642         AccessInformation accessInformation = new AccessInformation();
1643         accessInformation.setBarcode(itemRecord.getBarCode());
1644         Uri itemuri = new Uri();
1645         itemuri.setValue(itemRecord.getUri());
1646         accessInformation.setUri(itemuri);
1647         item.setAccessInformation(accessInformation);
1648         CallNumber itemCallNumber = new CallNumber();
1649         itemCallNumber.setNumber(itemRecord.getCallNumber());
1650         itemCallNumber.setPrefix(itemRecord.getCallNumberPrefix());
1651         ShelvingScheme itemShelvingScheme = new ShelvingScheme();
1652         if (itemRecord.getCallNumberTypeRecord() != null) {
1653             itemShelvingScheme.setCodeValue(itemRecord.getCallNumberTypeRecord().getCode());
1654             itemShelvingScheme.setFullValue(itemRecord.getCallNumberTypeRecord().getName());
1655             itemCallNumber.setShelvingScheme(itemShelvingScheme);
1656         }
1657         ShelvingOrder itemShelvingOrder = new ShelvingOrder();
1658         itemShelvingOrder.setCodeValue(itemRecord.getShelvingOrder());
1659         itemShelvingOrder.setFullValue(itemRecord.getShelvingOrder());
1660         itemCallNumber.setShelvingOrder(itemShelvingOrder);
1661         item.setCallNumber(itemCallNumber);
1662 
1663         List<Note> notes = new ArrayList<Note>();
1664         if (itemRecord.getItemNoteRecords() != null) {
1665             List<ItemNoteRecord> itemNoteRecords = itemRecord.getItemNoteRecords();
1666             for (ItemNoteRecord itemNoteRecord : itemNoteRecords) {
1667                 Note note = new Note();
1668                 note.setType(itemNoteRecord.getType());
1669                 note.setValue(itemNoteRecord.getNote());
1670                 notes.add(note);
1671             }
1672             item.setNote(notes);
1673         }
1674         List<DonorInfo> donorInfoList = new ArrayList<DonorInfo>();
1675         if (itemRecord.getDonorList() != null) {
1676             List<OLEItemDonorRecord> oleItemDonorRecordList = itemRecord.getDonorList();
1677             for (OLEItemDonorRecord oleItemDonorRecord : oleItemDonorRecordList) {
1678                 DonorInfo donorInfo = new DonorInfo();
1679                 donorInfo.setDonorCode(oleItemDonorRecord.getDonorCode());
1680                 donorInfo.setDonorPublicDisplay(oleItemDonorRecord.getDonorPublicDisplay());
1681                 donorInfo.setDonorNote(oleItemDonorRecord.getDonorNote());
1682                 donorInfoList.add(donorInfo);
1683             }
1684             item.setDonorInfo(donorInfoList);
1685         }
1686         if (itemRecord.getItemStatusRecord() != null) {
1687             ItemStatus itemStatus = new ItemStatus();
1688             itemStatus.setCodeValue(itemRecord.getItemStatusRecord().getCode());
1689             itemStatus.setFullValue(itemRecord.getItemStatusRecord().getCode());
1690             item.setItemStatus(itemStatus);
1691         }
1692         if (itemRecord.getItemTypeRecord() != null) {
1693             ItemType itemType = new ItemType();
1694             itemType.setCodeValue(itemRecord.getItemTypeRecord().getCode());
1695             itemType.setFullValue(itemRecord.getItemTypeRecord().getName());
1696             item.setItemType(itemType);
1697         }
1698         if (itemRecord.getItemTempTypeRecord() != null) {
1699             ItemType itemType = new ItemType();
1700             itemType.setCodeValue(itemRecord.getItemTempTypeRecord().getCode());
1701             itemType.setFullValue(itemRecord.getItemTempTypeRecord().getName());
1702             item.setTemporaryItemType(itemType);
1703         }
1704         List<StatisticalSearchingCode> statisticalSearchingCodes = new ArrayList<StatisticalSearchingCode>();
1705         StatisticalSearchingCode statisticalSearchingCode = new StatisticalSearchingCode();
1706 //        if (itemRecord.getStatisticalSearchRecord() != null) {
1707 //            statisticalSearchingCode.setCodeValue(itemRecord.getStatisticalSearchRecord().getCode());
1708 //            statisticalSearchingCode.setFullValue(itemRecord.getStatisticalSearchRecord().getName());
1709 //        }
1710         statisticalSearchingCodes.add(statisticalSearchingCode);
1711         item.setStatisticalSearchingCode(statisticalSearchingCodes);
1712         HighDensityStorage highDensityStorage = new HighDensityStorage();
1713 
1714         if (itemRecord.getHighDensityStorageRecord() != null) {
1715             HighDensityStorageRecord highDensityStorageRecord = itemRecord.getHighDensityStorageRecord();
1716             highDensityStorage.setModule(highDensityStorageRecord.getModule());
1717             highDensityStorage.setRow(highDensityStorageRecord.getRow());
1718             highDensityStorage.setShelf(highDensityStorageRecord.getShelf());
1719             highDensityStorage.setTray(highDensityStorageRecord.getTray());
1720         }
1721         item.setHighDensityStorage(highDensityStorage);
1722         if (itemRecord.getEffectiveDate() != null) {
1723             //Format formatter = new SimpleDateFormat("yyyy-MM-dd");
1724             //String effectiveDate = formatter.format(itemRecord.getEffectiveDate().toString());
1725             SimpleDateFormat format1 = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss");
1726             SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
1727             Date effectiveDate = null;
1728             try {
1729                 effectiveDate = format2.parse(itemRecord.getEffectiveDate().toString());
1730             } catch (ParseException e) {
1731                 LOG.error("format string to Date " + e);
1732             }
1733             item.setItemStatusEffectiveDate(format1.format(effectiveDate).toString());
1734         }
1735         if(itemRecord.getStaffOnlyFlag() != null) {
1736             item.setStaffOnlyFlag(itemRecord.getStaffOnlyFlag());
1737         }
1738         if(itemRecord.getFastAddFlag() != null) {
1739             item.setFastAddFlag(Boolean.valueOf(itemRecord.getFastAddFlag()));
1740         }
1741         List<LocationsCheckinCountRecord> locationsCheckinCountRecords = itemRecord.getLocationsCheckinCountRecords();
1742         if (locationsCheckinCountRecords != null && locationsCheckinCountRecords.size() > 0) {
1743 
1744             NumberOfCirculations numberOfCirculations = new NumberOfCirculations();
1745             List<CheckInLocation> checkInLocations = new ArrayList<CheckInLocation>();
1746             for (LocationsCheckinCountRecord locationsCheckinCountRecord : locationsCheckinCountRecords) {
1747 
1748                 CheckInLocation checkInLocation = new CheckInLocation();
1749                 checkInLocation.setCount(locationsCheckinCountRecord.getLocationCount());
1750                 checkInLocation.setName(locationsCheckinCountRecord.getLocationName());
1751                 checkInLocation.setInHouseCount(locationsCheckinCountRecord.getLocationInhouseCount());
1752                 checkInLocations.add(checkInLocation);
1753             }
1754             numberOfCirculations.setCheckInLocation(checkInLocations);
1755             item.setNumberOfCirculations(numberOfCirculations);
1756         }
1757         if (itemRecord.getClaimsReturnedFlag() != null) {
1758             item.setClaimsReturnedFlag(Boolean.valueOf(itemRecord.getClaimsReturnedFlag()));
1759         }
1760 
1761         if (itemRecord.getClaimsReturnedFlagCreateDate() != null) {
1762             //try {
1763             SimpleDateFormat format1 = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss");
1764             SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
1765             Date claimReturnCreateDate = null;
1766             try {
1767                 claimReturnCreateDate = format2.parse(itemRecord.getClaimsReturnedFlagCreateDate().toString());
1768             } catch (ParseException e) {
1769                 LOG.error("format string to Date " + e);
1770             }
1771             item.setClaimsReturnedFlagCreateDate(format1.format(claimReturnCreateDate).toString());
1772             //item.setClaimsReturnedFlagCreateDate(getGregorianCalendar(itemRecord.getClaimsReturnedFlagCreateDate()));
1773             /*} catch (DatatypeConfigurationException e) {
1774                 LOG.error(" getGregorianCalendar", e);
1775             }*/
1776         }
1777 
1778         if (itemRecord.getDueDateTime() != null) {
1779             /*try {
1780                 item.setDueDateTime(getGregorianCalendar(itemRecord.getDueDateTime()));
1781             } catch (DatatypeConfigurationException e) {
1782                 LOG.error(" getGregorianCalendar", e);
1783             }*/
1784             //try {
1785             SimpleDateFormat format1 = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
1786             SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
1787             Date dueDateTime = null;
1788             try {
1789                 dueDateTime = format2.parse(itemRecord.getDueDateTime().toString());
1790             } catch (ParseException e) {
1791                 LOG.error("format string to Date " + e);
1792             }
1793             item.setDueDateTime(format1.format(dueDateTime).toString());
1794             /*item.setClaimsReturnedFlagCreateDate(getGregorianCalendar(itemRecord.getClaimsReturnedFlagCreateDate()));
1795             } catch (DatatypeConfigurationException e) {
1796                 LOG.error(" getGregorianCalendar", e);
1797             }*/
1798         }
1799 
1800         if(itemRecord.getClaimsReturnedNote() != null){
1801             item.setClaimsReturnedNote(itemRecord.getClaimsReturnedNote());
1802         }
1803         item.setProxyBorrower(itemRecord.getProxyBorrower()!=null?itemRecord.getProxyBorrower():"");
1804         item.setCurrentBorrower(itemRecord.getCurrentBorrower()!=null?itemRecord.getCurrentBorrower():"");
1805         item.setItemDamagedStatus(itemRecord.isItemDamagedStatus());
1806         if(itemRecord.getDamagedItemNote()!=null){
1807             item.setDamagedItemNote(itemRecord.getDamagedItemNote());
1808         }
1809         if(itemRecord.isMissingPieceFlag()){
1810            item.setMissingPieceFlag(itemRecord.isMissingPieceFlag());
1811         }
1812         if(itemRecord.getMissingPieceFlagNote()!=null){
1813             item.setMissingPieceFlagNote(itemRecord.getMissingPieceFlagNote());
1814         }
1815         if (itemRecord.getMissingPieceEffectiveDate() != null) {
1816             //Format formatter = new SimpleDateFormat("yyyy-MM-dd");
1817             //String effectiveDate = formatter.format(itemRecord.getEffectiveDate().toString());
1818             SimpleDateFormat format1 = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss");
1819             SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
1820             Date effectiveDate = null;
1821             try {
1822                 effectiveDate = format2.parse(itemRecord.getMissingPieceEffectiveDate().toString());
1823             } catch (ParseException e) {
1824                 LOG.error("format string to Date " + e);
1825             }
1826             item.setMissingPieceEffectiveDate(format1.format(effectiveDate).toString());
1827         } else {
1828             SimpleDateFormat df = new SimpleDateFormat("MM/dd/yyyy");
1829             String date=df.format(new Date());
1830             item.setMissingPieceEffectiveDate(date);
1831         }
1832         if(itemRecord.getMissingPiecesCount()!=null){
1833            item.setMissingPiecesCount(itemRecord.getMissingPiecesCount());
1834         }
1835 
1836 
1837         return item;
1838     }
1839 
1840     public LocationLevel createLocationLevel(String locationName, String locationLevelName) {
1841         LocationLevel locationLevel = null;
1842         if (StringUtils.isNotEmpty(locationName ) && StringUtils.isNotEmpty(locationLevelName)) {
1843             String[] locations = locationName.split("/");
1844             String[] locationLevels = locationLevelName.split("/");
1845             String locName = "";
1846             String levelName = "";
1847             if (locations.length > 0 ) {
1848                 locName = locations[0];
1849                 levelName = locationLevels[0];
1850                 if (locationName.contains("/")) {
1851                     locationName = locationName.replaceFirst(locations[0] + "/", "");
1852                 } else {
1853                     locationName = locationName.replace(locations[0], "");
1854                 }
1855 
1856                 if (locationLevelName.contains("/")) {
1857                     locationLevelName = locationLevelName.replaceFirst(locationLevels[0] + "/", "");
1858                 } else {
1859                     locationLevelName = locationLevelName.replace(locationLevels[0], "");
1860                 }
1861                 if (locName != null && locations.length != 0) {
1862                     locationLevel = new LocationLevel();
1863                     locationLevel.setLevel(levelName);
1864                     locationLevel.setName(locName);
1865                     locationLevel.setLocationLevel(createLocationLevel(locationName, locationLevelName));
1866                 }
1867             }
1868         }
1869         return locationLevel;
1870     }
1871 
1872 
1873     private Location getLocationDetails(String locationName, String locationLevelName) {
1874         Location location = new Location();
1875         //LocationLevel locationLevel = new LocationLevel();
1876         LocationLevel locationLevel = createLocationLevel(locationName, locationLevelName);
1877         location.setLocationLevel(locationLevel);
1878         return location;
1879     }
1880 
1881     protected OleHoldings buildHoldingsContent(HoldingsRecord holdingsRecord) {
1882         OleHoldings oleHoldings = new OleHoldings();
1883         // oleHoldings.set
1884 
1885 
1886         oleHoldings.setHoldingsIdentifier(DocumentUniqueIDPrefix.getPrefixedId(holdingsRecord.getUniqueIdPrefix(), holdingsRecord.getHoldingsId()));
1887         if (holdingsRecord.getReceiptStatusRecord() != null) {
1888             ReceiptStatusRecord receiptStatusRecord = holdingsRecord.getReceiptStatusRecord();
1889             if (receiptStatusRecord != null) {
1890                 oleHoldings.setReceiptStatus(receiptStatusRecord.getCode());
1891             }
1892         }
1893        /* if (holdingsRecord.getAccessUriRecords() != null && holdingsRecord.getAccessUriRecords().size() > 0) {
1894             List<Uri> uris = new ArrayList<Uri>();
1895             List<AccessUriRecord> accessUriRecords = holdingsRecord.getAccessUriRecords();
1896             for (AccessUriRecord accessUriRecord : accessUriRecords) {
1897                 Uri uri = new Uri();
1898                 uri.setValue(accessUriRecord.getText());
1899                 uris.add(uri);
1900             }
1901             oleHoldings.setUri(uris);
1902         }*/
1903         if (holdingsRecord.getLocation() != null) {
1904             Location location = getLocationDetails(holdingsRecord.getLocation(), holdingsRecord.getLocationLevel());
1905             oleHoldings.setLocation(location);
1906         }
1907         CallNumber callNumber = new CallNumber();
1908         if (holdingsRecord.getCallNumberTypeRecord() != null) {
1909             callNumber.setNumber(holdingsRecord.getCallNumber());
1910             ShelvingScheme shelvingScheme = new ShelvingScheme();
1911             shelvingScheme.setCodeValue(holdingsRecord.getCallNumberTypeRecord().getCode());
1912             shelvingScheme.setFullValue(holdingsRecord.getCallNumberTypeRecord().getName());
1913             callNumber.setShelvingScheme(shelvingScheme);
1914             ShelvingOrder shelvingOrder = new ShelvingOrder();
1915             shelvingOrder.setCodeValue(holdingsRecord.getShelvingOrder());
1916             shelvingOrder.setFullValue(holdingsRecord.getShelvingOrder());
1917             callNumber.setShelvingOrder(shelvingOrder);
1918             callNumber.setPrefix(holdingsRecord.getCallNumberPrefix());
1919             //callNumber.setCopyNumber(holdingsRecord.getCopyNumber());
1920             oleHoldings.setCallNumber(callNumber);
1921         }
1922         if (holdingsRecord.getCopyNumber() != null) {
1923             oleHoldings.setCopyNumber(holdingsRecord.getCopyNumber());
1924 
1925         }
1926         if (holdingsRecord.getExtentOfOwnerShipRecords() != null && holdingsRecord.getExtentOfOwnerShipRecords().size() > 0) {
1927             List<ExtentOfOwnership> extentOfOwnerships = new ArrayList<ExtentOfOwnership>();
1928             for (ExtentOfOwnerShipRecord extentOfOwnerShipRecord : holdingsRecord.getExtentOfOwnerShipRecords()) {
1929                 ExtentOfOwnership extentOfOwnership = new ExtentOfOwnership();
1930                 if (extentOfOwnerShipRecord.getExtentOfOwnerShipTypeRecord() != null) {
1931                     extentOfOwnership.setTextualHoldings(extentOfOwnerShipRecord.getText());
1932                     extentOfOwnership.setType(extentOfOwnerShipRecord.getExtentOfOwnerShipTypeRecord().getCode());
1933                 }
1934 
1935                 if (extentOfOwnerShipRecord.getExtentNoteRecords() != null && extentOfOwnerShipRecord.getExtentNoteRecords().size() > 0) {
1936                     for (ExtentNoteRecord extentNoteRecord : extentOfOwnerShipRecord.getExtentNoteRecords()) {
1937                         Note note = new Note();
1938                         note.setType(extentNoteRecord.getType());
1939                         note.setValue(extentNoteRecord.getNote());
1940                         extentOfOwnership.getNote().add(note);
1941                     }
1942                 } else {
1943                     Note note = new Note();
1944                     extentOfOwnership.getNote().add(note);
1945                 }
1946 
1947                 extentOfOwnerships.add(extentOfOwnership);
1948             }
1949             oleHoldings.setExtentOfOwnership(extentOfOwnerships);
1950         }
1951 
1952 
1953         if (holdingsRecord.getHoldingsNoteRecords() != null && holdingsRecord.getHoldingsNoteRecords().size() > 0) {
1954             List<HoldingsNoteRecord> holdingsNoteRecords = holdingsRecord.getHoldingsNoteRecords();
1955             if (holdingsNoteRecords != null && holdingsNoteRecords.size() > 0) {
1956                 List<Note> notes = new ArrayList<Note>();
1957                 for (HoldingsNoteRecord holdingsNoteRecord : holdingsNoteRecords) {
1958                     Note note = new Note();
1959                     note.setType(holdingsNoteRecord.getType());
1960                     note.setValue(holdingsNoteRecord.getNote());
1961                     notes.add(note);
1962                 }
1963                 oleHoldings.setNote(notes);
1964             }
1965         }
1966 //        oleHoldings.setCreatedBy(holdingsRecord.getCreatedBy());
1967 //        oleHoldings.setUpdatedBy(holdingsRecord.getUpdatedBy());
1968 //        oleHoldings.setCreatedDate(holdingsRecord.getCreatedDate());
1969 //        oleHoldings.setUpdatedDate(holdingsRecord.getUpdatedDate());
1970         return oleHoldings;
1971     }
1972 
1973     public void updateShelvingOrder(Item item, OleHoldings oleHolding) throws OleDocStoreException {
1974         String callNumber = null;
1975         String shelvingScheme = null;
1976         if (item != null) {
1977             if (item.getCallNumber() == null) {
1978                 item.setCallNumber(new CallNumber());
1979             }
1980             // validating item if call number is available, shelving scheme should be available
1981             // validateCallNumber(item.getCallNumber(), null);
1982             //if call number is null or empty
1983             if (!(item.getCallNumber().getNumber() != null && item.getCallNumber().getNumber().trim().length() > 0)) {
1984                 // if holding call number and shelving scheme is not empty
1985                 if (oleHolding != null && oleHolding.getCallNumber() != null && oleHolding.getCallNumber().getNumber() != null &&
1986                         oleHolding.getCallNumber().getShelvingScheme() != null && oleHolding.getCallNumber().getShelvingScheme().getCodeValue() != null) {
1987                     callNumber = oleHolding.getCallNumber().getNumber();
1988                     shelvingScheme = oleHolding.getCallNumber().getShelvingScheme().getCodeValue();
1989                 }
1990             } else {
1991                 // call number is not empty
1992                 //TODO strip off item info from call number
1993                 callNumber = item.getCallNumber().getNumber();
1994                 //                item.getCallNumber().setNumber(appendItemInfoToCalNumber(item, callNumber));
1995                 if (item.getCallNumber().getShelvingScheme() != null) {
1996                     shelvingScheme = item.getCallNumber().getShelvingScheme().getCodeValue();
1997                 }
1998             }
1999             String shelvingOrd = "";
2000             if (callNumber != null && callNumber.trim().length() > 0 && shelvingScheme != null && shelvingScheme.trim().length() > 0) {
2001                 callNumber = appendItemInfoToCalNumber(item, callNumber);
2002                 //Build sortable key if a valid call number exists
2003                 boolean isValid = validateCallNumber(callNumber, shelvingScheme);
2004                 if (isValid) {
2005                     shelvingOrd = buildSortableCallNumber(callNumber, shelvingScheme);
2006                 } else {
2007                     shelvingOrd = callNumber;
2008                 }
2009                 if (item.getCallNumber().getShelvingOrder() == null) {
2010                     item.getCallNumber().setShelvingOrder(new ShelvingOrder());
2011                 }
2012                 item.getCallNumber().getShelvingOrder().setFullValue(shelvingOrd);
2013             }
2014         }
2015     }
2016 
2017 
2018     protected void processCallNumber(OleHoldings oleHolding) throws OleDocStoreException {
2019         if (oleHolding != null && oleHolding.getCallNumber() != null) {
2020             //validateCallNumber(oleHolding.getCallNumber());
2021             CallNumber cNum = oleHolding.getCallNumber();
2022             computeCallNumberType(cNum);
2023             if (cNum.getNumber() != null && cNum.getNumber().trim().length() > 0) {
2024                 //Build sortable key if a valid call number exists
2025                 boolean isValid = validateCallNumber(cNum.getNumber(), cNum.getShelvingScheme().getCodeValue());
2026                 String value = "";
2027                 if (isValid) {
2028                     value = buildSortableCallNumber(cNum.getNumber(), cNum.getShelvingScheme().getCodeValue());
2029                 } else {
2030                     value = cNum.getNumber();
2031                 }
2032                 if (cNum.getShelvingOrder() == null) {
2033                     cNum.setShelvingOrder(new ShelvingOrder());
2034                 }
2035                 cNum.getShelvingOrder().setFullValue(value);
2036             }
2037         }
2038     }
2039 
2040     /**
2041      * Compute 'call number type name' if a valid 'call number type code' is available
2042      *
2043      * @param callNumber
2044      */
2045     public void computeCallNumberType(CallNumber callNumber) {
2046         Set<String> validCallNumberTypeSet = CallNumberType.validCallNumberTypeCodeSet;
2047         if (callNumber != null) {
2048             if (callNumber.getShelvingScheme() != null) {
2049                 String callNumberTypeCode = callNumber.getShelvingScheme().getCodeValue();
2050                 String callNumberTypeName = "";
2051                 //If call number type code is valid
2052                 if ((StringUtils.isNotEmpty(callNumberTypeCode)) && (validCallNumberTypeSet
2053                         .contains(callNumberTypeCode))) {
2054                     callNumberTypeName = CallNumberType.valueOf(callNumberTypeCode).getDescription();
2055                     callNumber.getShelvingScheme().setFullValue(callNumberTypeName);
2056                 }
2057             }
2058         }
2059     }
2060 
2061     protected boolean validateCallNumber(String callNumber, String codeValue) throws OleDocStoreException {
2062         boolean isValid = false;
2063         if (StringUtils.isNotEmpty(callNumber) && StringUtils.isNotEmpty(codeValue)) {
2064             org.kuali.ole.utility.callnumber.CallNumber callNumberObj = CallNumberFactory.getInstance().getCallNumber(codeValue);
2065             if (callNumberObj != null) {
2066                 isValid = callNumberObj.isValid(callNumber);
2067             }
2068         }
2069         return isValid;
2070     }
2071 
2072     protected String buildSortableCallNumber(String callNumber, String codeValue) throws OleDocStoreException {
2073         String shelvingOrder = "";
2074         if (StringUtils.isNotEmpty(callNumber) && StringUtils.isNotEmpty(codeValue)) {
2075             org.kuali.ole.utility.callnumber.CallNumber callNumberObj = CallNumberFactory.getInstance().getCallNumber(codeValue);
2076             if (callNumberObj != null) {
2077                 shelvingOrder = callNumberObj.getSortableKey(callNumber);
2078                 //shelvingOrder = shelvingOrder.replaceAll(" ", "_");
2079             }
2080         }
2081         return shelvingOrder;
2082     }
2083 
2084     private String appendItemInfoToCalNumber(Item item, String callNumber) {
2085         if (item.getEnumeration() != null && item.getEnumeration().trim().length() > 0) {
2086             callNumber = callNumber + " " + item.getEnumeration().trim();
2087         }
2088         if (item.getChronology() != null && item.getChronology().trim().length() > 0) {
2089             callNumber = callNumber + " " + item.getChronology().trim();
2090 
2091         }
2092         if (item.getCopyNumber() != null && item.getCopyNumber().trim().length() > 0) {
2093             callNumber = callNumber + " " + item.getCopyNumber().trim();
2094         }
2095         return callNumber;
2096     }
2097 
2098     private String resolveLinkingWithBib(Instance instance) {
2099 //        instance.getResourceIdentifier().clear();
2100         if (ProcessParameters.BULK_INGEST_IS_LINKING_ENABLED) {
2101             for (FormerIdentifier frids : instance.getFormerResourceIdentifier()) {
2102                 Identifier identifier = frids.getIdentifier();
2103                 try {
2104                     if (identifier.getIdentifierValue() != null
2105                             && identifier.getIdentifierValue().trim().length() != 0) {
2106                         List<SolrDocument> solrDocs = ServiceLocator.getIndexerService()
2107                                 .getSolrDocument("SystemControlNumber",
2108                                         "\"" + identifier
2109                                                 .getIdentifierValue()
2110                                                 + "\"");
2111                         if (solrDocs != null && solrDocs.size() > 0) {
2112                             for (SolrDocument solrDoc : solrDocs) {
2113                                 if (checkApplicability(identifier.getIdentifierValue(),
2114                                         solrDoc.getFieldValue("SystemControlNumber"))) {
2115                                     instance.getResourceIdentifier().clear();
2116                                     String bibUniqueId = (String) solrDoc.get("uniqueId");
2117                                     instance.getResourceIdentifier().add(solrDoc.getFieldValue("id").toString());
2118                                     return bibUniqueId;
2119                                 }
2120                             }
2121                         }
2122                     }
2123                 } catch (Exception e) {
2124                     LOG.error("Exception (ignored) while linking instance with bib: ", e);
2125                 }
2126             }
2127         }
2128         return null;
2129     }
2130 
2131     private boolean checkApplicability(Object value, Object fieldValue) {
2132         if (fieldValue instanceof Collection) {
2133             for (Object object : (Collection) fieldValue) {
2134                 if (object.equals(value)) {
2135                     return true;
2136                 }
2137             }
2138             return false;
2139         } else {
2140             return value.equals(fieldValue);
2141         }
2142     }
2143 
2144     private XMLGregorianCalendar getGregorianCalendar(Date date) throws DatatypeConfigurationException {
2145         GregorianCalendar gregory = new GregorianCalendar();
2146         gregory.setTime(date);
2147         XMLGregorianCalendar dealCloseDate = DatatypeFactory.newInstance()
2148                 .newXMLGregorianCalendar(gregory);
2149         return dealCloseDate;
2150     }
2151 
2152     private void effectiveDateItem(Item item, ItemRecord itemRecord, String effectiveDateForItem) {
2153         DateFormat df = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss a");
2154         Timestamp effectiveDate = null;
2155         try {
2156             if (!"".equals(item.getItemStatusEffectiveDate()) && item.getItemStatusEffectiveDate() != null) {
2157                 effectiveDate = new Timestamp(df.parse(effectiveDateForItem).getTime());
2158                 itemRecord.setEffectiveDate(effectiveDate);
2159             }
2160 
2161         } catch (Exception e) {
2162             LOG.error("Effective Date for Item" + e);
2163         }
2164     }
2165 
2166     private void claimsReturnsCreateDateItem(Item item, ItemRecord itemRecord, String claimReturnCreateDate) {
2167         DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
2168         Timestamp claimReturnCreateDate1 = null;
2169         try {
2170             if (!"".equals(item.getClaimsReturnedFlagCreateDate()) && item.getClaimsReturnedFlagCreateDate() != null) {
2171                 claimReturnCreateDate1 = new Timestamp(df.parse(claimReturnCreateDate).getTime());
2172                 itemRecord.setClaimsReturnedFlagCreateDate(claimReturnCreateDate1);
2173             }
2174         } catch (Exception e) {
2175             LOG.error("Effective Date for Item" + e);
2176         }
2177     }
2178 
2179     private void dueDateTime(Item item, ItemRecord itemRecord, String dueDateTime) {
2180         DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
2181         Timestamp dueDateTime1 = null;
2182         try {
2183             if (!"".equals(item.getDueDateTime()) && item.getDueDateTime() != null) {
2184                 dueDateTime1 = new Timestamp(df.parse(dueDateTime).getTime());
2185                 itemRecord.setDueDateTime(dueDateTime1);
2186             }
2187         } catch (Exception e) {
2188             LOG.error("Effective Date for Item" + e);
2189         }
2190     }
2191 
2192 /*    public void saveHoldingsRecordAdditonalAttributes(OleHoldings oleHoldings ,AdditionalAttributes additionalAttributes){
2193         if(additionalAttributes != null && additionalAttributes.getAttribute(AdditionalAttributes.HOLDINGS_CREATED_BY) != null){
2194             oleHoldings.setCreatedBy(additionalAttributes.getAttribute(AdditionalAttributes.HOLDINGS_CREATED_BY));
2195         }
2196         try {
2197         if(additionalAttributes != null && additionalAttributes.getAttribute(AdditionalAttributes.HOLDINGS_DATE_ENTERED) != null){
2198 
2199             DateFormat df = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
2200         Timestamp createdDate = null;
2201         String createdDateForHoldings = additionalAttributes.getAttribute(AdditionalAttributes.HOLDINGS_DATE_ENTERED);
2202 
2203             createdDate = new Timestamp(df.parse(createdDateForHoldings).getTime());
2204             oleHoldings.setCreatedDate(createdDate);
2205         }
2206         } catch (Exception e) {
2207             LOG.error("Created Date for Holdings" + e);
2208         }
2209     }*/
2210 
2211     public void saveHoldingsRecordAdditonalAttributesForDate(HoldingsRecord holdingsRecord ,AdditionalAttributes additionalAttributes){
2212         if(additionalAttributes != null && additionalAttributes.getAttribute(AdditionalAttributes.HOLDINGS_CREATED_BY) != null){
2213             holdingsRecord.setCreatedBy(additionalAttributes.getAttribute(AdditionalAttributes.HOLDINGS_CREATED_BY));
2214         }
2215         try {
2216             if(additionalAttributes != null && additionalAttributes.getAttribute(AdditionalAttributes.HOLDINGS_DATE_ENTERED) != null){
2217 
2218                 DateFormat df = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
2219                 Timestamp createdDate = null;
2220                 String createdDateForHoldings = additionalAttributes.getAttribute(AdditionalAttributes.HOLDINGS_DATE_ENTERED);
2221 
2222                 createdDate = new Timestamp(df.parse(createdDateForHoldings).getTime());
2223                 holdingsRecord.setCreatedDate(createdDate);
2224             }
2225         } catch (Exception e) {
2226             LOG.error("Created Date for Holdings" + e);
2227         }
2228     }
2229 }