001package org.kuali.ole.batch.helper; 002 003import org.apache.commons.lang.StringUtils; 004import org.apache.log4j.Logger; 005import org.kuali.ole.OLEConstants; 006import org.kuali.ole.batch.bo.OLEBatchProcessProfileBo; 007import org.kuali.ole.batch.bo.OLEBatchProcessProfileDataMappingOptionsBo; 008import org.kuali.ole.batch.impl.OLEBatchProcess; 009import org.kuali.ole.docstore.common.document.Holdings; 010import org.kuali.ole.docstore.common.document.HoldingsTree; 011import org.kuali.ole.docstore.common.document.content.instance.*; 012import org.kuali.ole.docstore.common.document.content.bib.marc.DataField; 013import org.kuali.ole.docstore.common.document.content.bib.marc.SubField; 014import org.kuali.ole.docstore.common.document.content.instance.xstream.HoldingOlemlRecordProcessor; 015import org.kuali.ole.docstore.common.document.content.instance.xstream.ItemOlemlRecordProcessor; 016import org.springframework.util.CollectionUtils; 017 018import java.util.*; 019 020import static org.kuali.ole.OLEConstants.OLEBatchProcess.*; 021import static org.kuali.ole.OLEConstants.OLEBatchProcess.ERR_ITEM; 022 023/** 024 * Created with IntelliJ IDEA. 025 * User: meenrajd 026 * Date: 9/2/13 027 * Time: 5:12 PM 028 * To change this template use File | Settings | File Templates. 029 */ 030public class InstanceMappingHelper { 031 private List<DataField> dataFieldList = new ArrayList<DataField>(); 032 private String location3, location4, callNumber, callNumberType; 033 private StringBuilder errBuilder; 034 private ItemOlemlRecordProcessor itemOlemlRecordProcessor = new ItemOlemlRecordProcessor(); 035 private HoldingOlemlRecordProcessor holdingOlemlRecordProcessor = new HoldingOlemlRecordProcessor(); 036 037 private static final Logger LOG = Logger.getLogger(InstanceMappingHelper.class); 038 039 040 public List<DataField> generateDataFieldForHolding(HoldingsTree holdingsTree, OLEBatchProcessProfileBo profile, StringBuilder errBuilder) throws Exception { 041 dataFieldList.clear(); 042 this.errBuilder = errBuilder; 043 044 Item item = null; 045 if (holdingsTree != null) { 046 Map<String, String> dataFieldsHoldingsMap = new HashMap<>(); 047 Map<String, String> dataFieldsItemsMap = new HashMap<>(); 048 Map<String, String> dataFieldsDonorMap = new HashMap<>(); 049 List<OLEBatchProcessProfileDataMappingOptionsBo> mappingOptionsBoList = profile.getOleBatchProcessProfileMappingOptionsList().get(0).getOleBatchProcessProfileDataMappingOptionsBoList(); 050 for (OLEBatchProcessProfileDataMappingOptionsBo mappingOptionsBo : mappingOptionsBoList) { 051 if (mappingOptionsBo.getDataType().equalsIgnoreCase(OLEConstants.OLEBatchProcess.BATCH_PROCESS_PROFILE_DATATYPE_HOLDINGS)) { 052 dataFieldsHoldingsMap.put(mappingOptionsBo.getDestinationField(), mappingOptionsBo.getSourceField()); 053 } else if (mappingOptionsBo.getDataType().equalsIgnoreCase(OLEConstants.OLEBatchProcess.BATCH_PROCESS_PROFILE_DATATYPE_ITEM)) { 054 if (mappingOptionsBo.getSourceField().equalsIgnoreCase(DESTINATION_FIELD_DONOR_PUBLIC_DISPLAY) 055 || mappingOptionsBo.getSourceField().equalsIgnoreCase(DESTINATION_FIELD_DONOR_NOTE) 056 || mappingOptionsBo.getSourceField().equalsIgnoreCase(DESTINATION_FIELD_DONOR_CODE)) { 057 dataFieldsDonorMap.put(mappingOptionsBo.getDestinationField(), mappingOptionsBo.getSourceField()); 058 } else { 059 dataFieldsItemsMap.put(mappingOptionsBo.getDestinationField(), mappingOptionsBo.getSourceField()); 060 } 061 062 } 063 } 064 if (!CollectionUtils.isEmpty(dataFieldsHoldingsMap)) { 065 generateSubFieldsForHolding(holdingsTree.getHoldings(), dataFieldsHoldingsMap); 066 } 067 if (!CollectionUtils.isEmpty(dataFieldsItemsMap) || !CollectionUtils.isEmpty(dataFieldsDonorMap)) { 068 for (org.kuali.ole.docstore.common.document.Item itemDoc : holdingsTree.getItems()) { 069 070 if (itemDoc == null) continue; 071 072 073 boolean isStaffOnly = false; 074 if (profile.getExportScope().equalsIgnoreCase(OLEBatchProcess.INCREMENTAL_EXPORT_EX_STAFF)) { 075 if (itemDoc.isStaffOnly()) { 076 isStaffOnly = true; 077 } 078 } 079 080 if (!isStaffOnly) { 081 if (itemDoc.getContent() != null && !itemDoc.getContent().isEmpty()) { 082 item = itemOlemlRecordProcessor.fromXML(itemDoc.getContent()); 083 } else { 084 item = (Item) itemDoc.getContentObject(); 085 } 086 List<DataField> dataFieldsItemList = generateSubFieldsForItem(holdingsTree.getHoldings(), item, dataFieldsItemsMap, dataFieldsDonorMap, new ArrayList<DataField>()); 087 if (!CollectionUtils.isEmpty(dataFieldsItemList)) 088 dataFieldList.addAll(dataFieldsItemList); 089 dataFieldsItemList.clear(); 090 } 091 } 092 } 093 if (CollectionUtils.isEmpty(dataFieldsHoldingsMap) && CollectionUtils.isEmpty(dataFieldsItemsMap) && CollectionUtils.isEmpty(dataFieldsDonorMap)) { 094 return Collections.EMPTY_LIST; 095 } 096 } 097 return dataFieldList; 098 } 099 100 protected void generateSubFieldsForHolding(Holdings holdingsDocument, Map<String, String> dataFieldsHoldingsMap) throws Exception { 101 OleHoldings holdings = null; 102 try { 103 if (holdingsDocument.getContentObject() != null) { 104 holdings= holdingsDocument.getContentObject(); 105 } else { 106 holdings = holdingOlemlRecordProcessor.fromXML(holdingsDocument.getContent()); 107 } 108 for (Map.Entry<String, String> entry : dataFieldsHoldingsMap.entrySet()) { 109 DataField dataField; 110 if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_CALL_NUMBER)) { 111 dataField = checkDataField(dataFieldList, StringUtils.trim(entry.getKey()).substring(0, 3)); 112 if (dataField == null) { 113 dataField = getDataField(entry); 114 generateCallNumber(holdings, getCode(entry.getKey()), dataField); 115 if (!dataField.getSubFields().isEmpty()) dataFieldList.add(dataField); 116 } else { 117 generateCallNumber(holdings, getCode(entry.getKey()), dataField); 118 } 119 } else if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_HOLDING_CALL_NUMBER_TYPE)) { 120 dataField = checkDataField(dataFieldList, StringUtils.trim(entry.getKey()).substring(0, 3)); 121 if (dataField == null) { 122 dataField = getDataField(entry); 123 generateCallNumberType(holdings, getCode(StringUtils.trim(entry.getKey())), dataField); 124 if (!dataField.getSubFields().isEmpty()) dataFieldList.add(dataField); 125 } else { 126 generateCallNumberType(holdings, getCode(StringUtils.trim(entry.getKey())), dataField); 127 } 128 } else if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_LOCATION_LEVEL_1)) { 129 dataField = checkDataField(dataFieldList, StringUtils.trim(entry.getKey()).substring(0, 3)); 130 if (dataField == null) { 131 dataField = getDataField(entry); 132 generateLocationLevel1(holdings, getCode(entry.getKey()), dataField); 133 if (!dataField.getSubFields().isEmpty()) dataFieldList.add(dataField); 134 } else { 135 generateLocationLevel1(holdings, getCode(entry.getKey()), dataField); 136 } 137 } else if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_LOCATION_LEVEL_2)) { 138 dataField = checkDataField(dataFieldList, StringUtils.trim(entry.getKey()).substring(0, 3)); 139 if (dataField == null) { 140 dataField = getDataField(entry); 141 generateLocationLevel2(holdings, getCode(entry.getKey()), dataField); 142 if (!dataField.getSubFields().isEmpty()) dataFieldList.add(dataField); 143 } else { 144 generateLocationLevel2(holdings, getCode(entry.getKey()), dataField); 145 } 146 } else if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_LOCATION_LEVEL_3)) { 147 dataField = checkDataField(dataFieldList, StringUtils.trim(entry.getKey()).substring(0, 3)); 148 if (dataField == null) { 149 dataField = getDataField(entry); 150 generateLocationLevel3(holdings, getCode(entry.getKey()), dataField); 151 if (!dataField.getSubFields().isEmpty()) dataFieldList.add(dataField); 152 } else { 153 generateLocationLevel3(holdings, getCode(entry.getKey()), dataField); 154 } 155 } else if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_LOCATION_LEVEL_4)) { 156 dataField = checkDataField(dataFieldList, StringUtils.trim(entry.getKey()).substring(0, 3)); 157 if (dataField == null) { 158 dataField = getDataField(entry); 159 generateLocationLevel4(holdings, getCode(entry.getKey()), dataField); 160 if (!dataField.getSubFields().isEmpty()) dataFieldList.add(dataField); 161 } else { 162 generateLocationLevel4(holdings, getCode(entry.getKey()), dataField); 163 } 164 } else if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_LOCATION_LEVEL_5)) { 165 dataField = checkDataField(dataFieldList, StringUtils.trim(entry.getKey()).substring(0, 3)); 166 if (dataField == null) { 167 dataField = getDataField(entry); 168 generateLocationLevel5(holdings, getCode(entry.getKey()), dataField); 169 if (!dataField.getSubFields().isEmpty()) dataFieldList.add(dataField); 170 } else { 171 generateLocationLevel5(holdings, getCode(entry.getKey()), dataField); 172 } 173 } else if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_CALL_NUMBER_TYPE_PREFIX)) { 174 dataField = checkDataField(dataFieldList, StringUtils.trim(entry.getKey()).substring(0, 3)); 175 if (dataField == null) { 176 dataField = getDataField(entry); 177 generateCallNumberPrefix(holdings, getCode(entry.getKey()), dataField); 178 if (!dataField.getSubFields().isEmpty()) dataFieldList.add(dataField); 179 } else { 180 generateCallNumberPrefix(holdings, getCode(entry.getKey()), dataField); 181 } 182 } else if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_COPY_NUMBER)) { 183 dataField = checkDataField(dataFieldList, StringUtils.trim(entry.getKey()).substring(0, 3)); 184 if (dataField == null) { 185 dataField = getDataField(entry); 186 generateCopyNumber(holdings, getCode(entry.getKey()), dataField); 187 if (!dataField.getSubFields().isEmpty()) dataFieldList.add(dataField); 188 } else { 189 generateCopyNumber(holdings, getCode(entry.getKey()), dataField); 190 } 191 } else if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.SOURCE_FIELD_DATE_CREATED)) { 192 dataField = checkDataField(dataFieldList, StringUtils.trim(entry.getKey()).substring(0, 3)); 193 if (dataField == null) { 194 dataField = getDataField(entry); 195 generateDateCreated(holdingsDocument, getCode(entry.getKey()), dataField); 196 if (!dataField.getSubFields().isEmpty()) dataFieldList.add(dataField); 197 } else { 198 generateDateCreated(holdingsDocument, getCode(entry.getKey()), dataField); 199 } 200 } 201 } 202 } catch (Exception ex) { 203 LOG.error("Error while mapping instance data ::" + holdings.getHoldingsIdentifier(), ex); 204 buildError(ERR_INSTANCE, holdings.getHoldingsIdentifier(), ERR_CAUSE, ex.getMessage(), TIME_STAMP, new Date().toString()); 205 throw ex; 206 } 207 } 208 209 protected DataField checkDataField(List<DataField> dataFieldList, String dataField) { 210 for (DataField field : dataFieldList) { 211 if (dataField.equals(field.getTag())) { 212 return field; 213 } 214 } 215 return null; 216 } 217 218 protected DataField getDataField(Map.Entry<String, String> entry) { 219 DataField dataField = new DataField(); 220 dataField.setTag(StringUtils.trim(entry.getKey()).substring(0, 3)); 221 dataField.setInd1(" "); 222 dataField.setInd2(" "); 223 return dataField; 224 } 225 226 protected List<DataField> generateSubFieldsForItem(Holdings holdingsDocument, Item item, Map<String, String> dataFieldsItemsMap, Map<String, String> dataFieldsDonorMap, List<DataField> dataFieldItemList) throws Exception { 227 OleHoldings holdings = null; 228 //List<DataField> donorFieldList = new ArrayList<>(); 229 try { 230 if (holdingsDocument.getContent() != null && !holdingsDocument.getContent().isEmpty()) { 231 holdings = holdingOlemlRecordProcessor.fromXML(holdingsDocument.getContent()); 232 } else { 233 holdings = holdingsDocument.getContentObject(); 234 } 235 for (Map.Entry<String, String> entry : dataFieldsItemsMap.entrySet()) { 236 DataField dataField; 237 if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_CALL_NUMBER)) { 238 dataField = checkDataField(dataFieldItemList, StringUtils.trim(entry.getKey()).substring(0, 3)); 239 if (item.getCallNumber() == null) continue; 240 if (callNumber != null && StringUtils.isNotEmpty(item.getCallNumber().getNumber()) && item.getCallNumber().getNumber().equals(callNumber)) 241 continue; 242 if (dataField == null) { 243 dataField = getDataField(entry); 244 generateCallNumber(item, getCode(entry.getKey()), dataField); 245 if (!dataField.getSubFields().isEmpty()) dataFieldItemList.add(dataField); 246 } else { 247 generateCallNumber(item, getCode(entry.getKey()), dataField); 248 } 249 } else if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_HOLDING_CALL_NUMBER_TYPE)) { 250 dataField = checkDataField(dataFieldItemList, StringUtils.trim(entry.getKey()).substring(0, 3)); 251 if (item.getCallNumber() == null) continue; 252 if (callNumberType != null && item.getCallNumber().getShelvingScheme() != null && StringUtils.isNotEmpty(item.getCallNumber().getShelvingScheme().getCodeValue()) && item.getCallNumber().getShelvingScheme().getCodeValue().equals(callNumberType)) 253 continue; 254 if (dataField == null) { 255 dataField = getDataField(entry); 256 generateCallNumberType(item, getCode(entry.getKey()), dataField); 257 if (!dataField.getSubFields().isEmpty()) dataFieldItemList.add(dataField); 258 } else { 259 generateCallNumberType(item, getCode(entry.getKey()), dataField); 260 } 261 } else if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_COPY_NUMBER)) { 262 dataField = checkDataField(dataFieldItemList, StringUtils.trim(entry.getKey()).substring(0, 3)); 263 if (dataField == null) { 264 dataField = getDataField(entry); 265 generateCopyNumber(item, getCode(entry.getKey()), dataField); 266 if (!dataField.getSubFields().isEmpty()) dataFieldItemList.add(dataField); 267 } else { 268 generateCopyNumber(item, getCode(entry.getKey()), dataField); 269 } 270 } else if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_ITEM_ITEM_BARCODE)) { 271 dataField = checkDataField(dataFieldItemList, StringUtils.trim(entry.getKey()).substring(0, 3)); 272 if (dataField == null) { 273 dataField = getDataField(entry); 274 generateItemNumber(item, getCode(entry.getKey()), dataField); 275 if (!dataField.getSubFields().isEmpty()) dataFieldItemList.add(dataField); 276 } else { 277 generateItemNumber(item, getCode(entry.getKey()), dataField); 278 } 279 } else if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.ITEM_TYPE)) { 280 dataField = checkDataField(dataFieldItemList, StringUtils.trim(entry.getKey()).substring(0, 3)); 281 if (dataField == null) { 282 dataField = getDataField(entry); 283 generateItemType(item, getCode(entry.getKey()), dataField); 284 if (!dataField.getSubFields().isEmpty()) dataFieldItemList.add(dataField); 285 } else { 286 generateItemType(item, getCode(entry.getKey()), dataField); 287 } 288 } else if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_LOCATION_LEVEL_1)) { 289 dataField = checkDataField(dataFieldItemList, StringUtils.trim(entry.getKey()).substring(0, 3)); 290 if (dataField == null) { 291 dataField = getDataField(entry); 292 generateLocationLevel1(item, getCode(entry.getKey()), dataField); 293 if (!dataField.getSubFields().isEmpty()) dataFieldItemList.add(dataField); 294 } else { 295 generateLocationLevel1(item, getCode(entry.getKey()), dataField); 296 } 297 } else if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_LOCATION_LEVEL_2)) { 298 dataField = checkDataField(dataFieldItemList, StringUtils.trim(entry.getKey()).substring(0, 3)); 299 if (dataField == null) { 300 dataField = getDataField(entry); 301 generateLocationLevel2(item, getCode(entry.getKey()), dataField); 302 if (!dataField.getSubFields().isEmpty()) dataFieldItemList.add(dataField); 303 } else { 304 generateLocationLevel2(item, getCode(entry.getKey()), dataField); 305 } 306 } else if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_LOCATION_LEVEL_3)) { 307 dataField = checkDataField(dataFieldItemList, StringUtils.trim(entry.getKey()).substring(0, 3)); 308 if (dataField == null) { 309 dataField = getDataField(entry); 310 generateLocationLevel3(item, getCode(entry.getKey()), dataField); 311 if (!dataField.getSubFields().isEmpty()) dataFieldItemList.add(dataField); 312 } else { 313 generateLocationLevel3(item, getCode(entry.getKey()), dataField); 314 } 315 } else if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_LOCATION_LEVEL_4)) { 316 dataField = checkDataField(dataFieldItemList, StringUtils.trim(entry.getKey()).substring(0, 3)); 317 if (dataField == null) { 318 dataField = getDataField(entry); 319 generateLocationLevel4(item, getCode(entry.getKey()), dataField); 320 if (!dataField.getSubFields().isEmpty()) dataFieldItemList.add(dataField); 321 } else { 322 generateLocationLevel4(item, getCode(entry.getKey()), dataField); 323 } 324 } else if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_LOCATION_LEVEL_5)) { 325 dataField = checkDataField(dataFieldItemList, StringUtils.trim(entry.getKey()).substring(0, 3)); 326 if (dataField == null) { 327 dataField = getDataField(entry); 328 generateLocationLevel5(item, getCode(entry.getKey()), dataField); 329 if (!dataField.getSubFields().isEmpty()) dataFieldItemList.add(dataField); 330 } else { 331 generateLocationLevel5(item, getCode(entry.getKey()), dataField); 332 } 333 } /*else if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_DONOR_PUBLIC_DISPLAY)) { 334 for (DonorInfo donorInfo : item.getDonorInfo()) { 335 DataField dataField1 = getDataField(entry); 336 generateDonorPublicDisplay(item, donorInfo, getCode(entry.getKey()), dataField1); 337 if (!dataField1.getSubFields().isEmpty()) donorFieldList.add(dataField1); 338 } 339 } else if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_DONOR_NOTE)) { 340 for (DonorInfo donorInfo : item.getDonorInfo()) { 341 DataField dataField1 = getDataField(entry); 342 generateDonorNote(item, donorInfo, getCode(entry.getKey()), dataField1); 343 if (!dataField1.getSubFields().isEmpty()) donorFieldList.add(dataField1); 344 } 345 }*/ else if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_CALL_NUMBER_TYPE_PREFIX)) { 346 dataField = checkDataField(dataFieldItemList, StringUtils.trim(entry.getKey()).substring(0, 3)); 347 if (dataField == null) { 348 dataField = getDataField(entry); 349 generateCallNumberPrefix(item, getCode(entry.getKey()), dataField); 350 if (!dataField.getSubFields().isEmpty()) dataFieldItemList.add(dataField); 351 } else { 352 generateCallNumberPrefix(item, getCode(entry.getKey()), dataField); 353 } 354 } else if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_ITEM_HOLDINGS_CALL_NUMBER)) { 355 dataField = checkDataField(dataFieldItemList, StringUtils.trim(entry.getKey()).substring(0, 3)); 356 if (dataField == null) { 357 dataField = getDataField(entry); 358 generateCallNumber(holdings, getCode(entry.getKey()), dataField); 359 if (!dataField.getSubFields().isEmpty()) dataFieldItemList.add(dataField); 360 } else { 361 generateCallNumber(holdings, getCode(entry.getKey()), dataField); 362 } 363 } else if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_ITEM_HOLDINGS_CALL_NUMBER_TYPE)) { 364 dataField = checkDataField(dataFieldItemList, StringUtils.trim(entry.getKey()).substring(0, 3)); 365 if (dataField == null) { 366 dataField = getDataField(entry); 367 generateCallNumberType(holdings, getCode(entry.getKey()), dataField); 368 if (!dataField.getSubFields().isEmpty()) dataFieldItemList.add(dataField); 369 } else { 370 generateCallNumberType(holdings, getCode(entry.getKey()), dataField); 371 } 372 } else if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_ITEM_HOLDINGS_COPY_NUMBER)) { 373 dataField = checkDataField(dataFieldItemList, StringUtils.trim(entry.getKey()).substring(0, 3)); 374 if (dataField == null) { 375 dataField = getDataField(entry); 376 generateCopyNumber(holdings, getCode(entry.getKey()), dataField); 377 if (!dataField.getSubFields().isEmpty()) dataFieldItemList.add(dataField); 378 } else { 379 generateCopyNumber(holdings, getCode(entry.getKey()), dataField); 380 } 381 } else if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_ITEM_HOLDINGS_CALL_NUMBER_PREFIX)) { 382 dataField = checkDataField(dataFieldItemList, StringUtils.trim(entry.getKey()).substring(0, 3)); 383 if (dataField == null) { 384 dataField = getDataField(entry); 385 generateCallNumberPrefix(holdings, getCode(entry.getKey()), dataField); 386 if (!dataField.getSubFields().isEmpty()) dataFieldItemList.add(dataField); 387 } else { 388 generateCallNumberPrefix(holdings, getCode(entry.getKey()), dataField); 389 } 390 } else if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_ITEM_HOLDINGS_LOCATION_LEVEL_1)) { 391 dataField = checkDataField(dataFieldItemList, StringUtils.trim(entry.getKey()).substring(0, 3)); 392 if (dataField == null) { 393 dataField = getDataField(entry); 394 generateLocationLevel1(holdings, getCode(entry.getKey()), dataField); 395 if (!dataField.getSubFields().isEmpty()) dataFieldItemList.add(dataField); 396 } else { 397 generateLocationLevel1(holdings, getCode(entry.getKey()), dataField); 398 } 399 } else if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_ITEM_HOLDINGS_LOCATION_LEVEL_2)) { 400 dataField = checkDataField(dataFieldItemList, StringUtils.trim(entry.getKey()).substring(0, 3)); 401 if (dataField == null) { 402 dataField = getDataField(entry); 403 generateLocationLevel2(holdings, getCode(entry.getKey()), dataField); 404 if (!dataField.getSubFields().isEmpty()) dataFieldItemList.add(dataField); 405 } else { 406 generateLocationLevel2(holdings, getCode(entry.getKey()), dataField); 407 } 408 } else if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_ITEM_HOLDINGS_LOCATION_LEVEL_3)) { 409 dataField = checkDataField(dataFieldItemList, StringUtils.trim(entry.getKey()).substring(0, 3)); 410 if (dataField == null) { 411 dataField = getDataField(entry); 412 generateLocationLevel3(holdings, getCode(entry.getKey()), dataField); 413 if (!dataField.getSubFields().isEmpty()) dataFieldItemList.add(dataField); 414 } else { 415 generateLocationLevel3(holdings, getCode(entry.getKey()), dataField); 416 } 417 } else if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_ITEM_HOLDINGS_LOCATION_LEVEL_4)) { 418 dataField = checkDataField(dataFieldItemList, StringUtils.trim(entry.getKey()).substring(0, 3)); 419 if (dataField == null) { 420 dataField = getDataField(entry); 421 generateLocationLevel4(holdings, getCode(entry.getKey()), dataField); 422 if (!dataField.getSubFields().isEmpty()) dataFieldItemList.add(dataField); 423 } else { 424 generateLocationLevel4(holdings, getCode(entry.getKey()), dataField); 425 } 426 } else if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_ITEM_HOLDINGS_LOCATION_LEVEL_5)) { 427 dataField = checkDataField(dataFieldItemList, StringUtils.trim(entry.getKey()).substring(0, 3)); 428 if (dataField == null) { 429 dataField = getDataField(entry); 430 generateLocationLevel5(holdings, getCode(entry.getKey()), dataField); 431 if (!dataField.getSubFields().isEmpty()) dataFieldItemList.add(dataField); 432 } else { 433 generateLocationLevel5(holdings, getCode(entry.getKey()), dataField); 434 } 435 } else if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_ITEM_STATUS)) { 436 dataField = checkDataField(dataFieldItemList, StringUtils.trim(entry.getKey()).substring(0, 3)); 437 if (dataField == null) { 438 dataField = getDataField(entry); 439 generateItemStatus(item, getCode(entry.getKey()), dataField); 440 if (!dataField.getSubFields().isEmpty()) dataFieldItemList.add(dataField); 441 } else { 442 generateItemStatus(item, getCode(entry.getKey()), dataField); 443 } 444 } else if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_ITEM_ENUMERATION)) { 445 dataField = checkDataField(dataFieldItemList, StringUtils.trim(entry.getKey()).substring(0, 3)); 446 if (dataField == null) { 447 dataField = getDataField(entry); 448 generateEnumeration(item, getCode(entry.getKey()), dataField); 449 if (!dataField.getSubFields().isEmpty()) dataFieldItemList.add(dataField); 450 } else { 451 generateEnumeration(item, getCode(entry.getKey()), dataField); 452 } 453 } else if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_ITEM_CHRONOLOGY)) { 454 dataField = checkDataField(dataFieldItemList, StringUtils.trim(entry.getKey()).substring(0, 3)); 455 if (dataField == null) { 456 dataField = getDataField(entry); 457 generateChronology(item, getCode(entry.getKey()), dataField); 458 if (!dataField.getSubFields().isEmpty()) dataFieldItemList.add(dataField); 459 } else { 460 generateChronology(item, getCode(entry.getKey()), dataField); 461 } 462 } else if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_VENDOR_LINE_ITEM_IDENTIFIER)) { 463 dataField = checkDataField(dataFieldItemList, StringUtils.trim(entry.getKey()).substring(0, 3)); 464 if (dataField == null) { 465 dataField = getDataField(entry); 466 generateVendorLineItemIdentifier(item, getCode(entry.getKey()), dataField); 467 if (!dataField.getSubFields().isEmpty()) dataFieldItemList.add(dataField); 468 } else { 469 generateVendorLineItemIdentifier(item, getCode(entry.getKey()), dataField); 470 } 471 } 472 } 473 if (!CollectionUtils.isEmpty(dataFieldsDonorMap)) { 474 //dataFieldItemList.addAll(donorFieldList); 475 generateDonorFields(item, dataFieldsDonorMap); 476 } 477 } catch (Exception ex) { 478 LOG.error("Error while mapping item data ::" + item.getItemIdentifier(), ex); 479 buildError(ERR_INSTANCE, item.getItemIdentifier(), ERR_CAUSE, ex.getMessage(), TIME_STAMP, new Date().toString()); 480 throw ex; 481 } 482 return dataFieldItemList; 483 } 484 485 private void generateDonorFields(Item item, Map<String, String> dataFieldsDonorMap) { 486 List<DataField> donorFieldList = new ArrayList<>(); 487 try { 488 if (!CollectionUtils.isEmpty(item.getDonorInfo())) { 489 for (DonorInfo donorInfo : item.getDonorInfo()) { 490 for (Map.Entry<String, String> entry : dataFieldsDonorMap.entrySet()) { 491 DataField dataField; 492 if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_DONOR_PUBLIC_DISPLAY)) { 493 dataField = checkDataField(donorFieldList, StringUtils.trim(entry.getKey()).substring(0, 3)); 494 if (dataField == null) { 495 dataField = getDataField(entry); 496 generateDonorPublicDisplay(item, donorInfo, getCode(entry.getKey()), dataField); 497 if (!dataField.getSubFields().isEmpty()) donorFieldList.add(dataField); 498 } else { 499 generateDonorPublicDisplay(item, donorInfo, getCode(entry.getKey()), dataField); 500 } 501 } else if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_DONOR_NOTE)) { 502 dataField = checkDataField(donorFieldList, StringUtils.trim(entry.getKey()).substring(0, 3)); 503 if (dataField == null) { 504 dataField = getDataField(entry); 505 generateDonorNote(item, donorInfo, getCode(entry.getKey()), dataField); 506 if (!dataField.getSubFields().isEmpty()) donorFieldList.add(dataField); 507 } else { 508 generateDonorNote(item, donorInfo, getCode(entry.getKey()), dataField); 509 } 510 } else if (entry.getValue().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_DONOR_CODE)) { 511 dataField = checkDataField(donorFieldList, StringUtils.trim(entry.getKey()).substring(0, 3)); 512 if (dataField == null) { 513 dataField = getDataField(entry); 514 generateDonorCode(item, donorInfo, getCode(entry.getKey()), dataField); 515 if (!dataField.getSubFields().isEmpty()) donorFieldList.add(dataField); 516 } else { 517 generateDonorCode(item, donorInfo, getCode(entry.getKey()), dataField); 518 } 519 } 520 } 521 dataFieldList.addAll(donorFieldList); 522 donorFieldList.clear(); 523 } 524 } 525 } catch (Exception ex) { 526 LOG.error("Error while mapping item data ::" + item.getItemIdentifier(), ex); 527 buildError(ERR_INSTANCE, item.getItemIdentifier(), ERR_CAUSE, ex.getMessage(), TIME_STAMP, new Date().toString()); 528 throw ex; 529 } 530 } 531 532 /** 533 * generates the subfields for the given instance and mapping options 534 * 535 * @param mappingOptionsBoList 536 * @param instance 537 * @param dataField 538 */ 539 protected void generateSubFields(List<OLEBatchProcessProfileDataMappingOptionsBo> mappingOptionsBoList, Instance instance, DataField dataField) throws Exception { 540 try { 541 for (OLEBatchProcessProfileDataMappingOptionsBo mappingField : mappingOptionsBoList) { 542 if (!mappingField.getDataType().equalsIgnoreCase(OLEConstants.OLEBatchProcess.BATCH_PROCESS_PROFILE_DATATYPE_HOLDINGS)) continue; 543 /*if (mappingField.getSourceField().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_CALL_NUMBER)) { 544 generateCallNumber(instance, getCode(mappingField.getDestinationField()), dataField); 545 } else if (mappingField.getSourceField().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_HOLDING_CALL_NUMBER_TYPE)) { 546 generateCallNumberType(instance, getCode(mappingField.getDestinationField()), dataField); 547 } else if (mappingField.getSourceField().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_LOCATION_LEVEL_1)) { 548 generateLocationLevel1(instance, getCode(mappingField.getDestinationField()), dataField); 549 } else if (mappingField.getSourceField().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_LOCATION_LEVEL_2)) { 550 generateLocationLevel2(instance, getCode(mappingField.getDestinationField()), dataField); 551 } else if (mappingField.getSourceField().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_LOCATION_LEVEL_3)) { 552 generateLocationLevel3(instance, getCode(mappingField.getDestinationField()), dataField); 553 } else if (mappingField.getSourceField().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_LOCATION_LEVEL_4)) { 554 generateLocationLevel4(instance, getCode(mappingField.getDestinationField()), dataField); 555 } else if (mappingField.getSourceField().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_LOCATION_LEVEL_5)) { 556 generateLocationLevel5(instance, getCode(mappingField.getDestinationField()), dataField); 557 } else if (mappingField.getSourceField().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_CALL_NUMBER_TYPE_PREFIX)) { 558 generateCallNumberPrefix(instance, getCode(mappingField.getDestinationField()), dataField); 559 } else if (mappingField.getSourceField().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_COPY_NUMBER)) { 560 generateCopyNumber(instance, getCode(mappingField.getDestinationField()), dataField); 561 } else if (mappingField.getSourceField().equalsIgnoreCase(OLEConstants.OLEBatchProcess.SOURCE_FIELD_DATE_CREATED)) { 562 generateDateCreated(instance, getCode(mappingField.getDestinationField()), dataField); 563 }*/ 564 } 565 } catch (Exception ex) { 566 LOG.error("Error while mapping instance data ::" + instance.getInstanceIdentifier(), ex); 567 buildError(ERR_INSTANCE, instance.getInstanceIdentifier(), ERR_CAUSE, ex.getMessage(), TIME_STAMP, new Date().toString()); 568 throw ex; 569 } 570 } 571 572 protected void generateSubFields(List<OLEBatchProcessProfileDataMappingOptionsBo> mappingOptionsBoList, Instance instance, Item item, DataField dataField) throws Exception { 573 try { 574 for (OLEBatchProcessProfileDataMappingOptionsBo mappingField : mappingOptionsBoList) { 575 if (!mappingField.getDataType().equalsIgnoreCase(OLEConstants.OLEBatchProcess.BATCH_PROCESS_PROFILE_DATATYPE_ITEM)) continue; 576 if (mappingField.getSourceField().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_CALL_NUMBER)) { 577 if (item.getCallNumber() == null) continue; 578 if (callNumber != null && StringUtils.isNotEmpty(item.getCallNumber().getNumber()) && item.getCallNumber().getNumber().equals(callNumber)) 579 continue; 580 generateCallNumber(item, getCode(mappingField.getDestinationField()), dataField); 581 } else if (mappingField.getSourceField().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_HOLDING_CALL_NUMBER_TYPE)) { 582 if (item.getCallNumber() == null) continue; 583 if (callNumberType != null && item.getCallNumber().getShelvingScheme() != null && StringUtils.isNotEmpty(item.getCallNumber().getShelvingScheme().getCodeValue()) && item.getCallNumber().getShelvingScheme().getCodeValue().equals(callNumberType)) 584 continue; 585 generateCallNumberType(item, getCode(mappingField.getDestinationField()), dataField); 586 } else if (mappingField.getSourceField().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_COPY_NUMBER)) { 587 generateCopyNumber(item, getCode(mappingField.getDestinationField()), dataField); 588 } else if (mappingField.getSourceField().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_ITEM_ITEM_BARCODE)) { 589 generateItemNumber(item, getCode(mappingField.getDestinationField()), dataField); 590 } else if (mappingField.getSourceField().equalsIgnoreCase(OLEConstants.OLEBatchProcess.ITEM_TYPE)) { 591 generateItemType(item, getCode(mappingField.getDestinationField()), dataField); 592 } else if (mappingField.getSourceField().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_LOCATION_LEVEL_1)) { 593 generateLocationLevel1(item, getCode(mappingField.getDestinationField()), dataField); 594 } else if (mappingField.getSourceField().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_LOCATION_LEVEL_2)) { 595 generateLocationLevel2(item, getCode(mappingField.getDestinationField()), dataField); 596 } else if (mappingField.getSourceField().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_LOCATION_LEVEL_3)) { 597 generateLocationLevel3(item, getCode(mappingField.getDestinationField()), dataField); 598 } else if (mappingField.getSourceField().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_LOCATION_LEVEL_4)) { 599 generateLocationLevel4(item, getCode(mappingField.getDestinationField()), dataField); 600 } else if (mappingField.getSourceField().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_LOCATION_LEVEL_5)) { 601 generateLocationLevel5(item, getCode(mappingField.getDestinationField()), dataField); 602 } /*else if (mappingField.getSourceField().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_DONOR_PUBLIC_DISPLAY)) { 603 getDonorPubDisp(item, getCode(mappingField.getDestinationField()), dataField); 604 } else if (mappingField.getSourceField().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_DONOR_CODE)) { 605 getDonorNote(item, getCode(mappingField.getDestinationField()), dataField); 606 }*/ else if (mappingField.getSourceField().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_CALL_NUMBER_TYPE_PREFIX)) { 607 generateCallNumberPrefix(item, getCode(mappingField.getDestinationField()), dataField); 608 } /*else if (mappingField.getSourceField().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_ITEM_HOLDINGS_CALL_NUMBER)) { 609 generateCallNumber(instance, getCode(mappingField.getDestinationField()), dataField); 610 } else if (mappingField.getSourceField().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_ITEM_HOLDINGS_CALL_NUMBER_TYPE)) { 611 generateCallNumberType(instance, getCode(mappingField.getDestinationField()), dataField); 612 } else if (mappingField.getSourceField().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_ITEM_HOLDINGS_COPY_NUMBER)) { 613 generateCopyNumber(instance, getCode(mappingField.getDestinationField()), dataField); 614 } else if (mappingField.getSourceField().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_ITEM_HOLDINGS_LOCATION_LEVEL_1)) { 615 generateLocationLevel1(instance, getCode(mappingField.getDestinationField()), dataField); 616 } else if (mappingField.getSourceField().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_ITEM_HOLDINGS_LOCATION_LEVEL_2)) { 617 generateLocationLevel2(instance, getCode(mappingField.getDestinationField()), dataField); 618 } else if (mappingField.getSourceField().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_ITEM_HOLDINGS_LOCATION_LEVEL_3)) { 619 generateLocationLevel3(instance, getCode(mappingField.getDestinationField()), dataField); 620 } else if (mappingField.getSourceField().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_ITEM_HOLDINGS_LOCATION_LEVEL_4)) { 621 generateLocationLevel4(instance, getCode(mappingField.getDestinationField()), dataField); 622 } else if (mappingField.getSourceField().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DESTINATION_FIELD_ITEM_HOLDINGS_LOCATION_LEVEL_5)) { 623 generateLocationLevel5(instance, getCode(mappingField.getDestinationField()), dataField); 624 }*/ 625 } 626 } catch (Exception ex) { 627 LOG.error("Error while mapping item data ::" + item.getItemIdentifier(), ex); 628 buildError(ERR_INSTANCE, item.getItemIdentifier(), ERR_CAUSE, ex.getMessage(), TIME_STAMP, new Date().toString()); 629 throw ex; 630 } 631 } 632 633 /** 634 * generates subfields for the call number for the given item 635 * 636 * @param item 637 * @param code 638 * @param dataField 639 */ 640 private void generateCallNumber(Item item, String code, DataField dataField) { 641 try { 642 if (item != null && item.getCallNumber() != null && StringUtils.isNotEmpty(item.getCallNumber().getNumber())) { 643 SubField subField = new SubField(); 644 subField.setCode(code); 645 subField.setValue(item.getCallNumber().getNumber()); 646 addDataFieldForItem(dataField, subField); 647 } 648 } catch (Exception ex) { 649 logError(item, ex, "generateCallNumber()"); 650 } 651 652 } 653 654 /** 655 * generates the subfields for the call number type for the given item 656 * 657 * @param item 658 * @param code 659 * @param dataField 660 */ 661 private void generateCallNumberType(Item item, String code, DataField dataField) { 662 try { 663 if (item != null && item.getCallNumber() != null && item.getCallNumber().getShelvingScheme() != null && StringUtils.isNotEmpty(item.getCallNumber().getShelvingScheme().getCodeValue())) { 664 SubField subField = new SubField(); 665 subField.setCode(code); 666 subField.setValue(item.getCallNumber().getShelvingScheme().getCodeValue()); 667 addDataFieldForItem(dataField, subField); 668 } 669 } catch (Exception ex) { 670 logError(item, ex, "generateCallNumberType()"); 671 } 672 } 673 674 /** 675 * generates the subfields for call number for the given instance 676 * 677 * @param holdings 678 * @param code 679 * @param dataField 680 */ 681 private void generateCallNumber(OleHoldings holdings, String code, DataField dataField) throws Exception { 682 SubField subField = new SubField(); 683 subField.setCode(code); 684 try { 685 if (holdings != null && holdings.getCallNumber() != null && StringUtils.isNotEmpty(holdings.getCallNumber().getNumber())) { 686 subField.setValue(holdings.getCallNumber().getNumber()); 687 callNumber = holdings.getCallNumber().getNumber(); 688 addDataField(dataField, subField); 689 } 690 } catch (Exception ex) { 691 logError(holdings, ex, "generateCallNumber()"); 692 } 693 694 } 695 696 /** 697 * generates the call number prefix for the given instance 698 * @param holdings 699 * @param code 700 * @param dataField 701 * @throws Exception 702 */ 703 private void generateCallNumberPrefix(OleHoldings holdings, String code, DataField dataField) throws Exception { 704 SubField subField = new SubField(); 705 subField.setCode(code); 706 try { 707 if (holdings != null && holdings.getCallNumber() != null && StringUtils.isNotEmpty(holdings.getCallNumber().getPrefix())) { 708 subField.setValue(holdings.getCallNumber().getPrefix()); 709 addDataField(dataField, subField); 710 } 711 } catch (Exception ex) { 712 logError(holdings, ex, "generateCallNumberPrefix()"); 713 } 714 715 } 716 717 /** 718 * generates the copy number for the given instance 719 * @param holdings 720 * @param code 721 * @param dataField 722 * @throws Exception 723 */ 724 private void generateCopyNumber(OleHoldings holdings, String code, DataField dataField) throws Exception { 725 SubField subField = new SubField(); 726 subField.setCode(code); 727 try { 728 if (holdings != null && StringUtils.isNotEmpty(holdings.getCopyNumber())) { 729 subField.setValue(holdings.getCopyNumber()); 730 addDataField(dataField, subField); 731 } 732 } catch (Exception ex) { 733 logError(holdings, ex, "generateCopyNumber()"); 734 } 735 736 } 737 738 /** 739 * generates the call number prefix for the given item 740 * @param item 741 * @param code 742 * @param dataField 743 * @throws Exception 744 */ 745 private void generateCallNumberPrefix(Item item, String code, DataField dataField) throws Exception { 746 SubField subField = new SubField(); 747 subField.setCode(code); 748 try { 749 if (item != null && item.getCallNumber() != null && StringUtils.isNotEmpty(item.getCallNumber().getPrefix())) { 750 subField.setValue(item.getCallNumber().getPrefix()); 751 addDataFieldForItem(dataField, subField); 752 } 753 } catch (Exception ex) { 754 logError(item, ex, "generateCallNumberPrefix()"); 755 } 756 757 } 758 759 /** 760 * generates the subfield for the call number type for the given instance 761 * 762 * @param holdings 763 * @param code 764 * @param dataField 765 */ 766 private void generateCallNumberType(OleHoldings holdings, String code, DataField dataField) throws Exception { 767 SubField subField = new SubField(); 768 subField.setCode(code); 769 try { 770 if (holdings != null && holdings.getCallNumber() != null && 771 holdings.getCallNumber().getShelvingScheme() != null && StringUtils.isNotEmpty(holdings.getCallNumber().getShelvingScheme().getCodeValue())) { 772 subField.setValue(holdings.getCallNumber().getShelvingScheme().getCodeValue()); 773 callNumberType = holdings.getCallNumber().getShelvingScheme().getCodeValue(); 774 addDataField(dataField, subField); 775 } 776 } catch (Exception ex) { 777 logError(holdings, ex, "generateCallNumberType()"); 778 } 779 } 780 781 /** 782 * creates the subfields for the given item 783 * 784 * @param item 785 * @param code 786 * @param dataField 787 */ 788 private void generateCopyNumber(Item item, String code, DataField dataField) { 789 try { 790 if (item != null && StringUtils.isNotEmpty(item.getCopyNumber())) { 791 SubField subField = new SubField(); 792 subField.setCode(code); 793 subField.setValue(item.getCopyNumber()); 794 addDataFieldForItem(dataField, subField); 795 } 796 } catch (Exception ex) { 797 logError(item, ex, "generateCopyNumber()"); 798 } 799 } 800 801 private SubField generateMarcEnumeration(Item item, String code) { 802 SubField subField = new SubField(); 803 subField.setCode(code); 804 subField.setValue(""); 805 if (item != null && item.getEnumeration() != null) { 806 subField.setValue(item.getEnumeration()); 807 } 808 return subField; 809 } 810 811 /** 812 * generates the subfields for all item numbers for all items for the given instance 813 * 814 * @param instance 815 * @param code 816 * @param dataField 817 */ 818 private void generateItemNumber(Instance instance, String code, DataField dataField) { 819 Items items = instance.getItems(); 820 for (Item item : items.getItem()) { 821 generateItemNumber(item, code, dataField); 822 } 823 } 824 825 /** 826 * generates the subfield for the given item 827 * 828 * @param item 829 * @param code 830 * @param dataField 831 */ 832 private void generateItemNumber(Item item, String code, DataField dataField) { 833 try { 834 if (item != null && item.getAccessInformation() != null && item.getAccessInformation().getBarcode() != null) { 835 SubField subField = new SubField(); 836 subField.setCode(code); 837 subField.setValue(item.getAccessInformation().getBarcode()); 838 addDataFieldForItem(dataField, subField); 839 } 840 } catch (Exception ex) { 841 logError(item, ex, "generateItemNumber()"); 842 } 843 } 844 845 /** 846 * generates subfields for item type for the given item 847 * 848 * @param item 849 * @param code 850 * @param dataField 851 */ 852 private void generateItemType(Item item, String code, DataField dataField) { 853 try { 854 if (item != null && item.getItemType() != null) { 855 SubField subField = new SubField(); 856 subField.setCode(code); 857 subField.setValue(item.getItemType().getCodeValue()); 858 addDataFieldForItem(dataField, subField); 859 } 860 } catch (Exception ex) { 861 logError(item, ex, "generateItemType()"); 862 } 863 } 864 865 /** 866 * generates subfields for item status for the given item 867 * 868 * @param item 869 * @param code 870 * @param dataField 871 */ 872 private void generateItemStatus(Item item, String code, DataField dataField) { 873 try { 874 if (item != null && item.getItemStatus() != null) { 875 SubField subField = new SubField(); 876 subField.setCode(code); 877 subField.setValue(item.getItemStatus().getCodeValue()); 878 addDataFieldForItem(dataField, subField); 879 } 880 } catch (Exception ex) { 881 logError(item, ex, "generateItemStatus()"); 882 } 883 } 884 885 /** 886 * generates subfields for item type for all items in the given Instance 887 * 888 * @param instance 889 * @param code 890 * @param dataField 891 */ 892 private void generateItemType(Instance instance, String code, DataField dataField) { 893 Items items = instance.getItems(); 894 for (Item item : items.getItem()) { 895 generateItemType(item, code, dataField); 896 } 897 } 898 899 /** 900 * generates the subfields for the location level -4 COLLECTION for the given instance 901 * 902 * @param holdings 903 * @param code 904 * @param dataField 905 */ 906 private void generateLocationLevel4(OleHoldings holdings, String code, DataField dataField) throws Exception { 907 String locationLevelName; 908 try { 909 if (holdings != null && holdings.getLocation() != null 910 && (locationLevelName = getLocationLevelName(holdings.getLocation().getLocationLevel(), "COLLECTION")) != null) { 911 SubField subField = new SubField(); 912 subField.setCode(code); 913 subField.setValue(locationLevelName); 914 location4 = locationLevelName; 915 addDataField(dataField, subField); 916 } 917 } catch (Exception ex) { 918 logError(holdings, ex, "generateLocationLevel4()"); 919 } 920 921 } 922 923 /** 924 * generates the subfield for the location level 4 - COLLECTION for the given item 925 * 926 * @param item 927 * @param code 928 * @param dataField 929 */ 930 private void generateLocationLevel4(Item item, String code, DataField dataField) { 931 String locationLevelName; 932 try { 933 if (item != null && item.getLocation() != null && (locationLevelName = getLocationLevelName(item.getLocation().getLocationLevel(), "COLLECTION")) != null) { 934 //if (location4 != null && location4.equals(locationLevelName)) return; 935 SubField subField = new SubField(); 936 subField.setCode(code); 937 subField.setValue(locationLevelName); 938 addDataFieldForItem(dataField, subField); 939 } 940 } catch (Exception ex) { 941 logError(item, ex, "generateLocationLevel4()"); 942 } 943 944 } 945 946 /** 947 * gets the locationlevel name for the given level and locationlevel 948 * 949 * @param locationLevel 950 * @param level 951 * @return 952 */ 953 private String getLocationLevelName(LocationLevel locationLevel, String level) { 954 if (locationLevel == null || StringUtils.isEmpty(locationLevel.getLevel())) return null; 955 if (locationLevel.getLevel().toUpperCase().startsWith(level)) return locationLevel.getName(); 956 return getLocationLevelName(locationLevel.getLocationLevel(), level); 957 } 958 959 /** 960 * generates subfield for location level 3 - LIBRARY for the given instance 961 * 962 * @param holdings 963 * @param code 964 * @param dataField 965 */ 966 private void generateLocationLevel3(OleHoldings holdings, String code, DataField dataField) throws Exception { 967 String locationLevelName; 968 try { 969 if (holdings != null && holdings.getLocation() != null 970 && (locationLevelName = getLocationLevelName(holdings.getLocation().getLocationLevel(), "LIBRARY")) != null) { 971 SubField subField = new SubField(); 972 subField.setCode(code); 973 subField.setValue(locationLevelName); 974 location3 = locationLevelName; 975 addDataField(dataField, subField); 976 } 977 } catch (Exception ex) { 978 logError(holdings, ex, "generateLocationLevel3()"); 979 } 980 } 981 982 /** 983 * generates subfield for location level 2 - CAMPUS for the given instance 984 * 985 * @param holdings 986 * @param code 987 * @param dataField 988 * @throws Exception 989 */ 990 private void generateLocationLevel2(OleHoldings holdings, String code, DataField dataField) throws Exception { 991 String locationLevelName; 992 try { 993 if (holdings != null && holdings.getLocation() != null 994 && (locationLevelName = getLocationLevelName(holdings.getLocation().getLocationLevel(), "CAMPUS")) != null) { 995 SubField subField = new SubField(); 996 subField.setCode(code); 997 subField.setValue(locationLevelName); 998 addDataField(dataField, subField); 999 } 1000 } catch (Exception ex) { 1001 logError(holdings, ex, "generateLocationLevel2()"); 1002 } 1003 } 1004 1005 /** 1006 * generates subfield for location level 1 - INSTITUTION for the given instance 1007 * 1008 * @param holdings 1009 * @param code 1010 * @param dataField 1011 * @throws Exception 1012 */ 1013 private void generateLocationLevel1(OleHoldings holdings, String code, DataField dataField) throws Exception { 1014 String locationLevelName; 1015 try { 1016 if (holdings != null && holdings.getLocation() != null 1017 && (locationLevelName = getLocationLevelName(holdings.getLocation().getLocationLevel(), "INSTITUTION")) != null) { 1018 SubField subField = new SubField(); 1019 subField.setCode(code); 1020 subField.setValue(locationLevelName); 1021 addDataField(dataField, subField); 1022 } 1023 } catch (Exception ex) { 1024 logError(holdings, ex, "generateLocationLevel1()"); 1025 } 1026 } 1027 1028 /** 1029 * generates subfield for location level 5 - SHELVING for the given instance 1030 * 1031 * @param holdings 1032 * @param code 1033 * @param dataField 1034 * @throws Exception 1035 */ 1036 private void generateLocationLevel5(OleHoldings holdings, String code, DataField dataField) throws Exception { 1037 String locationLevelName; 1038 try { 1039 if (holdings != null && holdings.getLocation() != null 1040 && (locationLevelName = getLocationLevelName(holdings.getLocation().getLocationLevel(), "SHELVING")) != null) { 1041 SubField subField = new SubField(); 1042 subField.setCode(code); 1043 subField.setValue(locationLevelName); 1044 addDataField(dataField, subField); 1045 } 1046 } catch (Exception ex) { 1047 logError(holdings, ex, "generateLocationLevel5()"); 1048 } 1049 } 1050 1051 /** 1052 * generates the subfields for the location level 3 - LIBRARY for the given item 1053 * 1054 * @param item 1055 * @param code 1056 * @param dataField 1057 */ 1058 private void generateLocationLevel3(Item item, String code, DataField dataField) { 1059 String locationLevelName; 1060 try { 1061 if (item != null && item.getLocation() != null && (locationLevelName = getLocationLevelName(item.getLocation().getLocationLevel(), "LIBRARY")) != null) { 1062 //if (location3 != null && location3.equals(locationLevelName)) return; 1063 SubField subField = new SubField(); 1064 subField.setCode(code); 1065 subField.setValue(locationLevelName); 1066 addDataFieldForItem(dataField, subField); 1067 } 1068 } catch (Exception ex) { 1069 logError(item, ex, "generateLocationLevel3()"); 1070 } 1071 } 1072 1073 /** 1074 * generates the subfields for the location level 2 - CAMPUS for the given item 1075 * 1076 * @param item 1077 * @param code 1078 * @param dataField 1079 */ 1080 private void generateLocationLevel2(Item item, String code, DataField dataField) { 1081 String locationLevelName; 1082 try { 1083 if (item != null && item.getLocation() != null && (locationLevelName = getLocationLevelName(item.getLocation().getLocationLevel(), "CAMPUS")) != null) { 1084 SubField subField = new SubField(); 1085 subField.setCode(code); 1086 subField.setValue(locationLevelName); 1087 addDataFieldForItem(dataField, subField); 1088 } 1089 } catch (Exception ex) { 1090 logError(item, ex, "generateLocationLevel2()"); 1091 } 1092 } 1093 1094 /** 1095 * generates the subfields for the location level 1 - INSTITUTION for the given item 1096 * 1097 * @param item 1098 * @param code 1099 * @param dataField 1100 */ 1101 private void generateLocationLevel1(Item item, String code, DataField dataField) { 1102 String locationLevelName; 1103 try { 1104 if (item != null && item.getLocation() != null && (locationLevelName = getLocationLevelName(item.getLocation().getLocationLevel(), "INSTITUTION")) != null) { 1105 SubField subField = new SubField(); 1106 subField.setCode(code); 1107 subField.setValue(locationLevelName); 1108 addDataFieldForItem(dataField, subField); 1109 } 1110 } catch (Exception ex) { 1111 logError(item, ex, "generateLocationLevel1()"); 1112 } 1113 } 1114 1115 /** 1116 * generates the subfields for the location level 5 - SHELVING for the given item 1117 * 1118 * @param item 1119 * @param code 1120 * @param dataField 1121 */ 1122 private void generateLocationLevel5(Item item, String code, DataField dataField) { 1123 String locationLevelName; 1124 try { 1125 if (item != null && item.getLocation() != null && (locationLevelName = getLocationLevelName(item.getLocation().getLocationLevel(), "SHELVING")) != null) { 1126 SubField subField = new SubField(); 1127 subField.setCode(code); 1128 subField.setValue(locationLevelName); 1129 addDataFieldForItem(dataField, subField); 1130 } 1131 } catch (Exception ex) { 1132 logError(item, ex, "generateLocationLevel5()"); 1133 } 1134 } 1135 1136 /** 1137 * generates the subfields for the Date Created for the given holdings 1138 * 1139 * @param holdings 1140 * @param code 1141 * @param dataField 1142 */ 1143 private void generateDateCreated(Holdings holdings, String code, DataField dataField) throws Exception { 1144 SubField subField = new SubField(); 1145 subField.setCode(code); 1146 try { 1147 if (null != holdings && null != holdings.getCreatedOn()) { 1148 subField.setValue(holdings.getCreatedOn()); 1149 addDataField(dataField, subField); 1150 } 1151 } catch (Exception ex) { 1152 logError(holdings, ex, "generateDateCreated()"); 1153 } 1154 } 1155 1156 /** 1157 * generates the subfield for the item donor public display 1158 * 1159 * @param item 1160 * @param code 1161 * @param dataField 1162 */ 1163 private void generateDonorPublicDisplay(Item item, DonorInfo donorInfo, String code, DataField dataField) { 1164 try { 1165 if (null != donorInfo) { 1166 SubField subField = new SubField(); 1167 subField.setCode(code); 1168 subField.setValue(donorInfo.getDonorPublicDisplay()); 1169 addDataFieldForItem(dataField, subField); 1170 } 1171 } catch (Exception ex) { 1172 logError(item, ex, "generateDonorPublicDisplay()"); 1173 } 1174 } 1175 1176 /** 1177 * generates the subfield for the item donor note 1178 * 1179 * @param item 1180 * @param code 1181 * @param dataField 1182 */ 1183 private void generateDonorNote(Item item, DonorInfo donorInfo, String code, DataField dataField) { 1184 try { 1185 if (null != donorInfo) { 1186 SubField subField = new SubField(); 1187 subField.setCode(code); 1188 subField.setValue(donorInfo.getDonorNote()); 1189 addDataFieldForItem(dataField, subField); 1190 } 1191 } catch (Exception ex) { 1192 logError(item, ex, "generateDonorNote()"); 1193 } 1194 } 1195 1196 /** 1197 * generates the subfield for the item donor code 1198 * 1199 * @param item 1200 * @param code 1201 * @param dataField 1202 */ 1203 private void generateDonorCode(Item item, DonorInfo donorInfo, String code, DataField dataField) { 1204 try { 1205 if (null != donorInfo) { 1206 SubField subField = new SubField(); 1207 subField.setCode(code); 1208 subField.setValue(donorInfo.getDonorCode()); 1209 addDataFieldForItem(dataField, subField); 1210 } 1211 } catch (Exception ex) { 1212 logError(item, ex, "generateDonorCode()"); 1213 } 1214 } 1215 1216 /** 1217 * generates subfield for Enumeration for the given item 1218 * @param item 1219 * @param code 1220 * @param dataField 1221 */ 1222 private void generateEnumeration(Item item, String code, DataField dataField) { 1223 try { 1224 if (item != null && StringUtils.isNotEmpty(item.getEnumeration())) { 1225 SubField subField = new SubField(); 1226 subField.setCode(code); 1227 subField.setValue(item.getEnumeration()); 1228 addDataFieldForItem(dataField, subField); 1229 } 1230 } catch (Exception ex) { 1231 logError(item, ex, "generateEnumeration()"); 1232 } 1233 } 1234 1235 /** 1236 * generates subfield for Chronology for the given item 1237 * @param item 1238 * @param code 1239 * @param dataField 1240 */ 1241 private void generateChronology(Item item, String code, DataField dataField) { 1242 try { 1243 if (item != null && StringUtils.isNotEmpty(item.getChronology())) { 1244 SubField subField = new SubField(); 1245 subField.setCode(code); 1246 subField.setValue(item.getChronology()); 1247 addDataFieldForItem(dataField, subField); 1248 } 1249 } catch (Exception ex) { 1250 logError(item, ex, "generateChronology()"); 1251 } 1252 } 1253 1254 /** 1255 * generates subfield for Vendor line item identifier for the given item 1256 * @param item 1257 * @param code 1258 * @param dataField 1259 */ 1260 private void generateVendorLineItemIdentifier(Item item, String code, DataField dataField) { 1261 try { 1262 if (item != null && StringUtils.isNotEmpty(item.getVendorLineItemIdentifier())) { 1263 SubField subField = new SubField(); 1264 subField.setCode(code); 1265 subField.setValue(item.getVendorLineItemIdentifier()); 1266 addDataFieldForItem(dataField, subField); 1267 } 1268 } catch (Exception ex) { 1269 logError(item, ex, "generateVendorLineItemIdentifier()"); 1270 } 1271 } 1272 1273 /** 1274 * Logs error for exception happening for holdings or item mapping 1275 * 1276 * @param object 1277 * @param ex 1278 */ 1279 private void logError(Object object, Exception ex, String method) { 1280 if (object != null) { 1281 if (object instanceof OleHoldings) { 1282 OleHoldings oleHoldings = (OleHoldings) object; 1283 LOG.error("Error while " + method + " for holding::" + oleHoldings.getHoldingsIdentifier(), ex); 1284 buildError(ERR_HOLDING, oleHoldings.getHoldingsIdentifier(), ERR_CAUSE, ex.getMessage(), " ::At:: ", method, TIME_STAMP, new Date().toString()); 1285 try { 1286 throw ex; 1287 } catch (Exception e) { 1288 e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 1289 } 1290 } else if (object instanceof Holdings) { 1291 Holdings holdings = (Holdings) object; 1292 OleHoldings oleHoldings = null; 1293 if (holdings.getContent() != null && !holdings.getContent().isEmpty()) { 1294 oleHoldings = holdingOlemlRecordProcessor.fromXML(holdings.getContent()); 1295 } else { 1296 oleHoldings = holdings.getContentObject(); 1297 } 1298 LOG.error("Error while " + method + " for instance::" + oleHoldings.getHoldingsIdentifier(), ex); 1299 buildError(ERR_HOLDING, oleHoldings.getHoldingsIdentifier(), ERR_CAUSE, ex.getMessage(), " ::At:: ", method, TIME_STAMP, new Date().toString()); 1300 // buildError(ERR_INSTANCE,instance.getInstanceIdentifier(),ERR_CAUSE,ex.getMessage()," ::At:: ",method,TIME_STAMP,new Date().toString()); 1301 try { 1302 throw ex; 1303 } catch (Exception e) { 1304 e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 1305 } 1306 } else if (object instanceof Item) { 1307 Item item = (Item) object; 1308 LOG.error("Error while " + method + " for item data ::" + item.getItemIdentifier(), ex); 1309 buildError(ERR_ITEM, item.getItemIdentifier(), ERR_CAUSE, ex.getMessage(), " ::At:: ", method, TIME_STAMP, new Date().toString()); 1310 } 1311 } 1312 } 1313 1314 /*private void logError(Item item, Exception ex, String method) { 1315 LOG.error("Error while " + method + " for item data ::" + item.getItemIdentifier(), ex); 1316 buildError(ERR_ITEM, item.getItemIdentifier(), ERR_CAUSE, ex.getMessage(), " ::At:: ", method, TIME_STAMP, new Date().toString()); 1317 }*/ 1318 1319 private void buildError(String... errorString) { 1320 for (String str : errorString) { 1321 errBuilder.append(str).append(COMMA); 1322 } 1323 errBuilder.append(lineSeparator); 1324 } 1325 1326 1327 private void addDataField(DataField dataField, SubField subField) { 1328 if (StringUtils.isEmpty(subField.getValue())) return; 1329 dataField.getSubFields().add(subField); 1330 } 1331 1332 private void addDataFieldForItem(DataField dataField, SubField subField) { 1333 if (StringUtils.isEmpty(subField.getValue())) return; 1334 dataField.getSubFields().add(subField); 1335 } 1336 1337 protected String getTag(String mappingField) { 1338 return StringUtils.trim(StringUtils.substringBefore(mappingField, "$")); 1339 } 1340 1341 private String getCode(String mappingField) { 1342 return StringUtils.trim(StringUtils.substringAfter(mappingField, "$")); 1343 } 1344 1345 public String getTagForExportFilter(String mappingField) { 1346 return StringUtils.trim(StringUtils.substringBefore(mappingField, " ")); 1347 } 1348 1349 public String getCodeForExportFilter(String mappingField) { 1350 int index = mappingField.indexOf('$'); 1351 return String.valueOf(mappingField.charAt(index + 1)); 1352 } 1353}