001package org.kuali.ole.batch.helper; 002 003import org.apache.commons.lang.StringUtils; 004import org.kuali.ole.OLEConstants; 005import org.kuali.ole.batch.bo.*; 006import org.kuali.ole.batch.impl.BatchProcessBibImportServiceImpl; 007import org.kuali.ole.batch.util.BatchBibImportUtil; 008import org.kuali.ole.docstore.common.client.DocstoreClientLocator; 009import org.kuali.ole.docstore.common.document.*; 010import org.kuali.ole.docstore.common.document.content.bib.marc.*; 011import org.kuali.ole.docstore.common.document.content.bib.marc.xstream.BibMarcRecordProcessor; 012import org.kuali.ole.docstore.common.exception.DocstoreException; 013import org.kuali.ole.docstore.common.exception.DocstoreSearchException; 014import org.kuali.ole.docstore.common.search.SearchCondition; 015import org.kuali.ole.docstore.common.search.SearchParams; 016import org.kuali.ole.docstore.common.search.SearchResponse; 017import org.kuali.ole.docstore.common.search.SearchResult; 018import org.kuali.ole.docstore.model.enums.DocType; 019import org.kuali.ole.sys.context.SpringContext; 020import org.slf4j.Logger; 021import org.slf4j.LoggerFactory; 022 023import java.util.*; 024 025/** 026 * Created with IntelliJ IDEA. 027 * User: jayabharathreddy 028 * Date: 7/1/14 029 * Time: 11:55 AM 030 * To change this template use File | Settings | File Templates. 031 */ 032public class BatchBibImportHelper { 033 034 private static final Logger LOG = LoggerFactory.getLogger(BatchBibImportHelper.class); 035 private BatchProcessBibImportServiceImpl batchProcessBibImportService = new BatchProcessBibImportServiceImpl(); 036 private OLEBatchBibImportStatistics bibImportStatistics = null; 037 private List<DataField> holdingsDataFields = new ArrayList<>(); 038 private List<DataField> eHoldingsDataFields = new ArrayList<>(); 039 private List<DataField> itemDataFields = new ArrayList<>(); 040 private List<OLEBatchProcessProfileDataMappingOptionsBo> dataMapping = new ArrayList<>(); 041 private DocstoreClientLocator docstoreClientLocator; 042 private List<OLEBatchProcessProfileConstantsBo> constantsMapping = new ArrayList<>(); 043 String holdingsDataFieldNumber = null; 044 String itemDataFieldNumber = null; 045 private String userName; 046 047 /** 048 * @return 049 */ 050 public DocstoreClientLocator getDocstoreClientLocator() { 051 if (null == docstoreClientLocator) { 052 docstoreClientLocator = SpringContext.getBean(DocstoreClientLocator.class); 053 } 054 return docstoreClientLocator; 055 } 056 057 /** 058 * @param bibMarcRecordList 059 * @param profile 060 * @param batchBibImportStatistics 061 * @param user 062 */ 063 public OLEBatchBibImportDataObjects processBatch(List<BibMarcRecord> bibMarcRecordList, OLEBatchProcessProfileBo profile, OLEBatchBibImportStatistics batchBibImportStatistics, String user) { 064 065 OLEBatchBibImportDataObjects oleBatchBibImportDataObjects = new OLEBatchBibImportDataObjects(); 066 bibImportStatistics = batchBibImportStatistics; 067 userName = user; 068 069 MatchingProfile matchingProfile = profile.getMatchingProfileObj(); 070 071 for (BibMarcRecord bibRecord : bibMarcRecordList) { 072 processBibMarcRecord(profile, oleBatchBibImportDataObjects, matchingProfile, bibRecord); 073 074 } 075 076 return oleBatchBibImportDataObjects; 077 } 078 079 private void processBibMarcRecord(OLEBatchProcessProfileBo profile, OLEBatchBibImportDataObjects oleBatchBibImportDataObjects, MatchingProfile matchingProfile, BibMarcRecord bibRecord) { 080 081 BibTree bibTree = new BibTree(); 082 083 String leader = bibRecord.getLeader(); 084 char unicode = leader.charAt(9); 085 if (unicode == 'a') { 086 087 if (BatchBibImportUtil.has245aDataField(bibRecord)) { 088 089 dataMapping = processPriority(bibRecord, profile); 090 constantsMapping = profile.getOleBatchProcessProfileConstantsList(); 091 // Getting Holdings and item Data Fields for every Bib Record 092 getHoldingsItemDataFields(bibRecord, dataMapping, holdingsDataFields, itemDataFields, eHoldingsDataFields); 093 094 095 if (!matchingProfile.isMatchBibs()) { 096 // Do not perform match 097 bibTree = buildBibTree(bibRecord, profile); 098 setOperationAddToBibTreeList(DocstoreDocument.OperationType.CREATE, DocstoreDocument.OperationType.CREATE, DocstoreDocument.OperationType.CREATE, bibTree); 099 } else { 100 try { 101 // Finding Matching for Bib` from Bib match point 102 Bib matchedBib = findMatchingBib(profile, bibRecord); 103 if (matchedBib == null) { 104 // No match Found 105 if (matchingProfile.isBibNotMatched_addBib()) { 106 // Add Bib Tree 107 bibTree = buildBibTree(bibRecord, profile); 108 setOperationAddToBibTreeList(DocstoreDocument.OperationType.CREATE, DocstoreDocument.OperationType.CREATE, DocstoreDocument.OperationType.CREATE, bibTree); 109 } else if (matchingProfile.isBibNotMatched_discardBib()) { 110 // Discard bib if no match found. New bib is set to bib tree with no operation and proceed. 111 Bib bib = new Bib(); 112 bib.setMessage(OLEConstants.OLEBatchProcess.NO_MATCH_DISCARD_BIB); 113 bibTree.setBib(bib); 114 } 115 } else { 116 // Match found 117 if (matchingProfile.isBibMatched_addBib()) { 118 // Add Bib 119 bibTree = buildBibTree(bibRecord, profile); 120 setOperationAddToBibTreeList(DocstoreDocument.OperationType.CREATE, DocstoreDocument.OperationType.CREATE, DocstoreDocument.OperationType.CREATE, bibTree); 121 } else { 122 // Update Bib 123 if (matchingProfile.isBibMatched_updateBib()) { 124 boolean isBibOverlay = true; 125 // Overlay bib when status is not equal to profile status 126 127 for (OLEBatchProcessProfileBibStatus oleBatchProcessProfileBibStatus : profile.getOleBatchProcessProfileBibStatusList()) { 128 if (oleBatchProcessProfileBibStatus.getBatchProcessBibStatus() != null && oleBatchProcessProfileBibStatus.getBatchProcessBibStatus().equals(matchedBib.getStatus())) { 129 isBibOverlay = false; 130 break; 131 } 132 } 133 if (isBibOverlay) { 134 overlayBib(bibRecord, matchedBib, profile); 135 } 136 bibTree.setBib(matchedBib); 137 processHoldingsAndItemsForBib(bibRecord, profile, bibTree, oleBatchBibImportDataObjects); 138 setOperationAddToBibTreeList(DocstoreDocument.OperationType.UPDATE, null, null, bibTree); 139 } 140 141 // Discarding Bib if match found and processing holdings and items 142 if (matchingProfile.isBibMatched_discardBib()) { 143 bibTree.setBib(matchedBib); 144 processHoldingsAndItemsForBib(bibRecord, profile, bibTree, oleBatchBibImportDataObjects); 145 146 } 147 } 148 } 149 } catch (DocstoreException e) { 150 Bib bib = new Bib(); 151 bib.setMessage(e.getErrorMessage()); 152 bib.setResult(DocstoreDocument.ResultType.FAILURE); 153 bibTree.setBib(bib); 154 LOG.info(e.getErrorMessage()); 155 } 156 157 } 158 } else { 159 Bib bib = new Bib(); 160 bib.setMessage("Bib Record with id " + bibRecord.getRecordId() + " does not have a 245a data field"); 161 bib.setResult(DocstoreDocument.ResultType.FAILURE); 162 bibTree.setBib(bib); 163 } 164 } else { 165 Bib bib = new Bib(); 166 bib.setMessage("Invalid Leader Field - " + leader); 167 bib.setResult(DocstoreDocument.ResultType.FAILURE); 168 bibTree.setBib(bib); 169 bibImportStatistics.getInvalidLeaderField().add("Invalid Leader Field - " + leader); 170 } 171 172 oleBatchBibImportDataObjects.getBibTrees().getBibTrees().add(bibTree); 173 174 } 175 176 private void setOperationAddToBibTreeList(DocstoreDocument.OperationType bibOperation, DocstoreDocument.OperationType holdingOperation, DocstoreDocument.OperationType itemOperation, BibTree bibTree) { 177 bibTree.getBib().setOperation(bibOperation); 178 setHoldingsTreeOperations(bibTree.getHoldingsTrees(), holdingOperation, itemOperation); 179 } 180 181 182 private void setHoldingsTreeOperations(List<HoldingsTree> holdingsTrees, DocstoreDocument.OperationType holdingOperation, DocstoreDocument.OperationType itemOperation) { 183 for (HoldingsTree holdingsTree : holdingsTrees) { 184 Holdings holdings = holdingsTree.getHoldings(); 185 if (holdingOperation != null && holdings != null) { 186 holdings.setOperation(holdingOperation); 187 setItemOperation(itemOperation, holdingsTree); 188 } 189 190 } 191 } 192 193 194 private void setItemOperation(DocstoreDocument.OperationType itemOperation, HoldingsTree holdingsTree) { 195 if (holdingsTree.getHoldings().getHoldingsType().equalsIgnoreCase(PHoldings.PRINT)) { 196 for (Item item : holdingsTree.getItems()) { 197 if (item != null && itemOperation != null) { 198 item.setOperation(itemOperation); 199 } 200 } 201 } 202 } 203 204 205 /** 206 * Process Holdings and Items for Bib 207 * 208 * @param bibRecord 209 * @param profile 210 * @param bibTree 211 */ 212 private void processHoldingsAndItemsForBib(BibMarcRecord bibRecord, OLEBatchProcessProfileBo profile, BibTree bibTree, OLEBatchBibImportDataObjects oleBatchBibImportDataObjects) { 213 214 // Getting hHoldings Tree from bibTree 215 List<HoldingsTree> holdingsTrees = bibTree.getHoldingsTrees(); 216 217 MatchingProfile matchingProfile = profile.getMatchingProfileObj(); 218 219 if (!matchingProfile.isMatchHoldings()) { 220 // Do not perform matching 221 if (matchingProfile.isNoMatchHoldings_deleteAddHoldingsItems()) { 222 //Getting holdings Tree to delete from bib 223 HoldingsTrees holdingsTreesDelete = BatchBibImportUtil.getHoldingsTrees(bibTree.getBib().getId()); 224 // Setting Holding Trees With Operation Delete 225 for (HoldingsTree holdingsTree : holdingsTreesDelete.getHoldingsTrees()) { 226 Holdings holdings = holdingsTree.getHoldings(); 227 holdings.setOperation(DocstoreDocument.OperationType.DELETE); 228 holdingsTrees.add(holdingsTree); 229 } 230 // Building Holdings Trees with Create Operation 231 List<HoldingsTree> holdingsTreesCreate = buildHoldingsTreesForBib(bibRecord, profile, true); 232 setHoldingsTreeOperations(holdingsTreesCreate, DocstoreDocument.OperationType.CREATE, DocstoreDocument.OperationType.CREATE); 233 holdingsTrees.addAll(holdingsTreesCreate); 234 } else if (matchingProfile.isNoMatchHoldings_retainAddHoldingsItems()) { 235 // Building Holdings Trees with Create Operation 236 List<HoldingsTree> holdingsTreesCreate = buildHoldingsTreesForBib(bibRecord, profile, true); 237 setHoldingsTreeOperations(holdingsTreesCreate, DocstoreDocument.OperationType.CREATE, DocstoreDocument.OperationType.CREATE); 238 holdingsTrees.addAll(holdingsTreesCreate); 239 } 240 } else { 241 // Building Match Point List for PHoldings 242 List<OLEBatchProcessProfileMatchPoint> pHoldingsMatchPointList = BatchBibImportUtil.buildMatchPointListByDataType(profile.getOleBatchProcessProfileMatchPointList(), DocType.HOLDINGS.getCode()); 243 String docType = DocType.HOLDINGS.getCode(); 244 245 // When input file contains only one Holdings 246 if (holdingsDataFields.size() == 1) { 247 Holdings matchedHoldings = getMatchedHoldings(bibTree.getBib(), holdingsDataFields, docType); 248 if (matchedHoldings != null) { 249 // Matched Holdings found 250 processMatchedPHoldings(bibRecord, profile, oleBatchBibImportDataObjects, holdingsTrees, matchingProfile, docType, matchedHoldings, holdingsDataFields.get(0)); 251 } 252 } else { 253 // It there is match points and we Check both Map[ping and Constants 254 if (pHoldingsMatchPointList != null && pHoldingsMatchPointList.size() > 0) { 255 // Process pHoldings to find matching record 256 processMatchedPHoldings(bibRecord, profile, bibTree.getBib(), oleBatchBibImportDataObjects, holdingsTrees, matchingProfile, pHoldingsMatchPointList, docType); 257 } 258 259 } 260 261 262 // Building Match Point List for EHoldings 263 List<OLEBatchProcessProfileMatchPoint> eHoldingsMatchPointList = BatchBibImportUtil.buildMatchPointListByDataType(profile.getOleBatchProcessProfileMatchPointList(), DocType.EHOLDINGS.getCode()); 264 265 // When input file contains only one EHoldings 266 if (eHoldingsDataFields.size() == 1) { 267 docType = DocType.EHOLDINGS.getCode(); 268 Holdings matchedHoldings = getMatchedHoldings(bibTree.getBib(), eHoldingsDataFields, docType); 269 if (matchedHoldings == null) { 270 matchedHoldings = findMatchingForPHoldingsAndEholdings(bibTree.getBib().getId(), null, eHoldingsMatchPointList, docType); 271 processMatchedEHoldings(bibRecord, profile, oleBatchBibImportDataObjects, holdingsTrees, matchingProfile, matchedHoldings, null); 272 } 273 } else { 274 if (eHoldingsMatchPointList != null && eHoldingsMatchPointList.size() > 0) { 275 docType = DocType.EHOLDINGS.getCode(); 276 // Process EHoldings to find matching record 277 processMatchedEHoldings(bibRecord, profile, bibTree.getBib(), oleBatchBibImportDataObjects, holdingsTrees, matchingProfile, eHoldingsMatchPointList, docType); 278 } 279 } 280 281 282 } 283 284 } 285 286 287 /** 288 * @param bibRecord 289 * @param profile 290 * @param bib 291 * @param oleBatchBibImportDataObjects 292 * @param holdingsTrees 293 * @param matchingProfile 294 * @param holdingsMatchPointList 295 * @param docType 296 */ 297 private void processMatchedPHoldings(BibMarcRecord bibRecord, OLEBatchProcessProfileBo profile, Bib bib, OLEBatchBibImportDataObjects oleBatchBibImportDataObjects, List<HoldingsTree> holdingsTrees, MatchingProfile matchingProfile, List<OLEBatchProcessProfileMatchPoint> holdingsMatchPointList, String docType) { 298 Holdings matchedHoldings = null; 299 for (DataField holdingsDataField : holdingsDataFields) { 300 try { 301 if (matchedHoldings == null) { 302 matchedHoldings = findMatchingForPHoldingsAndEholdings(bib.getId(), holdingsDataField, holdingsMatchPointList, docType); 303 } 304 processMatchedPHoldings(bibRecord, profile, oleBatchBibImportDataObjects, holdingsTrees, matchingProfile, docType, matchedHoldings, holdingsDataField); 305 } catch (DocstoreException e) { 306 bibImportStatistics.getMoreThanOneHoldingsMatched().add(bibRecord); 307 LOG.info(e.getErrorMessage()); 308 continue; 309 } 310 } 311 312 if (holdingsDataFields.size() == 0) { 313 try { 314 if (matchedHoldings == null) { 315 matchedHoldings = findMatchingForPHoldingsAndEholdings(bib.getId(), null, holdingsMatchPointList, docType); 316 } 317 processMatchedPHoldings(bibRecord, profile, oleBatchBibImportDataObjects, holdingsTrees, matchingProfile, docType, matchedHoldings, null); 318 } catch (DocstoreException e) { 319 bibImportStatistics.getMoreThanOneHoldingsMatched().add(bibRecord); 320 LOG.info(e.getErrorMessage()); 321 } 322 } 323 } 324 325 private void processMatchedPHoldings(BibMarcRecord bibRecord, OLEBatchProcessProfileBo profile, OLEBatchBibImportDataObjects oleBatchBibImportDataObjects, List<HoldingsTree> holdingsTrees, MatchingProfile matchingProfile, String docType, Holdings matchedHoldings, DataField holdingsDataField) { 326 327 List<HoldingsTree> holdingsTreesList = new ArrayList<>(); 328 if (matchedHoldings == null) { 329 330 if (matchingProfile.isHoldingsNotMatched_addHoldings()) { 331 // Add Holdings 332 if (matchingProfile.isHoldingsNotMatched_addItems()) { 333 //add Items with holdings 334 holdingsTreesList.addAll(buildPHoldingsTreesForBib(profile, true, holdingsDataField)); 335 } else { 336 holdingsTreesList.addAll(buildPHoldingsTreesForBib(profile, false, holdingsDataField)); 337 } 338 // Setting Operation type as create 339 setHoldingsTreeOperations(holdingsTreesList, DocstoreDocument.OperationType.CREATE, DocstoreDocument.OperationType.CREATE); 340 holdingsTrees.addAll(holdingsTreesList); 341 } 342 343 } else { 344 HoldingsTree holdingsTree = new HoldingsTree(); 345 if (matchingProfile.isHoldingsMatched_addHoldings()) { 346 // Add Holdings 347 348 if (matchingProfile.isHoldingsMatched_addItems()) { 349 //add Items with holdings 350 holdingsTreesList.addAll(buildPHoldingsTreesForBib(profile, true, holdingsDataField)); 351 } else { 352 holdingsTreesList.addAll(buildPHoldingsTreesForBib(profile, false, holdingsDataField)); 353 } 354 // Setting Operation type as create 355 setHoldingsTreeOperations(holdingsTreesList, DocstoreDocument.OperationType.CREATE, DocstoreDocument.OperationType.CREATE); 356 holdingsTrees.addAll(holdingsTreesList); 357 358 } else if (matchingProfile.isHoldingsMatched_updateHoldings()) { 359 //Update Holdings 360 overlayHoldings(holdingsDataField, matchedHoldings, profile); 361 // Setting Operation 362 matchedHoldings.setOperation(DocstoreDocument.OperationType.UPDATE); 363 364 holdingsTree.setHoldings(matchedHoldings); 365 holdingsTrees.add(holdingsTree); 366 367 // Processing Items 368 if (docType.equals(DocType.HOLDINGS.getCode())) { 369 processItem(bibRecord, matchedHoldings.getId(), oleBatchBibImportDataObjects, profile, matchingProfile, matchedHoldings, holdingsTree); 370 } 371 // Discard Holdings and process Items 372 } else if (matchingProfile.isHoldingsMatched_discardHoldings()) { 373 if (docType.equals(DocType.HOLDINGS.getCode())) { 374 holdingsTree.setHoldings(matchedHoldings); 375 holdingsTrees.add(holdingsTree); 376 processItem(bibRecord, matchedHoldings.getId(), oleBatchBibImportDataObjects, profile, matchingProfile, matchedHoldings, holdingsTree); 377 } 378 } 379 380 381 } 382 383 } 384 385 386 private List<HoldingsTree> processMatchedEHoldings(BibMarcRecord bibRecord, OLEBatchProcessProfileBo profile, OLEBatchBibImportDataObjects oleBatchBibImportDataObjects, List<HoldingsTree> holdingsTrees, MatchingProfile matchingProfile, Holdings matchedHoldings, DataField eHoldingsDataField) { 387 if (matchedHoldings == null) { 388 if (matchingProfile.isHoldingsNotMatched_addHoldings()) { 389 // Add Holdings 390 holdingsTrees.addAll(buildEHoldingsTreesForBib(bibRecord, profile, false)); 391 // Setting Operation type as create 392 setHoldingsTreeOperations(holdingsTrees, DocstoreDocument.OperationType.CREATE, DocstoreDocument.OperationType.CREATE); 393 } 394 } else { 395 if (matchingProfile.isHoldingsMatched_addHoldings()) { 396 // Add Holdings 397 holdingsTrees.addAll(buildEHoldingsTreesForBib(bibRecord, profile, false)); 398 // Setting Operation type as create 399 setHoldingsTreeOperations(holdingsTrees, DocstoreDocument.OperationType.CREATE, DocstoreDocument.OperationType.CREATE); 400 } else if (matchingProfile.isHoldingsMatched_updateHoldings()) { 401 //Update Holdings 402 overlayHoldings(eHoldingsDataField, matchedHoldings, profile); 403 // Setting Operation 404 matchedHoldings.setOperation(DocstoreDocument.OperationType.UPDATE); 405 HoldingsTree holdingsTree = new HoldingsTree(); 406 holdingsTree.setHoldings(matchedHoldings); 407 holdingsTrees.add(holdingsTree); 408 } 409 } 410 return holdingsTrees; 411 } 412 413 414 /** 415 * @param bibRecord 416 * @param profile 417 * @param bib 418 * @param oleBatchBibImportDataObjects 419 * @param holdingsTrees 420 * @param matchingProfile 421 * @param holdingsMatchPointList 422 * @param docType 423 */ 424 private void processMatchedEHoldings(BibMarcRecord bibRecord, OLEBatchProcessProfileBo profile, Bib bib, OLEBatchBibImportDataObjects oleBatchBibImportDataObjects, List<HoldingsTree> holdingsTrees, MatchingProfile matchingProfile, List<OLEBatchProcessProfileMatchPoint> holdingsMatchPointList, String docType) { 425 Holdings matchedHoldings = null; 426 try { 427 if (eHoldingsDataFields != null && eHoldingsDataFields.size() > 0) { 428 if (matchedHoldings == null) { 429 matchedHoldings = findMatchingForPHoldingsAndEholdings(bib.getId(), eHoldingsDataFields.get(0), holdingsMatchPointList, docType); 430 } 431 processMatchedEHoldings(bibRecord, profile, oleBatchBibImportDataObjects, holdingsTrees, matchingProfile, matchedHoldings, eHoldingsDataFields.get(0)); 432 } 433 } catch (DocstoreException e) { 434 bibImportStatistics.getMoreThanOneHoldingsMatched().add(bibRecord); 435 LOG.info(e.getErrorMessage()); 436 } 437 } 438 439 /** 440 * @param bib 441 * @param holdingsDataFields 442 * @param docType 443 * @return 444 */ 445 private Holdings getMatchedHoldings(Bib bib, List<DataField> holdingsDataFields, String docType) { 446 Holdings matchedHoldings = null; 447 448 449 boolean itemConstant = false; 450 boolean holdingsConstant = false; 451 boolean eHoldingsConstant = false; 452 // Checks in constants and defaults and if there is no data mapping making flag as true. 453 for (OLEBatchProcessProfileConstantsBo oLEBatchProcessProfileConstantsBo : constantsMapping) { 454 String docTypeConstant = oLEBatchProcessProfileConstantsBo.getDataType(); 455 if (docTypeConstant.equalsIgnoreCase(DocType.ITEM.getCode())) { 456 if (itemDataFields.size() == 0) { 457 itemConstant = true; 458 } 459 } 460 461 if (docTypeConstant.equalsIgnoreCase(DocType.HOLDINGS.getCode())) { 462 if (holdingsDataFields.size() == 0) { 463 holdingsConstant = true; 464 } 465 } 466 467 if (docTypeConstant.equalsIgnoreCase(DocType.EHOLDINGS.getCode())) { 468 if (holdingsDataFields.size() == 0) { 469 eHoldingsConstant = true; 470 } 471 } 472 } 473 474 // If incoming file has single holdings 475 if (holdingsDataFields.size() == 1 || holdingsConstant || eHoldingsConstant) { 476 HoldingsTrees holdingsTrees = null; 477 478 if (docType.equalsIgnoreCase(DocType.EHOLDINGS.getCode())) { 479 holdingsTrees = BatchBibImportUtil.getHoldingsTrees(bib.getId()); 480 } else { 481 482 if (itemDataFields.size() == 1 || itemConstant) { 483 holdingsTrees = BatchBibImportUtil.getHoldingsTrees(bib.getId()); 484 } 485 } 486 if (holdingsTrees != null && holdingsTrees.getHoldingsTrees().size() == 1) { 487 try { 488 List<String> itemIds = BatchBibImportUtil.getItemIds(holdingsTrees.getHoldingsTrees().get(0).getHoldings().getId()); 489 if (itemIds != null && itemIds.size() == 1) { 490 matchedHoldings = getDocstoreClientLocator().getDocstoreClient().retrieveHoldings(holdingsTrees.getHoldingsTrees().get(0).getHoldings().getId()); 491 } 492 493 } catch (Exception e) { 494 LOG.error("Error :", e); 495 } 496 } 497 } 498 return matchedHoldings; 499 } 500 501 502 /** 503 * @param bibRecord 504 * @param profile 505 * @param withItem 506 * @return 507 */ 508 private List<HoldingsTree> buildHoldingsTreesForBib(BibMarcRecord bibRecord, OLEBatchProcessProfileBo profile, boolean withItem) { 509 List<HoldingsTree> holdingsTreeList = new ArrayList<>(); 510 holdingsTreeList.addAll(buildPHoldingsTreesForBib(profile, withItem, null)); 511 holdingsTreeList.addAll(buildEHoldingsTreesForBib(bibRecord, profile, withItem)); 512 return holdingsTreeList; 513 514 } 515 516 517 /** 518 * @param holdingsTreeList 519 * @param OleBatchProcessProfileDataMappingOptionsBoList 520 */ 521 private void applyDataMappingForPHoldings(List<HoldingsTree> holdingsTreeList, List<OLEBatchProcessProfileDataMappingOptionsBo> OleBatchProcessProfileDataMappingOptionsBoList) { 522 String docType = null; 523 String docField = null; 524 String dataField = null; 525 526 String bibFieldValue = null; 527 for (OLEBatchProcessProfileDataMappingOptionsBo oleBatchProcessProfileDataMappingOptionsBo : OleBatchProcessProfileDataMappingOptionsBoList) { 528 docType = oleBatchProcessProfileDataMappingOptionsBo.getDataTypeDestinationField(); 529 docField = oleBatchProcessProfileDataMappingOptionsBo.getDestinationField(); 530 dataField = oleBatchProcessProfileDataMappingOptionsBo.getSourceField().substring(0, 3); 531 532 bibFieldValue = oleBatchProcessProfileDataMappingOptionsBo.getSourceFieldValue(); 533 if (docType.equalsIgnoreCase(DocType.HOLDINGS.getCode())) { 534 for (HoldingsTree holdingsTree : holdingsTreeList) { 535 PHoldings pHoldings = (PHoldings) BatchBibImportUtil.getHoldings(holdingsTree, DocType.HOLDINGS.getCode()); 536 537 if (dataField.equalsIgnoreCase(holdingsDataFieldNumber)) 538 continue; 539 540 if (pHoldings != null) { 541 pHoldings.setField(docField, bibFieldValue); 542 } 543 } 544 } else if (docType.equalsIgnoreCase(DocType.ITEM.getCode())) 545 for (HoldingsTree holdingsTree : holdingsTreeList) { 546 List<Item> items = BatchBibImportUtil.getItem(holdingsTreeList); 547 548 if (dataField.equalsIgnoreCase(itemDataFieldNumber)) 549 continue; 550 for (Item item : items) { 551 if (item != null) { 552 item.setField(docField, bibFieldValue); 553 } 554 } 555 556 } 557 } 558 } 559 560 561 /** 562 * @param profile 563 * @param withItem 564 * @return 565 */ 566 private List<HoldingsTree> buildPHoldingsTreesForBib(OLEBatchProcessProfileBo profile, boolean withItem, DataField dataField) { 567 List<HoldingsTree> holdingsTreeList = new ArrayList<>(); 568 569 if ((profile.getDataToImport().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DATA_TO_IMPORT_BIB_INSTANCE)) 570 || (profile.getDataToImport().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DATA_TO_IMPORT_BIB_INSTANCE_EINSTANCE))) { 571 if (dataField == null) { 572 buildPHoldings(holdingsTreeList, profile, withItem); 573 } else { 574 buildPHoldings(holdingsTreeList, profile, withItem, dataField); 575 } 576 577 } 578 applyDataMappingForPHoldings(holdingsTreeList, dataMapping); 579 applyDefaultsAndConstants(profile, holdingsTreeList); 580 return holdingsTreeList; 581 582 } 583 584 /** 585 * @param bibRecord 586 * @param profile 587 * @param withItem 588 * @return 589 */ 590 private List<HoldingsTree> buildEHoldingsTreesForBib(BibMarcRecord bibRecord, OLEBatchProcessProfileBo profile, boolean withItem) { 591 List<HoldingsTree> holdingsTreeList = new ArrayList<>(); 592 if ((profile.getDataToImport().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DATA_TO_IMPORT_BIB_EINSTANCE)) 593 || (profile.getDataToImport().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DATA_TO_IMPORT_BIB_INSTANCE_EINSTANCE))) { 594 buildEHoldings(bibRecord, dataMapping, holdingsTreeList, profile); 595 applyDataMapping(holdingsTreeList, dataMapping); 596 applyDefaultsAndConstants(profile, holdingsTreeList); 597 } 598 return holdingsTreeList; 599 } 600 601 /** 602 * @param bibRecord 603 * @param holdingId 604 * @param profile 605 * @param matchingProfile 606 * @param matchedHoldings 607 * @param holdingsTree 608 */ 609 private void processItem(BibMarcRecord bibRecord, String holdingId, OLEBatchBibImportDataObjects oleBatchBibImportDataObjects, OLEBatchProcessProfileBo profile, MatchingProfile matchingProfile, Holdings matchedHoldings, HoldingsTree holdingsTree) { 610 611 if (!matchingProfile.isMatchItems()) { 612 List<Item> items = new ArrayList<>(); 613 614 615 if (matchingProfile.isNoMatchItem_deleteAddItems()) { 616 List<String> itemIds = BatchBibImportUtil.getItemIds(holdingId); 617 618 for (String itemId : itemIds) { 619 Item item = new Item(); 620 item.setOperation(DocstoreDocument.OperationType.DELETE); 621 item.setId((itemId)); 622 items.add(item); 623 } 624 625 items.addAll(buildItems(profile, matchedHoldings)); 626 627 } else if (matchingProfile.isNoMatchItem_retainAddItems()) { 628 items.addAll(buildItems(profile, matchedHoldings)); 629 } 630 631 holdingsTree.getItems().addAll(items); 632 } else { 633 Item matchedItem = null; 634 if (itemDataFields.size() == 0) { 635 // If no data mapping, check in constants 636 matchedItem = findMatchingItem(profile, holdingId, bibRecord, null); 637 performMatchedItem(profile, matchingProfile, matchedHoldings, matchedItem, null, holdingsTree); 638 } else { 639 for (DataField dataField : itemDataFields) { 640 try { 641 matchedItem = findMatchingItem(profile, holdingId, bibRecord, dataField); 642 performMatchedItem(profile, matchingProfile, matchedHoldings, matchedItem, dataField, holdingsTree); 643 } catch (DocstoreException e) { 644 LOG.info(e.getErrorMessage()); 645 } 646 } 647 648 } 649 650 } 651 } 652 653 private void performMatchedItem(OLEBatchProcessProfileBo profile, MatchingProfile matchingProfile, Holdings matchedHoldings, Item matchedItem, DataField dataField, HoldingsTree holdingsTree) { 654 List<Item> items = new ArrayList<>(); 655 if (matchedItem == null) { 656 if (matchingProfile.isItemNotMatched_addItem()) { 657 items.addAll(buildItems(profile, matchedHoldings)); 658 } 659 } else { 660 if (matchingProfile.isItemMatched_addItem()) { 661 items.addAll(buildItems(profile, matchedHoldings)); 662 } else if (matchingProfile.isItemMatched_updateItem()) { 663 overlayItem(matchedItem, profile, dataField); 664 matchedItem.setOperation(DocstoreDocument.OperationType.UPDATE); 665 items.add(matchedItem); 666 } 667 } 668 holdingsTree.getItems().addAll(items); 669 } 670 671 /** 672 * Build Bib Tree by Using Bib record and Mapping from profile 673 * 674 * @param bibRecord 675 * @param profile 676 * @return 677 */ 678 private BibTree buildBibTree(BibMarcRecord bibRecord, OLEBatchProcessProfileBo profile) { 679 BibTree bibTree = new BibTree(); 680 if ((profile.getDataToImport().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DATA_TO_IMPORT_BIB_INSTANCE)) 681 || (profile.getDataToImport().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DATA_TO_IMPORT_BIB_EINSTANCE)) 682 || (profile.getDataToImport().equalsIgnoreCase(OLEConstants.OLEBatchProcess.DATA_TO_IMPORT_BIB_INSTANCE_EINSTANCE))) { 683 // Build bib tree with Holdings and Items 684 List<HoldingsTree> holdingsTrees = buildHoldingsTreesForBib(bibRecord, profile, true); 685 bibTree.getHoldingsTrees().addAll(holdingsTrees); 686 } 687 688 Bib bib = buildBib(bibRecord, profile); 689 bibTree.setBib(bib); 690 return bibTree; 691 } 692 693 /** 694 * Processing New Bib 695 * 696 * @param bibRecord 697 * @param profile 698 * @return 699 */ 700 private Bib buildBib(BibMarcRecord bibRecord, OLEBatchProcessProfileBo profile) { 701 Bib requestBib = null; 702 batchProcessBibImportService.deleteFields(bibRecord, profile); 703 batchProcessBibImportService.renameFields(bibRecord, profile); 704 batchProcessBibImportService.setDefaultOrConstants(bibRecord, profile); 705 batchProcessBibImportService.process001(bibRecord, profile); 706 707 String uuid = batchProcessBibImportService.getUuid(bibRecord); 708 requestBib = batchProcessBibImportService.buildBibRequest(bibRecord, uuid); 709 batchProcessBibImportService.setBibStatus(requestBib, profile, uuid); 710 if (StringUtils.isEmpty(uuid)) { 711 requestBib.setStaffOnly(profile.isBibStaffOnly()); 712 } 713 requestBib.setCreatedBy(userName); 714 return requestBib; 715 } 716 717 /** 718 * @param holdingsTreeList 719 * @param profile 720 * @param withItem 721 */ 722 private void buildPHoldings(List<HoldingsTree> holdingsTreeList, OLEBatchProcessProfileBo profile, boolean withItem) { 723 724 for (DataField dataField : holdingsDataFields) { 725 buildHoldingsFromDataField(holdingsTreeList, profile, dataField); 726 } 727 728 if (holdingsDataFields.size() == 0) { 729 buildHoldingsFromDataField(holdingsTreeList, profile, null); 730 } 731 //Build Items for Holdings 732 if (withItem) { 733 buildItemForHoldings(dataMapping, holdingsTreeList, profile); 734 } 735 } 736 737 738 /** 739 * @param holdingsTreeList 740 * @param profile 741 * @param withItem 742 * @param dataField 743 */ 744 private void buildPHoldings(List<HoldingsTree> holdingsTreeList, OLEBatchProcessProfileBo profile, boolean withItem, DataField dataField) { 745 746 buildHoldingsFromDataField(holdingsTreeList, profile, dataField); 747 //Build Items for Holdings 748 if (withItem) { 749 buildItemForHoldings(dataMapping, holdingsTreeList, profile); 750 } 751 } 752 753 /** 754 * @param holdings 755 * @param profile 756 * @param dataField 757 */ 758 759 private void buildHoldingsFromDataField(Holdings holdings, OLEBatchProcessProfileBo profile, DataField dataField) { 760 String docField; 761 String bibField; 762 763 if (holdings != null && dataField != null) { 764 holdings.setStaffOnly(profile.isInstanceStaffOnly()); 765 for (OLEBatchProcessProfileDataMappingOptionsBo oleBatchProcessProfileDataMappingOptionsBo : dataMapping) { 766 docField = oleBatchProcessProfileDataMappingOptionsBo.getDestinationField(); 767 bibField = oleBatchProcessProfileDataMappingOptionsBo.getSourceField(); 768 String dataFieldValue = BatchBibImportUtil.getSubFieldValue(bibField, dataField); 769 if (StringUtils.isNotEmpty(dataFieldValue)) { 770 holdings.setField(docField, dataFieldValue); 771 } 772 } 773 } 774 775 } 776 777 /** 778 * @param holdingsTreeList 779 * @param profile 780 * @param dataField 781 */ 782 783 private void buildHoldingsFromDataField(List<HoldingsTree> holdingsTreeList, OLEBatchProcessProfileBo profile, DataField dataField) { 784 HoldingsTree holdingTree = BatchBibImportUtil.buildHoldingsTree(DocType.HOLDINGS.getCode()); 785 Holdings holdings = holdingTree.getHoldings(); 786 buildHoldingsFromDataField(holdings, profile, dataField); 787 holdingsTreeList.add(holdingTree); 788 } 789 790 /** 791 * @param bibRecord 792 * @param oleBatchProcessProfileBo 793 */ 794 public List<OLEBatchProcessProfileDataMappingOptionsBo> processPriority(BibMarcRecord bibRecord, OLEBatchProcessProfileBo oleBatchProcessProfileBo) { 795 String docField = null; 796 String bibField = null; 797 String bibFieldValue = null; 798 List<OLEBatchProcessProfileDataMappingOptionsBo> oleBatchProcessProfileMappingOptionsBos = new ArrayList<>(); 799 HashMap<String, OLEBatchProcessProfileDataMappingOptionsBo> oleBatchProcessProfileMappingOptionsBoMap = new HashMap<>(); 800 List<OLEBatchProcessProfileMappingOptionsBo> oleBatchProcessProfileMappingOptionsList = oleBatchProcessProfileBo.getOleBatchProcessProfileMappingOptionsList(); 801 for (OLEBatchProcessProfileMappingOptionsBo oleBatchProcessProfileMappingOptionsBo : oleBatchProcessProfileMappingOptionsList) { 802 List<OLEBatchProcessProfileDataMappingOptionsBo> oleBatchProcessProfileDataMappingOptionsBoList = oleBatchProcessProfileMappingOptionsBo.getOleBatchProcessProfileDataMappingOptionsBoList(); 803 Collections.sort(oleBatchProcessProfileDataMappingOptionsBoList); 804 for (OLEBatchProcessProfileDataMappingOptionsBo oleBatchProcessProfileDataMappingOptionsBo : oleBatchProcessProfileDataMappingOptionsBoList) { 805 docField = oleBatchProcessProfileDataMappingOptionsBo.getDestinationField(); 806 bibField = oleBatchProcessProfileDataMappingOptionsBo.getSourceField(); 807 String key = oleBatchProcessProfileDataMappingOptionsBo.getDataTypeDestinationField() + docField; 808 if (!oleBatchProcessProfileMappingOptionsBoMap.containsKey(key)) { 809 bibFieldValue = BatchBibImportUtil.getBibDataFieldValue(bibRecord, bibField); 810 if (!StringUtils.isEmpty(bibFieldValue)) { 811 oleBatchProcessProfileDataMappingOptionsBo.setSourceFieldValue(bibFieldValue); 812 oleBatchProcessProfileMappingOptionsBoMap.put(key, oleBatchProcessProfileDataMappingOptionsBo); 813 } 814 } 815 } 816 } 817 for (Map.Entry<String, OLEBatchProcessProfileDataMappingOptionsBo> entry : oleBatchProcessProfileMappingOptionsBoMap.entrySet()) { 818 oleBatchProcessProfileMappingOptionsBos.add(entry.getValue()); 819 } 820 return oleBatchProcessProfileMappingOptionsBos; 821 } 822 823 /** 824 * Getting Holdings and Item Data fields 825 * 826 * @param bibRecord 827 * @param oleBatchProcessProfileDataMappingOptionsBos 828 * @param holdingsDataFields 829 * @param itemDataFields 830 * @param eHoldingsDataFields 831 */ 832 private void getHoldingsItemDataFields(BibMarcRecord bibRecord, List<OLEBatchProcessProfileDataMappingOptionsBo> oleBatchProcessProfileDataMappingOptionsBos, List<DataField> holdingsDataFields, List<DataField> itemDataFields, List<DataField> eHoldingsDataFields) { 833 holdingsDataFieldNumber = null; 834 itemDataFieldNumber = null; 835 String eHoldingsDataField = null; 836 holdingsDataFields.clear(); 837 itemDataFields.clear(); 838 eHoldingsDataFields.clear(); 839 840 Map<String, String> itemHoldingsMapping = new TreeMap<>(); 841 for (OLEBatchProcessProfileDataMappingOptionsBo oleBatchProcessProfileDataMappingOptionsBo : oleBatchProcessProfileDataMappingOptionsBos) { 842 if (holdingsDataFieldNumber == null && oleBatchProcessProfileDataMappingOptionsBo.getDataTypeDestinationField().equalsIgnoreCase(DocType.HOLDINGS.getCode())) { 843 holdingsDataFieldNumber = oleBatchProcessProfileDataMappingOptionsBo.getSourceField().substring(0, 3); 844 } 845 846 if (itemDataFieldNumber == null && oleBatchProcessProfileDataMappingOptionsBo.getDataTypeDestinationField().equalsIgnoreCase(DocType.ITEM.getCode())) { 847 itemDataFieldNumber = oleBatchProcessProfileDataMappingOptionsBo.getSourceField().substring(0, 3); 848 } 849 850 if (eHoldingsDataField == null && oleBatchProcessProfileDataMappingOptionsBo.getDataTypeDestinationField().equalsIgnoreCase(DocType.EHOLDINGS.getCode()) 851 && oleBatchProcessProfileDataMappingOptionsBo.getDestinationField().equalsIgnoreCase(EHoldings.DESTINATION_FIELD_LINK_URL)) { 852 eHoldingsDataField = oleBatchProcessProfileDataMappingOptionsBo.getSourceField().substring(0, 3); 853 } 854 855 if (oleBatchProcessProfileDataMappingOptionsBo.getDataTypeDestinationField().equalsIgnoreCase(DocType.ITEM.getCode())) { 856 itemHoldingsMapping.put(oleBatchProcessProfileDataMappingOptionsBo.getDestinationField(), oleBatchProcessProfileDataMappingOptionsBo.getDestinationField()); 857 } 858 } 859 for (DataField dataField : bibRecord.getDataFields()) { 860 861 if (dataField.getTag().equalsIgnoreCase(holdingsDataFieldNumber)) { 862 holdingsDataFields.add(dataField); 863 } 864 865 if (dataField.getTag().equalsIgnoreCase(itemDataFieldNumber)) { 866 itemDataFields.add(dataField); 867 } 868 869 870 if (dataField.getTag().equalsIgnoreCase(eHoldingsDataField)) { 871 eHoldingsDataFields.add(dataField); 872 } 873 } 874 875 876 // This is to check if Item does not contain Holding mapping details .To create Single Holdings and Item. 877 if (itemHoldingsMapping.size() > 0 && !BatchBibImportUtil.isItemHoldingMapping(itemHoldingsMapping)) { 878 if (holdingsDataFields.size() > 0) { 879 DataField dataField = holdingsDataFields.get(0); 880 holdingsDataFields.clear(); 881 holdingsDataFields.add(dataField); 882 } 883 884 if (itemDataFields.size() > 0) { 885 DataField dataField = itemDataFields.get(0); 886 itemDataFields.clear(); 887 itemDataFields.add(dataField); 888 } 889 890 } 891 } 892 893 /** 894 * Build Items for Holdings 895 * 896 * @param oleBatchProcessProfileDataMappingOptionsBos 897 * @param holdingsTreeList 898 * @param profile 899 */ 900 private void buildItemForHoldings(List<OLEBatchProcessProfileDataMappingOptionsBo> oleBatchProcessProfileDataMappingOptionsBos, List<HoldingsTree> holdingsTreeList, OLEBatchProcessProfileBo profile) { 901 boolean isItemDefaultorConstants = false; 902 903 if (itemDataFields.size() == 0) { 904 String docType = null; 905 List<OLEBatchProcessProfileConstantsBo> constantsMapping = profile.getOleBatchProcessProfileConstantsList(); 906 for (OLEBatchProcessProfileConstantsBo oLEBatchProcessProfileConstantsBo : constantsMapping) { 907 docType = oLEBatchProcessProfileConstantsBo.getDataType(); 908 909 if (!docType.equalsIgnoreCase((DocType.ITEM.getCode()))) 910 continue; 911 912 if (docType.equalsIgnoreCase(DocType.ITEM.getCode())) { 913 isItemDefaultorConstants = true; 914 break; 915 } 916 } 917 } 918 919 for (HoldingsTree holdingsTree : holdingsTreeList) { 920 //Comparing Holdings Data Value and Item Data value. If Matched Create Item 921 String docField = null; 922 String bibField = null; 923 String dataFieldValue = null; 924 Map<String, String> itemDocFields = new TreeMap<>(); 925 926 Holdings holdings = holdingsTree.getHoldings(); 927 BatchBibImportUtil.buildLocationLevels(holdings); 928 929 for (DataField dataField : itemDataFields) { 930 Item item = new Item(); 931 item.setField(Item.DESTINATION_FIELD_ITEM_ITEM_BARCODE, ""); 932 dataFieldValue = null; 933 for (OLEBatchProcessProfileDataMappingOptionsBo oleBatchProcessProfileDataMappingOptionsBo : oleBatchProcessProfileDataMappingOptionsBos) { 934 if (oleBatchProcessProfileDataMappingOptionsBo.getDataTypeDestinationField().equalsIgnoreCase(DocType.ITEM.getCode())) { 935 docField = oleBatchProcessProfileDataMappingOptionsBo.getDestinationField(); 936 bibField = oleBatchProcessProfileDataMappingOptionsBo.getSourceField(); 937 dataFieldValue = BatchBibImportUtil.getSubFieldValue(bibField, dataField); 938 if (StringUtils.isNotEmpty(dataFieldValue)) { 939 item.setField(docField, dataFieldValue); 940 } 941 itemDocFields.put(docField, docField); 942 } 943 } 944 if (item.getItemHoldingsDataMappingValue(itemDocFields).equalsIgnoreCase(holdings.getHoldingsDataMappingValue(itemDocFields))) { 945 setItem(profile, holdingsTree, item); 946 } 947 } 948 if (isItemDefaultorConstants) { 949 Item item = new Item(); 950 item.setField(Item.DESTINATION_FIELD_ITEM_ITEM_BARCODE, ""); 951 setItem(profile, holdingsTree, item); 952 } 953 } 954 955 } 956 957 958 /** 959 * @param profile 960 * @param holdingsTree 961 * @param item 962 */ 963 private void setItem(OLEBatchProcessProfileBo profile, HoldingsTree holdingsTree, Item item) { 964 item.setStaffOnly(profile.isItemStaffOnly()); 965 holdingsTree.getItems().add(item); 966 BatchBibImportUtil.buildLocationLevels(item); 967 applyDefaultConstantsandSerilazeContent(item, profile); 968 } 969 970 /** 971 * @param holdingsTreeList 972 * @param oleBatchProcessProfileConstantsBoList 973 * @param defaultOrConstant 974 */ 975 private void applyDefaultsAndConstants(List<HoldingsTree> holdingsTreeList, List<OLEBatchProcessProfileConstantsBo> oleBatchProcessProfileConstantsBoList, String defaultOrConstant) { 976 for (OLEBatchProcessProfileConstantsBo oLEBatchProcessProfileConstantsBo : oleBatchProcessProfileConstantsBoList) { 977 String defaultValue = oLEBatchProcessProfileConstantsBo.getDefaultValue(); 978 979 if (!defaultValue.equalsIgnoreCase(defaultOrConstant)) 980 continue; 981 982 String docType = oLEBatchProcessProfileConstantsBo.getDataType(); 983 String docField = oLEBatchProcessProfileConstantsBo.getAttributeName(); 984 String fieldValue = oLEBatchProcessProfileConstantsBo.getAttributeValue(); 985 986 987 if (docType.equalsIgnoreCase(DocType.HOLDINGS.getCode())) { 988 for (HoldingsTree holdingsTree : holdingsTreeList) { 989 PHoldings pHoldings = (PHoldings) BatchBibImportUtil.getHoldings(holdingsTree, DocType.HOLDINGS.getCode()); 990 if (pHoldings != null) { 991 if (defaultValue.equalsIgnoreCase(OLEConstants.OLEBatchProcess.CONSTANT)) { 992 pHoldings.setField(docField, fieldValue); 993 } else { 994 pHoldings.setDefaultField(docField, fieldValue); 995 } 996 997 } 998 } 999 1000 } else if (docType.equalsIgnoreCase(DocType.EHOLDINGS.getCode())) { 1001 for (HoldingsTree holdingsTree : holdingsTreeList) { 1002 EHoldings eHoldings = (EHoldings) BatchBibImportUtil.getHoldings(holdingsTree, DocType.EHOLDINGS.getCode()); 1003 1004 if (EHoldings.DESTINATION_FIELD_LINK_URL.equalsIgnoreCase(docField) && defaultOrConstant.equalsIgnoreCase(OLEConstants.OLEBatchProcess.DEFAULT)) 1005 continue; 1006 1007 if (EHoldings.DESTINATION_FIELD_LINK_TEXT.equalsIgnoreCase(docField) && defaultOrConstant.equalsIgnoreCase(OLEConstants.OLEBatchProcess.DEFAULT)) 1008 continue; 1009 1010 1011 if (eHoldings != null) { 1012 if (defaultValue.equalsIgnoreCase(OLEConstants.OLEBatchProcess.CONSTANT)) { 1013 eHoldings.setField(docField, fieldValue); 1014 } else { 1015 eHoldings.setDefaultField(docField, fieldValue); 1016 } 1017 1018 } 1019 } 1020 1021 } 1022 } 1023 } 1024 1025 1026 /** 1027 * @param holdingsTreeList 1028 */ 1029 public void prepareDocContent(List<HoldingsTree> holdingsTreeList) { 1030 List<Integer> holdingsCount = new ArrayList<>(); 1031 Integer count = 0; 1032 for (HoldingsTree holdingsTree : holdingsTreeList) { 1033 holdingsTree.getHoldings().serializeContent(); 1034 if (holdingsTree.getHoldings().getCreatedBy() == null) { 1035 holdingsTree.getHoldings().setCreatedBy(userName); 1036 } else { 1037 holdingsTree.getHoldings().setUpdatedBy(userName); 1038 } 1039 1040 for (org.kuali.ole.docstore.common.document.Item item : holdingsTree.getItems()) { 1041 1042 if (item.getCreatedBy() == null) { 1043 item.setCreatedBy(userName); 1044 } else { 1045 item.setUpdatedBy(userName); 1046 } 1047 // To Do set Item Content 1048 item.serializeContent(); 1049 } 1050 if (holdingsTree.getHoldings().getContent() == null) { 1051 holdingsCount.add(count); 1052 } 1053 count++; 1054 } 1055 Collections.reverse(holdingsCount); 1056 for (Integer emptyHoldings : holdingsCount) { 1057 holdingsTreeList.remove(holdingsTreeList.get(emptyHoldings)); 1058 } 1059 1060 } 1061 1062 /** 1063 * @param bibRecord 1064 * @param oleBatchProcessProfileDataMappingOptionsBos 1065 * @param holdingsTreeList 1066 * @param profile 1067 */ 1068 private void buildEHoldings(BibMarcRecord bibRecord, List<OLEBatchProcessProfileDataMappingOptionsBo> oleBatchProcessProfileDataMappingOptionsBos, List<HoldingsTree> holdingsTreeList, OLEBatchProcessProfileBo profile) { 1069 String docField = null; 1070 String bibField = null; 1071 List<String> dataFields = new ArrayList<>(); 1072 List<String> dataFieldsLinkText = new ArrayList<>(); 1073 for (OLEBatchProcessProfileDataMappingOptionsBo oleBatchProcessProfileDataMappingOptionsBo : oleBatchProcessProfileDataMappingOptionsBos) { 1074 1075 docField = oleBatchProcessProfileDataMappingOptionsBo.getDestinationField(); 1076 if (!EHoldings.DESTINATION_FIELD_LINK_URL.equalsIgnoreCase(docField)) 1077 continue; 1078 1079 bibField = oleBatchProcessProfileDataMappingOptionsBo.getSourceField(); 1080 dataFields = BatchBibImportUtil.getMatchedDataField(bibRecord, bibField); 1081 dataFieldsLinkText = buildLinkText(bibRecord, oleBatchProcessProfileDataMappingOptionsBos); 1082 1083 int count = 0; 1084 1085 for (String dataField : dataFields) { 1086 HoldingsTree eHoldingTree = BatchBibImportUtil.buildHoldingsTree(DocType.EHOLDINGS.getCode()); 1087 EHoldings eHoldings = (EHoldings) eHoldingTree.getHoldings(); 1088 bibImportStatistics.getTotalRecordsCreated().add(eHoldings); 1089 if (eHoldings != null) { 1090 eHoldingTree.getHoldings().setStaffOnly(profile.isInstanceStaffOnly()); 1091 eHoldings.setField(docField, dataField); 1092 if (dataFieldsLinkText.size() > count) { 1093 eHoldings.setField(EHoldings.DESTINATION_FIELD_LINK_TEXT, dataFieldsLinkText.get(count)); 1094 } 1095 } 1096 count++; 1097 holdingsTreeList.add(eHoldingTree); 1098 } 1099 if (dataFields.size() > 1) { 1100 bibImportStatistics.getRecordsCreatedWithMoreThanOneLink().add(bibRecord); 1101 } 1102 } 1103 1104 } 1105 1106 /** 1107 * @param holdingsTreeList 1108 * @param OleBatchProcessProfileDataMappingOptionsBoList 1109 */ 1110 private void applyDataMapping(List<HoldingsTree> holdingsTreeList, List<OLEBatchProcessProfileDataMappingOptionsBo> OleBatchProcessProfileDataMappingOptionsBoList) { 1111 String docType = null; 1112 String docField = null; 1113 1114 String bibFieldValue = null; 1115 for (OLEBatchProcessProfileDataMappingOptionsBo oleBatchProcessProfileDataMappingOptionsBo : OleBatchProcessProfileDataMappingOptionsBoList) { 1116 docType = oleBatchProcessProfileDataMappingOptionsBo.getDataTypeDestinationField(); 1117 docField = oleBatchProcessProfileDataMappingOptionsBo.getDestinationField(); 1118 1119 bibFieldValue = oleBatchProcessProfileDataMappingOptionsBo.getSourceFieldValue(); 1120 if (docType.equalsIgnoreCase(DocType.EHOLDINGS.getCode())) { 1121 for (HoldingsTree holdingsTree : holdingsTreeList) { 1122 EHoldings eHoldings = (EHoldings) BatchBibImportUtil.getHoldings(holdingsTree, DocType.EHOLDINGS.getCode()); 1123 1124 if (EHoldings.DESTINATION_FIELD_LINK_URL.equalsIgnoreCase(docField)) 1125 continue; 1126 1127 if (EHoldings.DESTINATION_FIELD_LINK_TEXT.equalsIgnoreCase(docField)) 1128 continue; 1129 1130 if (eHoldings != null) { 1131 eHoldings.setField(docField, bibFieldValue); 1132 } 1133 } 1134 } 1135 } 1136 } 1137 1138 /** 1139 * Apply data mapping for eHoldings records for overlay 1140 * 1141 * @param holdingsTreeList 1142 * @param oleBatchProcessProfileDataMappingOptionsBoList 1143 */ 1144 private void applyDataMappingOverlay(List<HoldingsTree> holdingsTreeList, List<OLEBatchProcessProfileDataMappingOptionsBo> oleBatchProcessProfileDataMappingOptionsBoList) { 1145 String docType = null; 1146 String docField = null; 1147 String bibFieldValue = null; 1148 1149 if (!oleBatchProcessProfileDataMappingOptionsBoList.isEmpty()) { 1150 for (OLEBatchProcessProfileDataMappingOptionsBo oleBatchProcessProfileDataMappingOptionsBo : oleBatchProcessProfileDataMappingOptionsBoList) { 1151 docType = oleBatchProcessProfileDataMappingOptionsBo.getDataTypeDestinationField(); 1152 docField = oleBatchProcessProfileDataMappingOptionsBo.getDestinationField(); 1153 bibFieldValue = oleBatchProcessProfileDataMappingOptionsBo.getSourceFieldValue(); 1154 if (DocType.EHOLDINGS.getCode().equalsIgnoreCase(docType)) { 1155 if (!holdingsTreeList.isEmpty()) { 1156 for (HoldingsTree holdingsTree : holdingsTreeList) { 1157 EHoldings eHoldings = (EHoldings) BatchBibImportUtil.getHoldings(holdingsTree, DocType.EHOLDINGS.getCode()); 1158 if (eHoldings != null) { 1159 eHoldings.setField(docField, bibFieldValue); 1160 } 1161 } 1162 } 1163 } 1164 } 1165 } 1166 } 1167 1168 1169 /** 1170 * @param bibRecord 1171 * @param oleBatchProcessProfileDataMappingOptionsBos 1172 * @return 1173 */ 1174 private List<String> buildLinkText(BibMarcRecord bibRecord, List<OLEBatchProcessProfileDataMappingOptionsBo> oleBatchProcessProfileDataMappingOptionsBos) { 1175 String docField = null; 1176 String bibField = null; 1177 List<String> dataFields = new ArrayList<>(); 1178 for (OLEBatchProcessProfileDataMappingOptionsBo oleBatchProcessProfileDataMappingOptionsBo : oleBatchProcessProfileDataMappingOptionsBos) { 1179 bibField = oleBatchProcessProfileDataMappingOptionsBo.getSourceField(); 1180 docField = oleBatchProcessProfileDataMappingOptionsBo.getDestinationField(); 1181 if (!EHoldings.DESTINATION_FIELD_LINK_TEXT.equalsIgnoreCase(docField)) 1182 continue; 1183 1184 dataFields = BatchBibImportUtil.getMatchedDataField(bibRecord, bibField); 1185 1186 } 1187 return dataFields; 1188 } 1189 1190 /** 1191 * Find Matching Bib by using Bib Match from profile and returns only if only one Bib is Matched 1192 * 1193 * @param profile 1194 * @param bibRecord 1195 * @return 1196 */ 1197 private Bib findMatchingBib(OLEBatchProcessProfileBo profile, BibMarcRecord bibRecord) { 1198 List<OLEBatchProcessProfileMatchPoint> bibMatchPointList = BatchBibImportUtil.buildMatchPointListByDataType(profile.getOleBatchProcessProfileMatchPointList(), DocType.BIB.getCode()); 1199 String fieldValue = null; 1200 SearchParams searchParams = new SearchParams(); 1201 for (OLEBatchProcessProfileMatchPoint matchPoint : bibMatchPointList) { 1202 if (BatchBibImportUtil.getBibDataFieldValue(bibRecord, matchPoint.getMatchPoint()) == null) { 1203 continue; 1204 } 1205 1206 fieldValue = BatchBibImportUtil.getBibDataFieldValue(bibRecord, matchPoint.getMatchPoint()); 1207 if (StringUtils.isNotBlank(fieldValue)) { 1208 searchParams.getSearchConditions().add(searchParams.buildSearchCondition("phrase", searchParams.buildSearchField(DocType.BIB.getCode(), BatchBibImportUtil.getDataFieldWithout$(matchPoint.getMatchPoint()), fieldValue), "OR")); 1209 } 1210 1211 } 1212 1213 if (fieldValue == null) { 1214 return null; 1215 } 1216 searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(DocType.BIB.getCode(), Bib.BIBIDENTIFIER)); 1217 1218 List<SearchResult> searchResults = new ArrayList<>(); 1219 try { 1220 SearchResponse response = getDocstoreClientLocator().getDocstoreClient().search(searchParams); 1221 searchResults = response.getSearchResults(); 1222 } catch (Exception e) { 1223 LOG.error("Error :", e); 1224 } 1225 1226 if (searchResults.size() > 1) { 1227 throw new DocstoreSearchException(OLEConstants.OLEBatchProcess.MORE_THAN_ONE_MATCHING_FOUND_FROM_EXISTING_RECORD); 1228 } 1229 1230 if (searchResults.size() == 1) { 1231 Bib bib = new Bib(); 1232 String bibId = searchResults.get(0).getSearchResultFields().get(0).getFieldValue(); 1233 try { 1234 bib = getDocstoreClientLocator().getDocstoreClient().retrieveBib(bibId); 1235 } catch (Exception e) { 1236 LOG.error("Error :", e); 1237 } 1238 return bib; 1239 } 1240 return null; 1241 } 1242 1243 /** 1244 * Update Matched Bib 1245 * 1246 * @param bibRecord 1247 * @param matchedBib 1248 * @param profile 1249 * @return 1250 */ 1251 private void overlayBib(BibMarcRecord bibRecord, Bib matchedBib, OLEBatchProcessProfileBo profile) { 1252 1253 1254 BibMarcRecordProcessor bibMarcRecordProcessor = new BibMarcRecordProcessor(); 1255 1256 batchProcessBibImportService.deleteFields(bibRecord, profile); 1257 batchProcessBibImportService.renameFields(bibRecord, profile); 1258 batchProcessBibImportService.setDefaultOrConstants(bibRecord, profile); 1259 batchProcessBibImportService.process001(bibRecord, profile); 1260 1261 BibMarcRecords bibMarcRecords = bibMarcRecordProcessor.fromXML(matchedBib.getContent()); 1262 BibMarcRecord matchedBibMarcRecord = bibMarcRecords.getRecords().get(0); 1263 1264 1265 batchProcessBibImportService.overlayFields(bibRecord, matchedBibMarcRecord, profile); 1266 1267 String bibXML = bibMarcRecordProcessor.generateXML(matchedBibMarcRecord); 1268 matchedBib.setContent(bibXML); 1269 1270 batchProcessBibImportService.setBibStatus(matchedBib, profile, matchedBib.getId()); 1271 1272 if (StringUtils.isEmpty(matchedBib.getId())) { 1273 matchedBib.setStaffOnly(profile.isBibStaffOnly()); 1274 } else { 1275 if (OLEConstants.OLEBatchProcess.CHANGE.equals(profile.getOverlayNoChangeOrSet())) { 1276 matchedBib.setStaffOnly(profile.isOverlayBibStaffOnly()); 1277 matchedBib.setStatusUpdatedBy(userName); 1278 } 1279 } 1280 matchedBib.setUpdatedBy(userName); 1281 } 1282 1283 /** 1284 * @param bibId 1285 * @param dataField 1286 * @param holdingsMatchPointList 1287 * @param docType 1288 * @return 1289 */ 1290 private Holdings findMatchingForPHoldingsAndEholdings(String bibId, DataField dataField, List<OLEBatchProcessProfileMatchPoint> holdingsMatchPointList, String docType) { 1291 SearchParams searchParams = new SearchParams(); 1292 for (OLEBatchProcessProfileMatchPoint matchPoint : holdingsMatchPointList) { 1293 String fieldValue = null; 1294 //Checking for field value in Holdings constants 1295 fieldValue = getFieldValueFromConstantsOrDefaults(matchPoint, OLEConstants.OLEBatchProcess.CONSTANT, DocType.HOLDINGS.getCode()); 1296 1297 // Checking value from data Mapping 1298 if (dataField != null && fieldValue == null) { 1299 for (OLEBatchProcessProfileDataMappingOptionsBo mappingOptionsBo : dataMapping) { 1300 if (mappingOptionsBo.getDataTypeDestinationField().equalsIgnoreCase(docType)) { 1301 if (mappingOptionsBo.getDestinationField().equalsIgnoreCase(matchPoint.getMatchPoint())) { 1302 String bibField = mappingOptionsBo.getSourceField(); 1303 fieldValue = BatchBibImportUtil.getSubFieldValue(bibField, dataField); 1304 } 1305 } 1306 } 1307 } 1308 1309 //Checking for field value in Holdings Default 1310 if (fieldValue == null) { 1311 fieldValue = getFieldValueFromConstantsOrDefaults(matchPoint, OLEConstants.OLEBatchProcess.DEFAULT, DocType.HOLDINGS.getCode()); 1312 } 1313 1314 if (fieldValue != null) { 1315 searchParams.getSearchConditions().add(searchParams.buildSearchCondition("phrase", searchParams.buildSearchField(docType, matchPoint.getMatchPoint().replaceAll(" ", "").toUpperCase(), fieldValue), "OR")); 1316 } 1317 } 1318 if (searchParams.getSearchConditions().size() > 0) { 1319 int lastIndex = searchParams.getSearchConditions().size() - 1; 1320 SearchCondition searchCondition = searchParams.getSearchConditions().get(lastIndex); 1321 searchCondition.setOperator("AND"); 1322 } 1323 1324 searchParams.getSearchConditions().add(searchParams.buildSearchCondition("AND", searchParams.buildSearchField(docType, Bib.BIBIDENTIFIER, bibId), "AND")); 1325 searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, Holdings.HOLDINGSIDENTIFIER)); 1326 searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(docType, "DocType")); 1327 1328 List<SearchResult> searchResults = new ArrayList<>(); 1329 try { 1330 SearchResponse response = getDocstoreClientLocator().getDocstoreClient().search(searchParams); 1331 searchResults = response.getSearchResults(); 1332 } catch (Exception e) { 1333 LOG.error("Error :", e); 1334 } 1335 1336 if (searchResults.size() > 1) { 1337 throw new DocstoreSearchException(OLEConstants.OLEBatchProcess.MORE_THAN_ONE_MATCHING_FOUND_FROM_EXISTING_RECORD); 1338 } 1339 1340 if (searchResults.size() == 1) { 1341 if (searchResults.get(0).getSearchResultFields() != null && searchResults.get(0).getSearchResultFields().size() > 0) { 1342 Holdings holdings = new Holdings(); 1343 1344 String holdingsId = searchResults.get(0).getSearchResultFields().get(0).getFieldValue(); 1345 try { 1346 holdings = getDocstoreClientLocator().getDocstoreClient().retrieveHoldings(holdingsId); 1347 } catch (Exception e) { 1348 LOG.error("Error :", e); 1349 } 1350 return holdings; 1351 } 1352 } 1353 return null; 1354 } 1355 1356 /** 1357 * @param matchPoint 1358 * @param constantOrDefault 1359 * @param docType 1360 * @return 1361 */ 1362 private String getFieldValueFromConstantsOrDefaults(OLEBatchProcessProfileMatchPoint matchPoint, String constantOrDefault, String docType) { 1363 1364 String fieldValue = null; 1365 for (OLEBatchProcessProfileConstantsBo oLEBatchProcessProfileConstantsBo : constantsMapping) { 1366 1367 String defaultValue = oLEBatchProcessProfileConstantsBo.getDefaultValue(); 1368 1369 if (!defaultValue.equalsIgnoreCase(constantOrDefault)) 1370 continue; 1371 1372 String docTypeConstant = oLEBatchProcessProfileConstantsBo.getDataType(); 1373 1374 if (!docTypeConstant.equalsIgnoreCase(docType)) 1375 continue; 1376 1377 String docField = oLEBatchProcessProfileConstantsBo.getAttributeName(); 1378 if (docField.equalsIgnoreCase(matchPoint.getMatchPoint())) { 1379 fieldValue = oLEBatchProcessProfileConstantsBo.getAttributeValue(); 1380 } 1381 } 1382 return fieldValue; 1383 } 1384 1385 /** 1386 * @param dataField 1387 * @param matchedHoldings 1388 */ 1389 private void overlayHoldings(DataField dataField, Holdings matchedHoldings, OLEBatchProcessProfileBo profile) { 1390 List<HoldingsTree> holdingsTreeList = BatchBibImportUtil.getHoldingsTrees(matchedHoldings); 1391 buildHoldingsFromDataField(matchedHoldings, profile, dataField); 1392 applyDataMappingForPHoldings(holdingsTreeList, dataMapping); 1393 applyDataMappingOverlay(holdingsTreeList, dataMapping); 1394 applyDefaultsAndConstants(profile, holdingsTreeList); 1395 } 1396 1397 /** 1398 * @param profile 1399 * @param holdingsTreeList 1400 */ 1401 private void applyDefaultsAndConstants(OLEBatchProcessProfileBo profile, List<HoldingsTree> holdingsTreeList) { 1402 List<OLEBatchProcessProfileConstantsBo> constantsMapping = profile.getOleBatchProcessProfileConstantsList(); 1403 BatchBibImportUtil.buildLocationLevels(holdingsTreeList); 1404 applyDefaultsAndConstants(holdingsTreeList, constantsMapping, OLEConstants.OLEBatchProcess.DEFAULT); 1405 applyDefaultsAndConstants(holdingsTreeList, constantsMapping, OLEConstants.OLEBatchProcess.CONSTANT); 1406 prepareDocContent(holdingsTreeList); 1407 } 1408 1409 /** 1410 * @param profile 1411 * @param holdingId 1412 * @param dataField 1413 * @return 1414 */ 1415 private Item findMatchingItem(OLEBatchProcessProfileBo profile, String holdingId, BibMarcRecord bibRecord, DataField dataField) { 1416 List<OLEBatchProcessProfileMatchPoint> itemMatchPointList = BatchBibImportUtil.buildMatchPointListByDataType(profile.getOleBatchProcessProfileMatchPointList(), DocType.ITEM.getCode()); 1417 1418 SearchParams searchParams = new SearchParams(); 1419 1420 1421 for (OLEBatchProcessProfileMatchPoint matchPoint : itemMatchPointList) { 1422 String fieldValue = null; 1423 //Checking for field value in Item constants 1424 fieldValue = getFieldValueFromConstantsOrDefaults(matchPoint, OLEConstants.OLEBatchProcess.CONSTANT, DocType.ITEM.getCode()); 1425 1426 // Checking value from data Mapping 1427 if (dataField != null && fieldValue == null) { 1428 for (OLEBatchProcessProfileDataMappingOptionsBo mappingOptionsBo : dataMapping) { 1429 if (mappingOptionsBo.getDataTypeDestinationField().equalsIgnoreCase(DocType.ITEM.getCode())) { 1430 if (mappingOptionsBo.getDestinationField().equalsIgnoreCase(matchPoint.getMatchPoint())) { 1431 String bibField = mappingOptionsBo.getSourceField(); 1432 fieldValue = BatchBibImportUtil.getSubFieldValue(bibField, dataField); 1433 } 1434 } 1435 } 1436 } 1437 1438 if (fieldValue == null) { 1439 //Checking for field value in Item Defaults 1440 fieldValue = getFieldValueFromConstantsOrDefaults(matchPoint, OLEConstants.OLEBatchProcess.DEFAULT, DocType.ITEM.getCode()); 1441 } 1442 1443 if (fieldValue != null) { 1444 searchParams.getSearchConditions().add(searchParams.buildSearchCondition("phrase", searchParams.buildSearchField(DocType.ITEM.getCode(), matchPoint.getMatchPoint().replaceAll(" ", "").toUpperCase(), fieldValue), "OR")); 1445 } 1446 1447 } 1448 if (searchParams.getSearchConditions().size() > 0) { 1449 int lastIndex = searchParams.getSearchConditions().size() - 1; 1450 SearchCondition searchCondition = searchParams.getSearchConditions().get(lastIndex); 1451 searchCondition.setOperator("AND"); 1452 } 1453 1454 searchParams.getSearchConditions().add(searchParams.buildSearchCondition("AND", searchParams.buildSearchField(DocType.ITEM.getCode(), Holdings.HOLDINGSIDENTIFIER, holdingId), "AND")); 1455 searchParams.getSearchResultFields().add(searchParams.buildSearchResultField(DocType.ITEM.getCode(), Item.ITEMIDENTIFIER)); 1456 1457 List<SearchResult> searchResults = new ArrayList<>(); 1458 try { 1459 SearchResponse response = getDocstoreClientLocator().getDocstoreClient().search(searchParams); 1460 searchResults = response.getSearchResults(); 1461 } catch (Exception e) { 1462 LOG.error("Error :", e); 1463 } 1464 1465 if (searchResults.size() > 1) { 1466 throw new DocstoreSearchException(OLEConstants.OLEBatchProcess.MORE_THAN_ONE_MATCHING_FOUND_FROM_EXISTING_RECORD); 1467 } 1468 1469 if (searchResults.size() == 1) { 1470 Item item = new Item(); 1471 String itemId = searchResults.get(0).getSearchResultFields().get(0).getFieldValue(); 1472 try { 1473 item = getDocstoreClientLocator().getDocstoreClient().retrieveItem(itemId); 1474 } catch (Exception e) { 1475 bibImportStatistics.getMoreThanOneItemMatched().add(bibRecord); 1476 LOG.error("Error :", e); 1477 } 1478 return item; 1479 } 1480 return null; 1481 } 1482 1483 /** 1484 * Buiild list of Items 1485 * 1486 * @param profile 1487 * @param holdings 1488 * @return 1489 */ 1490 private List<Item> buildItems(OLEBatchProcessProfileBo profile, Holdings holdings) { 1491 List<HoldingsTree> holdingsTreeList = BatchBibImportUtil.getHoldingsTrees(holdings); 1492 buildItemForHoldings(dataMapping, holdingsTreeList, profile); 1493 for (HoldingsTree holdingsTree : holdingsTreeList) { 1494 setItemOperation(DocstoreDocument.OperationType.CREATE, holdingsTree); 1495 } 1496 1497 return BatchBibImportUtil.getItem(holdingsTreeList); 1498 } 1499 1500 /** 1501 * @param matchedItem 1502 * @param profile 1503 * @param dataField 1504 */ 1505 private void overlayItem(Item matchedItem, OLEBatchProcessProfileBo profile, DataField dataField) { 1506 applyItemDataMapping(matchedItem, dataField); 1507 applyDefaultConstantsandSerilazeContent(matchedItem, profile); 1508 } 1509 1510 private void applyDefaultConstantsandSerilazeContent(Item matchedItem, OLEBatchProcessProfileBo profile) { 1511 List<OLEBatchProcessProfileConstantsBo> constantsMapping = profile.getOleBatchProcessProfileConstantsList(); 1512 applyItemDefaultAndConstants(matchedItem, constantsMapping, OLEConstants.OLEBatchProcess.DEFAULT); 1513 applyItemDefaultAndConstants(matchedItem, constantsMapping, OLEConstants.OLEBatchProcess.CONSTANT); 1514 matchedItem.serializeContent(); 1515 } 1516 1517 /** 1518 * @param item 1519 * @param dataField 1520 */ 1521 1522 private void applyItemDataMapping(Item item, DataField dataField) { 1523 String docType = null; 1524 String docField = null; 1525 1526 String bibFieldValue = null; 1527 if (dataField != null) { 1528 for (OLEBatchProcessProfileDataMappingOptionsBo oleBatchProcessProfileDataMappingOptionsBo : dataMapping) { 1529 docType = oleBatchProcessProfileDataMappingOptionsBo.getDataTypeDestinationField(); 1530 1531 if (!docType.equalsIgnoreCase(DocType.ITEM.getCode())) 1532 continue; 1533 1534 1535 docField = oleBatchProcessProfileDataMappingOptionsBo.getDestinationField(); 1536 bibFieldValue = oleBatchProcessProfileDataMappingOptionsBo.getSourceFieldValue(); 1537 if (docType.equalsIgnoreCase(DocType.ITEM.getCode())) { 1538 if (item != null) { 1539 item.setField(docField, bibFieldValue); 1540 } 1541 } 1542 } 1543 } 1544 } 1545 1546 /** 1547 * @param item 1548 * @param oleBatchProcessProfileConstantsBoLis 1549 * @param defaultOrConstant 1550 */ 1551 private void applyItemDefaultAndConstants(Item item, List<OLEBatchProcessProfileConstantsBo> oleBatchProcessProfileConstantsBoLis, String defaultOrConstant) { 1552 1553 for (OLEBatchProcessProfileConstantsBo oLEBatchProcessProfileConstantsBo : oleBatchProcessProfileConstantsBoLis) { 1554 String defaultValue = oLEBatchProcessProfileConstantsBo.getDefaultValue(); 1555 1556 if (!defaultValue.equalsIgnoreCase(defaultOrConstant)) 1557 continue; 1558 1559 String docType = oLEBatchProcessProfileConstantsBo.getDataType(); 1560 1561 if (!docType.equalsIgnoreCase(DocType.ITEM.getCode())) 1562 continue; 1563 1564 String docField = oLEBatchProcessProfileConstantsBo.getAttributeName(); 1565 String fieldValue = oLEBatchProcessProfileConstantsBo.getAttributeValue(); 1566 if (docType.equalsIgnoreCase(DocType.ITEM.getCode())) { 1567 if (item != null) { 1568 if (defaultValue.equalsIgnoreCase(OLEConstants.OLEBatchProcess.CONSTANT)) { 1569 item.setField(docField, fieldValue); 1570 } else { 1571 item.setDefaultField(docField, fieldValue); 1572 } 1573 1574 } 1575 } 1576 } 1577 } 1578 1579 1580 public OLEBatchBibImportDataObjects processOrderBatch(List<OrderBibMarcRecord> orderBibMarcRecords, OLEBatchProcessProfileBo profile, OLEBatchBibImportStatistics batchBibImportStatistics, String user) { 1581 OLEBatchBibImportDataObjects oleBatchBibImportDataObjects = new OLEBatchBibImportDataObjects(); 1582 bibImportStatistics = batchBibImportStatistics; 1583 MatchingProfile matchingProfile = profile.getMatchingProfileObj(); 1584 for (OrderBibMarcRecord orderBibMarcRecord : orderBibMarcRecords) { 1585 BibMarcRecord bibRecord = orderBibMarcRecord.getBibMarcRecord(); 1586 processBibMarcRecord(profile, oleBatchBibImportDataObjects, matchingProfile, bibRecord); 1587 } 1588 return oleBatchBibImportDataObjects; 1589 } 1590}