001 package org.kuali.ole.editor.service; 002 003 004 import org.apache.log4j.Logger; 005 import org.apache.solr.client.solrj.SolrServerException; 006 import org.kuali.ole.*; 007 import org.kuali.ole.deliver.loan.bo.OleItemSearch; 008 import org.kuali.ole.deliver.request.bo.OleDeliverRequestBo; 009 import org.kuali.ole.docstore.discovery.service.QueryService; 010 import org.kuali.ole.docstore.discovery.service.QueryServiceImpl; 011 import org.kuali.ole.docstore.model.bo.WorkBibDocument; 012 import org.kuali.ole.docstore.model.jaxb.config.DocumentConfigConverter; 013 import org.kuali.ole.docstore.model.xmlpojo.config.DocumentConfig; 014 import org.kuali.ole.docstore.model.xmlpojo.ingest.*; 015 import org.kuali.ole.docstore.model.xmlpojo.work.bib.marc.DataField; 016 import org.kuali.ole.docstore.model.xmlpojo.work.bib.marc.SubField; 017 import org.kuali.ole.docstore.model.xmlpojo.work.instance.oleml.*; 018 import org.kuali.ole.docstore.model.xstream.ingest.RequestHandler; 019 import org.kuali.ole.docstore.model.xstream.ingest.ResponseHandler; 020 import org.kuali.ole.docstore.model.xstream.work.instance.oleml.WorkHoldingOlemlRecordProcessor; 021 import org.kuali.ole.docstore.model.xstream.work.instance.oleml.WorkInstanceOlemlRecordProcessor; 022 import org.kuali.ole.docstore.model.xstream.work.instance.oleml.WorkItemOlemlRecordProcessor; 023 import org.kuali.ole.editor.keyvalue.LocationValuesBuilder; 024 import org.kuali.ole.ingest.pojo.ProfileAttributeBo; 025 import org.kuali.ole.pojo.ProfileAttribute; 026 import org.kuali.ole.pojo.bib.BibliographicRecord; 027 import org.kuali.ole.pojo.bib.Collection; 028 import org.kuali.ole.pojo.edi.LineItemOrder; 029 import org.kuali.rice.krad.util.GlobalVariables; 030 031 import java.io.*; 032 import java.net.URL; 033 import java.net.URLConnection; 034 import java.net.URLEncoder; 035 import java.text.DateFormat; 036 import java.text.SimpleDateFormat; 037 import java.util.*; 038 039 //import org.kuali.ole.pojo.item.OleHolding; 040 //import org.kuali.ole.pojo.item.OleItem; 041 042 /** 043 * DocstoreHelperService is the service class to access Docstore services 044 */ 045 public class DocstoreHelperService { 046 047 private static final String DOCSTORE_URL = "docstore.url"; 048 private final String CREATE_NEW_DOCSTORE_RECORD_QUERY_STRING = "docAction=ingestContent&stringContent="; 049 private final String CHECKOUT_DOCSTORE_RECORD_QUERY_STRING = "docAction=checkOut&uuid="; 050 private final String UPDATE_EXISTING_DOCSTORE_RECORD_QUERY_STRING = "docAction=checkIn&stringContent="; 051 private final String ROLLBACK_DATA_FROM_DOCSTORE = "docAction=deleteWithLinkedDocs&requestContent="; 052 private final String TRANSFER_INSTANCES_QUERY_STRING = "docAction=transferInstances&stringContent="; 053 private final String TRANSFER_ITEMS_QUERY_STRING = "docAction=transferItems&stringContent="; 054 private static final String DOCSTORE_BASE_URL ="ole.docstore.url.base"; 055 private static final String DOC_CONFIG_INFO = "/getDocumentConfigInfo"; 056 private WorkInstanceOlemlRecordProcessor workInstanceOlemlRecordProcessor; 057 private WorkHoldingOlemlRecordProcessor workHoldingOlemlRecordProcessor; 058 private WorkItemOlemlRecordProcessor workItemOlemlRecordProcessor; 059 060 private static final Logger LOG = Logger.getLogger(DocstoreHelperService.class); 061 062 private List<ProfileAttribute> attributes = new ArrayList<ProfileAttribute>(); 063 064 public WorkInstanceOlemlRecordProcessor getWorkInstanceOlemlRecordProcessor() { 065 if(workInstanceOlemlRecordProcessor == null){ 066 workInstanceOlemlRecordProcessor = new WorkInstanceOlemlRecordProcessor(); 067 } 068 return workInstanceOlemlRecordProcessor; 069 } 070 071 public WorkHoldingOlemlRecordProcessor getWorkHoldingOlemlRecordProcessor() { 072 if(workHoldingOlemlRecordProcessor == null){ 073 workHoldingOlemlRecordProcessor = new WorkHoldingOlemlRecordProcessor(); 074 } 075 return workHoldingOlemlRecordProcessor; 076 } 077 078 private WorkItemOlemlRecordProcessor getWorkItemOlemlRecordProcessor() { 079 if(workItemOlemlRecordProcessor == null){ 080 workItemOlemlRecordProcessor = new WorkItemOlemlRecordProcessor(); 081 } 082 return workItemOlemlRecordProcessor; 083 } 084 085 public String persistToDocstoreForEditor(String content, String uuid, String format) throws Exception { 086 String responseFromDocstore = callToDocstore(null, content, uuid, format); 087 return responseFromDocstore; 088 } 089 090 public String persistToDocstoreFromUnifiedEditor(String reqContent, String uuid, String format) throws Exception { 091 String responseFromDocstore = callToDocstore(reqContent, null, uuid, format); 092 return responseFromDocstore; 093 } 094 095 private String callToDocstore(String reqContent, String content, String uuid, String format) throws Exception { 096 String docstoreURL = PropertyUtil.getPropertyUtil().getProperty(DOCSTORE_URL); 097 String queryString = null; 098 if (null == uuid) { 099 String xmlContent = ""; 100 if (reqContent != null) { 101 xmlContent = reqContent; 102 } 103 else { 104 xmlContent = buildRequestDocXML(content, format); 105 } 106 queryString = CREATE_NEW_DOCSTORE_RECORD_QUERY_STRING + URLEncoder.encode(xmlContent, "UTF-8"); 107 } 108 else { 109 String xmlContent = buildRequestDocXML(content, uuid, format); 110 queryString = UPDATE_EXISTING_DOCSTORE_RECORD_QUERY_STRING + URLEncoder.encode(xmlContent, "UTF-8"); 111 } 112 113 return postData(docstoreURL, queryString); 114 } 115 116 117 private String callToDocstoreWithAdditionalAttributes(String content, AdditionalAttributes additionalAttributes, String uuid, String format) throws Exception { 118 String docstoreURL = PropertyUtil.getPropertyUtil().getProperty(DOCSTORE_URL); 119 String queryString = null; 120 121 if (null == uuid) { 122 String xmlContent = buildRequestDocXMLWithAdditionalAttributes(content, additionalAttributes, format); 123 queryString = CREATE_NEW_DOCSTORE_RECORD_QUERY_STRING + URLEncoder.encode(xmlContent, "UTF-8"); 124 } 125 else { 126 String xmlContent = buildRequestDocXMLWithAdditionalAttributes(content, additionalAttributes, uuid, format); 127 queryString = UPDATE_EXISTING_DOCSTORE_RECORD_QUERY_STRING + URLEncoder.encode(xmlContent, "UTF-8"); 128 } 129 130 return postData(docstoreURL, queryString); 131 } 132 133 //Additional Attributes 134 135 public String persistToDocstoreWithAdditionalAttributesForEditor(String content, 136 AdditionalAttributes additionalAttributes, 137 String uuid, String format) throws Exception { 138 String responseFromDocstore = callToDocstoreWithAdditionalAttributes(content, additionalAttributes, uuid, 139 format); 140 return responseFromDocstore; 141 } 142 143 public String persistNewToDocstoreForIngest(BibliographicRecord bibliographicRecord, List<ProfileAttributeBo> profileAttributes) throws Exception { 144 this.attributes = buildListOfProfileAttributes(profileAttributes); 145 BibliographicRecordHandler bibliographicRecordHandler = new BibliographicRecordHandler(); 146 String bibXMLContent = bibliographicRecordHandler.generateXML(bibliographicRecord); 147 String instanceXMLContent = getInstanceXML(bibliographicRecord); 148 String requestXML = buildReuestDocXMLForIngest(bibXMLContent, instanceXMLContent); 149 String queryString = CREATE_NEW_DOCSTORE_RECORD_QUERY_STRING + URLEncoder.encode(requestXML); 150 String docstoreURL = PropertyUtil.getPropertyUtil().getProperty(DOCSTORE_URL); 151 String responseXML = postData(docstoreURL, queryString + queryString); 152 return responseXML; 153 } 154 155 public String persistNewToDocstoreForIngest(LineItemOrder lineItemOrder,BibliographicRecord bibliographicRecord, List<ProfileAttributeBo> profileAttributes) throws Exception { 156 this.attributes = buildListOfProfileAttributes(profileAttributes); 157 BibliographicRecordHandler bibliographicRecordHandler = new BibliographicRecordHandler(); 158 String bibXMLContent = bibliographicRecordHandler.generateXML(bibliographicRecord); 159 String instanceXMLContent = getInstanceXML(lineItemOrder, bibliographicRecord); 160 String requestXML = buildReuestDocXMLForIngest(bibXMLContent, instanceXMLContent); 161 String queryString = CREATE_NEW_DOCSTORE_RECORD_QUERY_STRING + URLEncoder.encode(requestXML); 162 String docstoreURL = PropertyUtil.getPropertyUtil().getProperty(DOCSTORE_URL); 163 String responseXML = postData(docstoreURL, queryString + queryString); 164 return responseXML; 165 } 166 167 public String getDocstoreData(String uuid) throws Exception { 168 String docstoreURL = PropertyUtil.getPropertyUtil().getProperty(DOCSTORE_URL); 169 String queryString = CHECKOUT_DOCSTORE_RECORD_QUERY_STRING + uuid; 170 String responseFromDocstore = postData(docstoreURL, queryString); 171 Response response = new ResponseHandler().toObject(responseFromDocstore); 172 String responseContent = getResponseContent(response); 173 return responseContent; 174 } 175 176 177 public ResponseDocument checkOutDocument(String uuid) throws Exception { 178 ResponseDocument responseDocument = null; 179 String docstoreURL = PropertyUtil.getPropertyUtil().getProperty(DOCSTORE_URL); 180 String queryString = CHECKOUT_DOCSTORE_RECORD_QUERY_STRING + uuid; 181 String responseFromDocstore = postData(docstoreURL, queryString); 182 Response response = new ResponseHandler().toObject(responseFromDocstore); 183 responseDocument = response.getDocuments().get(0); 184 return responseDocument; 185 } 186 187 public String getResponseContent(Response response) { 188 String responseString = null; 189 List<ResponseDocument> responseDocumentList = response.getDocuments(); 190 for (ResponseDocument responseDocument : responseDocumentList) { 191 Content contentObj = responseDocument.getContent(); 192 responseString = contentObj.getContent(); 193 } 194 return responseString; 195 } 196 197 198 public static String postData(String target, String content) throws Exception { 199 String response = ""; 200 URL url = new URL(target); 201 URLConnection conn = url.openConnection(); 202 conn.setDoInput(true); 203 conn.setDoOutput(true); 204 conn.setUseCaches(false); 205 conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 206 207 Writer w = new OutputStreamWriter(conn.getOutputStream(), "UTF-8"); 208 w.write(content); 209 w.close(); 210 BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); 211 String temp; 212 while ((temp = in.readLine()) != null) { 213 response += temp + "\n"; 214 } 215 in.close(); 216 return response; 217 } 218 219 220 private String buildRequestDocXML(String xmlContent, String format) { 221 return buildRequestDocXML(xmlContent, null, format); 222 } 223 224 private String buildRequestDocXMLWithAdditionalAttributes(String xmlContent, AdditionalAttributes additionalAttributes, String format) { 225 return buildRequestDocXMLWithAdditionalAttributes(xmlContent, additionalAttributes, null, format); 226 } 227 228 public String buildReuestDocXMLForIngest(String bibXML, String instanceXML) { 229 Request requestObject = new Request(); 230 requestObject.setUser(GlobalVariables.getUserSession()!=null?GlobalVariables.getUserSession().getPrincipalName():""); 231 requestObject.setOperation(OLEConstants.INGEST_OPERATION); 232 RequestDocument requestDocument = new RequestDocument(); 233 requestDocument.setId("1"); 234 requestDocument.setCategory(OLEConstants.WORK_CATEGORY); 235 requestDocument.setType(OLEConstants.BIB_DOC_TYPE); 236 requestDocument.setFormat(OLEConstants.MARC_FORMAT); 237 requestDocument.setContent(new Content(bibXML)); 238 239 AdditionalAttributes additionalAttributes = new AdditionalAttributes(); 240 DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy"); 241 additionalAttributes.setDateEntered(String.valueOf(dateFormat.format(new Date()))); 242 additionalAttributes.setLastUpdated(String.valueOf(dateFormat.format(new Date()))); 243 additionalAttributes.setFastAddFlag("true"); 244 additionalAttributes.setSupressFromPublic("false"); 245 additionalAttributes.setAttribute("dateEntered",String.valueOf(dateFormat.format(new Date()))); 246 additionalAttributes.setAttribute("lastUpdated",String.valueOf(dateFormat.format(new Date()))); 247 additionalAttributes.setAttribute("fastAddFlag","true"); 248 additionalAttributes.setAttribute("supressFromPublic","false"); 249 requestDocument.setAdditionalAttributes(additionalAttributes); 250 251 RequestDocument linkedRequestDocument = new RequestDocument(); 252 linkedRequestDocument.setId("2"); 253 linkedRequestDocument.setCategory(OLEConstants.WORK_CATEGORY); 254 linkedRequestDocument.setType(OLEConstants.INSTANCE_DOC_TYPE); 255 linkedRequestDocument.setContent(new Content(instanceXML)); 256 linkedRequestDocument.setFormat(OLEConstants.OLEML_FORMAT); 257 258 ArrayList<RequestDocument> linkedRequestDocuments = new ArrayList<RequestDocument>(); 259 linkedRequestDocuments.add(linkedRequestDocument); 260 261 requestDocument.setLinkedRequestDocuments(linkedRequestDocuments); 262 263 ArrayList<RequestDocument> requestDocuments = new ArrayList<RequestDocument>(); 264 requestDocuments.add(requestDocument); 265 requestObject.setRequestDocuments(requestDocuments); 266 267 RequestHandler requestHandler = new RequestHandler(); 268 String xml = requestHandler.toXML(requestObject); 269 return xml; 270 } 271 272 273 private String buildRequestDocXML(String xmlContent, String uuid, String format) { 274 String INSTANCE_MARC_XML_STRING = "<instanceCollection>\n" + 275 " <instance>\n" + 276 "<instanceIdentifier></instanceIdentifier>\n" + 277 " <oleHoldings primary=\"true\">\n" + 278 " <holdingsIdentifier></holdingsIdentifier>\n" + 279 " <receiptStatus></receiptStatus>\n" + 280 " <uri></uri>\n" + 281 " <note type=\"public\"></note>\n" + 282 " <location primary=\"true\" status=\"permanent\">\n" + 283 " <locationLevel>\n" + 284 " <name></name>\n" + 285 " <level></level>\n" + 286 " <locationLevel>\n" + 287 " <name></name>\n" + 288 " <level></level>\n" + 289 " <locationLevel>\n" + 290 " <name></name>\n" + 291 " <level></level>\n" + 292 " <locationLevel>\n" + 293 " <name></name>\n" + 294 " <level></level>\n" + 295 " </locationLevel>\n" + 296 " </locationLevel>\n" + 297 " </locationLevel>\n" + 298 " </locationLevel>\n" + 299 " </location>\n" + 300 " <extension>\n" + 301 " <additionalAttributes>\n" + 302 " <createdBy></createdBy>\n" + 303 " <dateEntered></dateEntered>\n" + 304 " </additionalAttributes>\n" + 305 " </extension>\n" + 306 " <callNumber>\n" + 307 " <type></type>\n" + 308 " <prefix></prefix>\n" + 309 " <number></number>\n" + 310 " <shelvingScheme>\n" + 311 " <codeValue></codeValue>\n" + 312 " </shelvingScheme>\n" + 313 " <shelvingOrder>\n" + 314 " <codeValue></codeValue>\n" + 315 " </shelvingOrder>\n" + 316 " </callNumber>\n" + 317 " </oleHoldings>\n" + 318 " <items>\n" + 319 " <item>\n" + 320 " <staffOnlyFlag>false</staffOnlyFlag>\n" + 321 " <fastAddFlag>false</fastAddFlag>\n" + 322 " <extension reference=\"../../../oleHoldings/extension\"/>\n" + 323 " </item>\n" + 324 " </items>\n" + 325 " </instance>\n" + 326 "</instanceCollection>" ; 327 Request requestObject = new Request(); 328 RequestDocument requestDocument = new RequestDocument(); 329 330 if (null == uuid) { 331 requestDocument.setId("1"); 332 RequestDocument linkedRequestDocument = new RequestDocument(); 333 linkedRequestDocument.setId("2"); 334 linkedRequestDocument.setCategory(OLEConstants.WORK_CATEGORY); 335 linkedRequestDocument.setType(OLEConstants.INSTANCE_DOC_TYPE); 336 linkedRequestDocument.setContent(new Content(INSTANCE_MARC_XML_STRING)); 337 linkedRequestDocument.setFormat(OLEConstants.OLEML_FORMAT); 338 339 ArrayList<RequestDocument> linkedRequestDocuments = new ArrayList<RequestDocument>(); 340 linkedRequestDocuments.add(linkedRequestDocument); 341 342 requestObject.setOperation(OLEConstants.INGEST_OPERATION); 343 requestObject.setUser(GlobalVariables.getUserSession()!=null ?GlobalVariables.getUserSession().getPrincipalName():""); 344 requestDocument.setLinkedRequestDocuments(linkedRequestDocuments); 345 } else { 346 requestDocument.setId(uuid); 347 requestObject.setOperation(OLEConstants.CHECK_IN_OPERATION); 348 requestObject.setUser("editor"); 349 } 350 requestDocument.setCategory(OLEConstants.WORK_CATEGORY); 351 requestDocument.setType(OLEConstants.BIB_DOC_TYPE); 352 353 if (format.equalsIgnoreCase("marc")) { 354 requestDocument.setFormat(OLEConstants.MARC_FORMAT); 355 } else if (format.equalsIgnoreCase("dublinunq")) { 356 requestDocument.setFormat(OLEConstants.UNQUALIFIED_DUBLIN_FORMAT); 357 } 358 359 requestDocument.setContent(new Content(xmlContent)); 360 361 if (format.equalsIgnoreCase("marc")) { 362 AdditionalAttributes additionalAttributes = new AdditionalAttributes(); 363 DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy"); 364 if (null == uuid) { 365 additionalAttributes.setDateEntered(String.valueOf(dateFormat.format(new Date()))); 366 } 367 additionalAttributes.setLastUpdated(String.valueOf(dateFormat.format(new Date()))); 368 additionalAttributes.setFastAddFlag("true"); 369 additionalAttributes.setSupressFromPublic("false"); 370 requestDocument.setAdditionalAttributes(additionalAttributes); 371 } 372 373 ArrayList<RequestDocument> requestDocuments = new ArrayList<RequestDocument>(); 374 requestDocuments.add(requestDocument); 375 requestObject.setRequestDocuments(requestDocuments); 376 377 RequestHandler requestHandler = new RequestHandler(); 378 String xml = requestHandler.toXML(requestObject); 379 380 if (format.equalsIgnoreCase(OLEConstants.UNQUALIFIED_DUBLIN_FORMAT)) { 381 xml = modifyXmlContent(xml); 382 } 383 return xml; 384 } 385 386 private String buildRequestDocXMLWithAdditionalAttributes(String xmlContent, 387 AdditionalAttributes additionalAttributes, String uuid, 388 String format) { 389 String INSTANCE_MARC_XML_STRING = "<instanceCollection>\n" + 390 " <instance>\n" + 391 "<instanceIdentifier></instanceIdentifier>\n" + 392 " <oleHoldings primary=\"true\">\n" + 393 " <holdingsIdentifier></holdingsIdentifier>\n" + 394 " <!--Zero or more repetitions:-->\n" + 395 " <extentOfOwnership>\n" + 396 " <textualHoldings></textualHoldings>\n" + 397 " <!--Zero or more repetitions:-->\n" + 398 " <note type=\"string\"></note>\n" + 399 " <type></type>\n" + 400 " </extentOfOwnership>\n" + 401 " <receiptStatus></receiptStatus>\n" + 402 " <uri></uri>\n" + 403 " <note type=\"public\"></note>\n" + 404 /* 405 " <location primary=\"true\" status=\"permanent\">\n" + 406 " <locationLevel>\n" + 407 " <name>Holdings</name>\n" + 408 " <level></level>\n" + 409 " <locationLevel>\n" + 410 " <name></name>\n" + 411 " <level></level>\n" + 412 " <locationLevel>\n" + 413 " <name></name>\n" + 414 " <level></level>\n" + 415 " <locationLevel>\n" + 416 " <name></name>\n" + 417 " <level></level>\n" + 418 " </locationLevel>\n" + 419 " </locationLevel>\n" + 420 " </locationLevel>\n" + 421 " </locationLevel>\n" + 422 " </location>\n" + 423 */ 424 " <extension>\n" + 425 " <additionalAttributes>\n" + 426 " <createdBy></createdBy>\n" + 427 " <dateEntered></dateEntered>\n" + 428 " </additionalAttributes>\n" + 429 " </extension>\n" + 430 " <callNumber>\n" + 431 " <type></type>\n" + 432 " <prefix></prefix>\n" + 433 " <number></number>\n" + 434 " <shelvingScheme>\n" + 435 " <codeValue></codeValue>\n" + 436 " </shelvingScheme>\n" + 437 " <shelvingOrder>\n" + 438 " <codeValue></codeValue>\n" + 439 " </shelvingOrder>\n" + 440 " </callNumber>\n" + 441 " </oleHoldings>\n" + 442 " <items>\n" + 443 " <item>\n" + 444 " <copyNumber></copyNumber>\n" + 445 " <volumeNumber></volumeNumber>\n" + 446 " <note type=\"public\"></note>" + 447 " <callNumber>\n" + 448 " <number></number>\n" + 449 " </callNumber>\n" + 450 " <staffOnlyFlag>false</staffOnlyFlag>\n" + 451 " <fastAddFlag>false</fastAddFlag>\n" + 452 " <extension reference=\"../../../oleHoldings/extension\"/>\n" + 453 " </item>\n" + 454 " </items>\n" + 455 " </instance>\n" + 456 "</instanceCollection>"; 457 Request requestObject = new Request(); 458 RequestDocument requestDocument = new RequestDocument(); 459 if (null == uuid) { 460 requestDocument.setId("1"); 461 RequestDocument linkedRequestDocument = new RequestDocument(); 462 linkedRequestDocument.setId("2"); 463 linkedRequestDocument.setCategory(OLEConstants.WORK_CATEGORY); 464 linkedRequestDocument.setType(OLEConstants.INSTANCE_DOC_TYPE); 465 linkedRequestDocument.setContent(new Content(INSTANCE_MARC_XML_STRING)); 466 linkedRequestDocument.setFormat(OLEConstants.OLEML_FORMAT); 467 468 ArrayList<RequestDocument> linkedRequestDocuments = new ArrayList<RequestDocument>(); 469 linkedRequestDocuments.add(linkedRequestDocument); 470 471 requestObject.setOperation(OLEConstants.INGEST_OPERATION); 472 requestObject.setUser( 473 GlobalVariables.getUserSession() != null ? GlobalVariables.getUserSession().getPrincipalName() 474 : ""); 475 requestDocument.setLinkedRequestDocuments(linkedRequestDocuments); 476 } 477 else { 478 requestDocument.setId(uuid); 479 requestObject.setOperation(OLEConstants.CHECK_IN_OPERATION); 480 requestObject.setUser( 481 GlobalVariables.getUserSession() != null ? GlobalVariables.getUserSession().getPrincipalName() 482 : ""); 483 //requestObject.setUser("editor"); 484 } 485 requestDocument.setCategory(OLEConstants.WORK_CATEGORY); 486 requestDocument.setType(OLEConstants.BIB_DOC_TYPE); 487 488 if (format.equalsIgnoreCase("marc")) { 489 requestDocument.setFormat(OLEConstants.MARC_FORMAT); 490 } 491 else if (format.equalsIgnoreCase("dublinunq")) { 492 requestDocument.setFormat(OLEConstants.UNQUALIFIED_DUBLIN_FORMAT); 493 } 494 495 requestDocument.setContent(new Content(xmlContent)); 496 if (additionalAttributes != null && requestDocument.getType().equalsIgnoreCase(OLEConstants.BIB_DOC_TYPE)) { 497 requestDocument.setAdditionalAttributes(additionalAttributes); 498 } 499 500 ArrayList<RequestDocument> requestDocuments = new ArrayList<RequestDocument>(); 501 requestDocuments.add(requestDocument); 502 requestObject.setRequestDocuments(requestDocuments); 503 504 RequestHandler requestHandler = new RequestHandler(); 505 String xml = requestHandler.toXML(requestObject); 506 if (format.equalsIgnoreCase(OLEConstants.UNQUALIFIED_DUBLIN_FORMAT)) { 507 xml = modifyXmlContent(xml); 508 } 509 return xml; 510 } 511 512 public String getInstanceXML(BibliographicRecord bibliographicRecord) { 513 WorkInstanceOlemlRecordProcessor workInstanceOlemlRecordProcessor = new WorkInstanceOlemlRecordProcessor(); 514 InstanceCollection instanceCollection = new InstanceCollection(); 515 Instance oleInstance = new Instance(); 516 List<Item> oleItemList = new ArrayList<Item>(); 517 oleItemList.add(getOleItem(bibliographicRecord)) ; 518 if(oleInstance.getItems() == null){ 519 oleInstance.setItems(new Items()); 520 } 521 oleInstance.getItems().setItem(oleItemList); 522 oleInstance.setOleHoldings(getOleHolding(bibliographicRecord)); 523 524 Extension extension = new Extension(); 525 AdditionalAttributes additionalAttributes = new AdditionalAttributes(); 526 DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy"); 527 additionalAttributes.setDateEntered(String.valueOf(dateFormat.format(new Date()))); 528 additionalAttributes.setLastUpdated(String.valueOf(dateFormat.format(new Date()))); 529 additionalAttributes.setSupressFromPublic("false"); 530 additionalAttributes.setFastAddFlag("false"); 531 additionalAttributes.setHarvestable("true"); 532 additionalAttributes.setStatus("n"); // new Record 533 additionalAttributes.setAttribute("dateEntered", additionalAttributes.getDateEntered()); 534 additionalAttributes.setAttribute("lastUpdated", additionalAttributes.getLastUpdated()); 535 additionalAttributes.setAttribute("fastAddFlag",additionalAttributes.getFastAddFlag()); 536 additionalAttributes.setAttribute("supressFromPublic", additionalAttributes.getSupressFromPublic()); 537 additionalAttributes.setAttribute("harvestable",additionalAttributes.getHarvestable()); 538 additionalAttributes.setAttribute("status",additionalAttributes.getStatus()); 539 extension.getContent().add(additionalAttributes); 540 //List<Extension> extensionList = new ArrayList<Extension>(); 541 //extensionList.add(extension); 542 oleInstance.setExtension(extension); 543 oleInstance.getOleHoldings().setPrimary(OLEConstants.TRUE); 544 //oleInstance.getOleHoldings().setReceiptStatus(""); 545 Uri uri = new Uri(); 546 uri.setValue(""); 547 uri.setResolvable(null); 548 oleInstance.getOleHoldings().getUri().add(uri); 549 Note note = new Note(); 550 note.setType(OLEConstants.NOTE_TYPE); 551 oleInstance.getOleHoldings().getNote().add(note); 552 CallNumber callNumber = new CallNumber(); 553 ShelvingScheme shelvingScheme = new ShelvingScheme(); 554 ShelvingOrder shelvingOrder = new ShelvingOrder(); 555 callNumber.setType(""); 556 callNumber.setPrefix(""); 557 callNumber.setNumber(""); 558 shelvingScheme.setCodeValue(""); 559 shelvingOrder.setCodeValue(""); 560 callNumber.setShelvingScheme(shelvingScheme); 561 callNumber.setShelvingOrder(shelvingOrder); 562 oleInstance.getOleHoldings().setCallNumber(callNumber); 563 List<Instance> oleInstanceList = new ArrayList<Instance>(); 564 OleHoldings oleHoldings = oleInstance.getOleHoldings(); 565 if(oleHoldings.getLocation() == null ) { 566 LocationLevel locationLevel = new LocationLevel(); 567 Location location = new Location(); 568 locationLevel.setLevel(""); 569 locationLevel.setName(""); 570 location.setPrimary(OLEConstants.TRUE); 571 location.setStatus(OLEConstants.PERMANENT); 572 location.setLocationLevel(locationLevel); 573 oleInstance.getOleHoldings().setLocation(location); 574 } 575 oleInstanceList.add(oleInstance); 576 instanceCollection.setInstance(oleInstanceList); 577 //String instanceXML = workInstanceOlemlRecordProcessor.generateXML(getOleHolding(), getOleItem(bibliographicRecord)); 578 String instanceXML = workInstanceOlemlRecordProcessor.toXML(instanceCollection); 579 return instanceXML; 580 } 581 582 public String getInstanceXML(LineItemOrder lineItemOrder, BibliographicRecord bibliographicRecord) { 583 WorkInstanceOlemlRecordProcessor workInstanceOlemlRecordProcessor = new WorkInstanceOlemlRecordProcessor(); 584 InstanceCollection instanceCollection = new InstanceCollection(); 585 Instance oleInstance = new Instance(); 586 List<Item> oleItemList = new ArrayList<Item>(); 587 oleItemList.add(getOleItem(lineItemOrder, bibliographicRecord)) ; 588 if(oleInstance.getItems() == null){ 589 oleInstance.setItems(new Items()); 590 } 591 oleInstance.getItems().setItem(oleItemList); 592 oleInstance.setOleHoldings(getOleHolding(bibliographicRecord)); 593 594 Extension extension = new Extension(); 595 AdditionalAttributes additionalAttributes = new AdditionalAttributes(); 596 DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy"); 597 additionalAttributes.setDateEntered(String.valueOf(dateFormat.format(new Date()))); 598 additionalAttributes.setLastUpdated(String.valueOf(dateFormat.format(new Date()))); 599 additionalAttributes.setSupressFromPublic("false"); 600 additionalAttributes.setFastAddFlag("false"); 601 additionalAttributes.setHarvestable("true"); 602 additionalAttributes.setStatus("n"); // new Record 603 additionalAttributes.setAttribute("dateEntered", additionalAttributes.getDateEntered()); 604 additionalAttributes.setAttribute("lastUpdated", additionalAttributes.getLastUpdated()); 605 additionalAttributes.setAttribute("fastAddFlag",additionalAttributes.getFastAddFlag()); 606 additionalAttributes.setAttribute("supressFromPublic", additionalAttributes.getSupressFromPublic()); 607 additionalAttributes.setAttribute("harvestable",additionalAttributes.getHarvestable()); 608 additionalAttributes.setAttribute("status",additionalAttributes.getStatus()); 609 extension.getContent().add(additionalAttributes); 610 //List<Extension> extensionList = new ArrayList<Extension>(); 611 //extensionList.add(extension); 612 oleInstance.setExtension(extension); 613 oleInstance.getOleHoldings().setPrimary(OLEConstants.TRUE); 614 //oleInstance.getOleHoldings().setReceiptStatus(""); 615 Uri uri = new Uri(); 616 uri.setValue(""); 617 uri.setResolvable(null); 618 oleInstance.getOleHoldings().getUri().add(uri); 619 Note note = new Note(); 620 note.setType(OLEConstants.NOTE_TYPE); 621 oleInstance.getOleHoldings().getNote().add(note); 622 CallNumber callNumber = new CallNumber(); 623 ShelvingScheme shelvingScheme = new ShelvingScheme(); 624 ShelvingOrder shelvingOrder = new ShelvingOrder(); 625 callNumber.setType(""); 626 callNumber.setPrefix(""); 627 callNumber.setNumber(""); 628 shelvingScheme.setCodeValue(""); 629 shelvingOrder.setCodeValue(""); 630 callNumber.setShelvingScheme(shelvingScheme); 631 callNumber.setShelvingOrder(shelvingOrder); 632 oleInstance.getOleHoldings().setCallNumber(callNumber); 633 List<Instance> oleInstanceList = new ArrayList<Instance>(); 634 OleHoldings oleHoldings = oleInstance.getOleHoldings(); 635 if(oleHoldings.getLocation() == null ) { 636 LocationLevel locationLevel = new LocationLevel(); 637 Location location = new Location(); 638 locationLevel.setLevel(""); 639 locationLevel.setName(""); 640 location.setPrimary(OLEConstants.TRUE); 641 location.setStatus(OLEConstants.PERMANENT); 642 location.setLocationLevel(locationLevel); 643 oleInstance.getOleHoldings().setLocation(location); 644 } 645 oleInstanceList.add(oleInstance); 646 instanceCollection.setInstance(oleInstanceList); 647 //String instanceXML = workInstanceOlemlRecordProcessor.generateXML(getOleHolding(), getOleItem(bibliographicRecord)); 648 String instanceXML = workInstanceOlemlRecordProcessor.toXML(instanceCollection); 649 return instanceXML; 650 } 651 652 public OleHoldings getOleHolding(BibliographicRecord bibliographicRecord) { 653 return new OleHoldingsRecordHandler().getOleHoldings(bibliographicRecord, attributes); 654 } 655 656 public Item getOleItem(BibliographicRecord bibliographicRecord) { 657 for(DataField dataField : bibliographicRecord.getDatafields()){ 658 if(dataField.getTag().equalsIgnoreCase(OLEConstants.DATA_FIELD_985)){ 659 List<SubField> subFieldList = dataField.getSubFields(); 660 SubField subField = new SubField(); 661 subField.setCode(OLEConstants.SUB_FIELD_A); 662 subField.setValue(OLEConstants.DEFAULT_LOCATION_LEVEL_INSTITUTION); 663 subFieldList.add(subField); 664 dataField.setSubFields(subFieldList); 665 } 666 } 667 return new OleItemRecordHandler().getOleItem(bibliographicRecord, attributes); 668 } 669 670 public Item getOleItem(LineItemOrder lineItemOrder, BibliographicRecord bibliographicRecord) { 671 for(DataField dataField : bibliographicRecord.getDatafields()){ 672 if(dataField.getTag().equalsIgnoreCase(OLEConstants.DATA_FIELD_985)){ 673 List<SubField> subFieldList = dataField.getSubFields(); 674 SubField subField = new SubField(); 675 subField.setCode(OLEConstants.SUB_FIELD_A); 676 subField.setValue(OLEConstants.DEFAULT_LOCATION_LEVEL_INSTITUTION); 677 subFieldList.add(subField); 678 dataField.setSubFields(subFieldList); 679 } 680 } 681 return new OleItemRecordHandler().getOleItem(lineItemOrder, bibliographicRecord, attributes); 682 } 683 684 private List<ProfileAttribute> buildListOfProfileAttributes(List<ProfileAttributeBo> profileAttributes) { 685 for (Iterator iterator = profileAttributes.iterator(); iterator.hasNext(); ) { 686 ProfileAttributeBo profileAttributeBo = (ProfileAttributeBo) iterator.next(); 687 ProfileAttribute profileAttribute = new ProfileAttribute(); 688 profileAttribute.setAgendaName(profileAttributeBo.getAgendaName()); 689 profileAttribute.setAttributeName(profileAttributeBo.getAttributeName()); 690 profileAttribute.setAttributeValue(profileAttributeBo.getAttributeValue()); 691 profileAttribute.setSystemValue(profileAttributeBo.getSystemValue()); 692 attributes.add(profileAttribute); 693 } 694 return attributes; 695 } 696 697 private String modifyXmlContent(String inputXmlContent) { 698 StringBuffer modifiedContent = new StringBuffer(inputXmlContent); 699 modifiedContent.replace(modifiedContent.indexOf("<oai_dc:dc"), modifiedContent.indexOf(">", modifiedContent.indexOf("<oai_dc:dc")), 700 "<oai_dc:dc xmlns:oai_dc=\"http://www.openarchives.org/OAI/2.0/oai_dc/\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\""); 701 return modifiedContent.toString(); 702 } 703 704 public void rollbackData(String xmlForRollback) throws Exception { 705 String queryString = ROLLBACK_DATA_FROM_DOCSTORE + URLEncoder.encode(xmlForRollback, "UTF-8"); 706 String docstoreURL = PropertyUtil.getPropertyUtil().getProperty(DOCSTORE_URL); 707 postData(docstoreURL, queryString + queryString); 708 } 709 710 711 public String updateItem(BibliographicRecord bibliographicRecord, String itemUUID){ 712 String responseXML = null; 713 try{ 714 Item oleItem = getOleItem(bibliographicRecord); 715 OleItemRecordHandler oleItemRecordHandler = new OleItemRecordHandler(); 716 String itemXML = oleItemRecordHandler.toXML(oleItem); 717 String requestXML = buildReuestDocXMLForUpdate(itemXML,itemUUID) ; 718 String queryString = UPDATE_EXISTING_DOCSTORE_RECORD_QUERY_STRING + URLEncoder.encode(requestXML, "UTF-8"); 719 String docstoreURL = PropertyUtil.getPropertyUtil().getProperty(DOCSTORE_URL); 720 responseXML = postData(docstoreURL, queryString); 721 }catch(Exception e){ 722 e.printStackTrace(); 723 } 724 return responseXML; 725 } 726 public String buildReuestDocXMLForUpdate(String itemXML,String itemUUID) { 727 Request requestObject = new Request(); 728 RequestDocument requestDocument = new RequestDocument(); 729 requestDocument.setId(itemUUID); 730 requestDocument.setCategory(OLEConstants.WORK_CATEGORY); 731 requestDocument.setType(OLEConstants.ITEM_DOC_TYPE); 732 requestDocument.setFormat(OLEConstants.OLEML_FORMAT); 733 requestDocument.setContent(new Content(itemXML)); 734 735 ArrayList<RequestDocument> requestDocuments = new ArrayList<RequestDocument>(); 736 requestDocuments.add(requestDocument); 737 requestObject.setRequestDocuments(requestDocuments); 738 RequestHandler requestHandler = new RequestHandler(); 739 String xml = requestHandler.toXML(requestObject); 740 return xml; 741 } 742 743 /** 744 * Method to generate Request XML and ingest Instance record to docstore 745 * @param content 746 * @param uuid 747 * @param format 748 * @return Docstore response for Ingesting New Instance Record 749 * @throws Exception 750 */ 751 public String instanceRecordCallToDocstore(String content, String uuid, String format) throws Exception { 752 String docstoreURL = PropertyUtil.getPropertyUtil().getProperty(DOCSTORE_URL); 753 String queryString = null; 754 String xmlContent = buildInstanceRequestDocXML(content, uuid, format); 755 queryString = CREATE_NEW_DOCSTORE_RECORD_QUERY_STRING + URLEncoder.encode(xmlContent, "UTF-8"); 756 return postData(docstoreURL, queryString); 757 } 758 759 /** 760 * Method to generate Request xml for Ingesting Instance record 761 * @param xmlContent 762 * @param uuid 763 * @param format 764 * @return Request XML content 765 */ 766 private String buildInstanceRequestDocXML(String xmlContent, String uuid, String format) { 767 Request requestObject = new Request(); 768 RequestDocument requestDocument = new RequestDocument(); 769 if (null == uuid) { 770 requestDocument.setId("1"); 771 requestObject.setOperation(OLEConstants.INGEST_OPERATION); 772 } else { 773 requestDocument.setId(uuid); 774 requestObject.setOperation(OLEConstants.CHECK_IN_OPERATION); 775 } 776 requestObject.setUser("editor"); 777 requestDocument.setCategory(OLEConstants.WORK_CATEGORY); 778 requestDocument.setType(OLEConstants.INSTANCE_DOC_TYPE); 779 requestDocument.setFormat(OLEConstants.OLEML_FORMAT); 780 781 requestDocument.setContent(new Content(xmlContent)); 782 783 ArrayList<RequestDocument> requestDocuments = new ArrayList<RequestDocument>(); 784 requestDocuments.add(requestDocument); 785 requestObject.setRequestDocuments(requestDocuments); 786 787 RequestHandler requestHandler = new RequestHandler(); 788 String requestXml = requestHandler.toXML(requestObject); 789 return requestXml; 790 } 791 792 /** 793 * Method to update Holding or Item record of an Instance record 794 * @param uuid 795 * @param docType 796 * @param xmlContent 797 * @return Docstore XML response with success/failure status 798 * @throws Exception 799 */ 800 public String updateInstanceRecord(String uuid, String docType, String xmlContent) throws Exception { 801 String docstoreURL = PropertyUtil.getPropertyUtil().getProperty(DOCSTORE_URL); 802 Request requestObject = new Request(); 803 requestObject.setUser(GlobalVariables.getUserSession()!=null?GlobalVariables.getUserSession().getPrincipalId():"admin"); 804 LOG.info("requestObject.getUser()"+requestObject.getUser()); 805 requestObject.setOperation(OLEConstants.CHECK_IN_OPERATION); 806 RequestDocument requestDocument = new RequestDocument(); 807 808 requestDocument.setId(uuid); 809 requestDocument.setCategory(OLEConstants.WORK_CATEGORY); 810 requestDocument.setType(docType); // docType should be either holdings or item 811 requestDocument.setFormat(OLEConstants.OLEML_FORMAT); 812 requestDocument.setContent(new Content(xmlContent)); 813 814 ArrayList<RequestDocument> requestDocuments = new ArrayList<RequestDocument>(); 815 requestDocuments.add(requestDocument); 816 requestObject.setRequestDocuments(requestDocuments); 817 818 RequestHandler requestHandler = new RequestHandler(); 819 String xml = requestHandler.toXML(requestObject); 820 821 String queryString = UPDATE_EXISTING_DOCSTORE_RECORD_QUERY_STRING + URLEncoder.encode(xml, "UTF-8"); 822 823 return postData(docstoreURL, queryString); 824 } 825 826 /** 827 * This method used to delete a instance record 828 * @param instance 829 * @return 830 * @throws Exception 831 */ 832 833 public String deleteInstanceRecord(Instance instance) throws Exception { 834 String docstoreURL = PropertyUtil.getPropertyUtil().getProperty(DOCSTORE_URL); 835 // Request deleteRequest = buildDeleteRequest(instance); 836 String uuid = instance.getInstanceIdentifier(); 837 String queryString = "docAction=delete&requestContent=" + uuid; 838 String response = postData(docstoreURL,queryString); 839 return response; 840 841 } 842 843 /** 844 * This method used to delete a docstore record based on uuid 845 * @param uuid 846 * @return 847 * @throws Exception 848 */ 849 public String deleteDocstoreRecord(String uuid) throws Exception { 850 String docstoreURL = PropertyUtil.getPropertyUtil().getProperty(DOCSTORE_URL); 851 String queryString = "docAction=delete&requestContent=" + uuid; 852 String response = postData(docstoreURL,queryString); 853 return response; 854 855 } 856 /** 857 * Method to add NEW ITEM for existing Instance record 858 * @param instanceUuid 859 * @param docType 860 * @param xmlContent 861 * @return Docstore XML response with success/failure status 862 * @throws Exception 863 */ 864 public String createItemForInstanceRecord (String instanceUuid, String docType, String xmlContent) throws Exception { 865 String docstoreURL = PropertyUtil.getPropertyUtil().getProperty(DOCSTORE_URL); 866 Request requestObject = new Request(); 867 requestObject.setUser(GlobalVariables.getUserSession()!=null?GlobalVariables.getUserSession().getPrincipalId():""); 868 requestObject.setOperation(OLEConstants.CHECK_IN_OPERATION); 869 RequestDocument requestDocument = new RequestDocument(); 870 871 requestDocument.setId(instanceUuid); 872 requestDocument.setCategory(OLEConstants.WORK_CATEGORY); 873 requestDocument.setType(OLEConstants.INSTANCE_DOC_TYPE); 874 requestDocument.setFormat(OLEConstants.OLEML_FORMAT); 875 876 877 RequestDocument linkedRequestDocument = new RequestDocument(); 878 linkedRequestDocument.setId(OLEConstants.NEW_ITEM_ID); 879 linkedRequestDocument.setCategory(OLEConstants.WORK_CATEGORY); 880 linkedRequestDocument.setType(docType); 881 linkedRequestDocument.setFormat(OLEConstants.OLEML_FORMAT); 882 linkedRequestDocument.setContent(new Content(xmlContent)); 883 884 List<RequestDocument> linkedRequestDocuments = new ArrayList<RequestDocument>(); 885 linkedRequestDocuments.add(linkedRequestDocument); 886 requestDocument.setLinkedRequestDocuments(linkedRequestDocuments); 887 888 889 ArrayList<RequestDocument> requestDocuments = new ArrayList<RequestDocument>(); 890 requestDocuments.add(requestDocument); 891 requestObject.setRequestDocuments(requestDocuments); 892 893 RequestHandler requestHandler = new RequestHandler(); 894 String xml = requestHandler.toXML(requestObject); 895 896 String queryString = UPDATE_EXISTING_DOCSTORE_RECORD_QUERY_STRING + URLEncoder.encode(xml, "UTF-8"); 897 898 return postData(docstoreURL, queryString); 899 900 } 901 public void transferInstances(String requestXML) throws Exception{ 902 String docstoreURL = PropertyUtil.getPropertyUtil().getProperty(DOCSTORE_URL); 903 LOG.debug("transferInstances docstoreURL "+docstoreURL); 904 String queryString=TRANSFER_INSTANCES_QUERY_STRING + URLEncoder.encode(requestXML, "UTF-8"); 905 postData(docstoreURL, queryString); 906 } 907 908 909 public String transferItems(String requestXML) throws Exception{ 910 String docstoreURL = PropertyUtil.getPropertyUtil().getProperty(DOCSTORE_URL); 911 LOG.debug("transferItems docstoreURL "+docstoreURL); 912 String queryString=TRANSFER_ITEMS_QUERY_STRING + URLEncoder.encode(requestXML, "UTF-8"); 913 String response=postData(docstoreURL, queryString); 914 LOG.debug("response transferItems "+response); 915 return response; 916 } 917 918 919 public String deleteItemrecord(String uuid) throws Exception { 920 String docstoreURL = PropertyUtil.getPropertyUtil().getProperty(DOCSTORE_URL); 921 String queryString = "docAction=delete&requestContent=" + uuid; 922 String response = postData(docstoreURL,queryString); 923 return response; 924 925 } 926 927 public WorkBibDocument getInfoForBibTree(WorkBibDocument workBibDocument) { 928 QueryService queryService = QueryServiceImpl.getInstance(); 929 930 try { 931 workBibDocument = queryService.queryForBibTree(workBibDocument); 932 } catch (Exception e) { 933 e.printStackTrace(); 934 } 935 return workBibDocument; 936 937 } 938 939 public List<WorkBibDocument> getInfoForBibTree(List<WorkBibDocument> bibDocumentList) { 940 List<WorkBibDocument> workBibDocumentList = new ArrayList<WorkBibDocument>(); 941 for (WorkBibDocument workBibDocument : bibDocumentList) { 942 getInfoForBibTree(workBibDocument); 943 workBibDocumentList.add(workBibDocument); 944 } 945 946 return workBibDocumentList; 947 } 948 949 public BibliographicRecord getBibliographicRecord(String bibUUID)throws Exception{ 950 BibliographicRecord bibliographicRecord = null; 951 String responseDocStoreData = getDocstoreData(bibUUID); 952 /* ResponseHandler responseHandler = new ResponseHandler(); 953 Response response = responseHandler.toObject(responseDocStoreData); 954 String responseContentXMLString = getResponseContent(response); 955 Collection bibliographicRecords = new BibliographicRecordHandler().fromXML(responseContentXMLString);*/ 956 Collection bibliographicRecords = new BibliographicRecordHandler().fromXML(responseDocStoreData); 957 List<BibliographicRecord> bibliographicRecordList = bibliographicRecords.getRecords(); 958 Iterator<BibliographicRecord> bibliographicRecordListIterator = bibliographicRecordList.iterator(); 959 if(bibliographicRecordListIterator.hasNext()){ 960 bibliographicRecord = bibliographicRecordListIterator.next(); 961 } 962 return bibliographicRecord; 963 } 964 965 public InstanceCollection getInstanceCollection(String instanceUUID)throws Exception{ 966 String responseFromDocstore = getDocstoreData(instanceUUID); 967 InstanceCollection instanceCollection = new WorkInstanceOlemlRecordProcessor().fromXML(responseFromDocstore); 968 return instanceCollection; 969 } 970 public String updateInstanceToDocstore(InstanceCollection instanceCollection)throws Exception{ 971 String instanceXMLString = getWorkInstanceOlemlRecordProcessor().toXML(instanceCollection); 972 String instanceUUID = instanceCollection.getInstance().iterator().next().getInstanceIdentifier(); 973 String response = updateInstanceRecord(instanceUUID, OLEConstants.INSTANCE_DOC_TYPE, instanceXMLString); 974 return response; 975 } 976 977 public String updateOleHoldingToDocstore(OleHoldings oleHoldings)throws Exception{ 978 String oleHoldingXMLString = getWorkHoldingOlemlRecordProcessor().toXML(oleHoldings); 979 String oleHoldingUUID = oleHoldings.getHoldingsIdentifier(); 980 String response = updateInstanceRecord(oleHoldingUUID, OLEConstants.HOLDING_DOC_TYPE, oleHoldingXMLString); 981 return response; 982 } 983 984 public String updateOleItemToDocstore(Item item)throws Exception{ 985 String itemXMLString = getWorkItemOlemlRecordProcessor().toXML(item); 986 String oleItemUUID = item.getItemIdentifier(); 987 if(LOG.isInfoEnabled()){ 988 LOG.info("oleItemUUID---------->"+oleItemUUID); 989 } 990 String response = updateInstanceRecord(oleItemUUID, OLEConstants.ITEM_DOC_TYPE, itemXMLString); 991 return response; 992 } 993 994 public String persistNewToDocstoreForIngest(BibliographicRecord bibliographicRecord, Item item,OleHoldings oleHoldings){ 995 996 BibliographicRecordHandler bibliographicRecordHandler=new BibliographicRecordHandler(); 997 WorkInstanceOlemlRecordProcessor workInstanceOlemlRecordProcessor = new WorkInstanceOlemlRecordProcessor(); 998 DocstoreHelperService docstoreHelperService=new DocstoreHelperService(); 999 1000 String responseXML=null; 1001 Items items=new Items(); 1002 List<Item> itemList=new ArrayList<Item>(); 1003 try{ 1004 1005 1006 String bibXML=bibliographicRecordHandler.generateXML(bibliographicRecord); 1007 itemList.add(item); 1008 InstanceCollection instanceCollection = new InstanceCollection(); 1009 Instance oleInstance = new Instance(); 1010 1011 if(oleInstance.getItems() == null){ 1012 oleInstance.setItems(new Items()); 1013 } 1014 oleInstance.getItems().setItem(itemList); 1015 oleInstance.setOleHoldings(oleHoldings); 1016 //oleInstance.setExtension(extension); 1017 List<Instance> oleInstanceList = new ArrayList<Instance>(); 1018 oleInstanceList.add(oleInstance); 1019 instanceCollection.setInstance(oleInstanceList); 1020 String instanceXML = workInstanceOlemlRecordProcessor.toXML(instanceCollection); 1021 String requestXML=docstoreHelperService.buildReuestDocXMLForIngest(bibXML, instanceXML); 1022 if (LOG.isDebugEnabled()){ 1023 LOG.debug("Fast Add instance xml : "+instanceXML); 1024 LOG.debug("Fast Add request xml : "+requestXML); 1025 } 1026 String queryString = CREATE_NEW_DOCSTORE_RECORD_QUERY_STRING + URLEncoder.encode(requestXML); 1027 String docstoreURL = PropertyUtil.getPropertyUtil().getProperty(DOCSTORE_URL); 1028 responseXML = docstoreHelperService.postData(docstoreURL, queryString + queryString); 1029 if (LOG.isDebugEnabled()){ 1030 LOG.debug("Fast Add response xml : "+responseXML); 1031 } 1032 } 1033 catch(Exception ex){ 1034 LOG.info("exception ---> " + ex.getStackTrace()); 1035 } 1036 return responseXML; 1037 } 1038 1039 1040 /** 1041 * Converts item xml to item pojo. 1042 * @param itemXml 1043 * @return 1044 * @throws Exception 1045 */ 1046 private Item getItemPojo(String itemXml) throws Exception{ 1047 LOG.debug("Inside the getItemPojo method"); 1048 Item oleItem = null; 1049 try{ 1050 WorkItemOlemlRecordProcessor workItemOlemlRecordProcessor = new WorkItemOlemlRecordProcessor(); 1051 oleItem = workItemOlemlRecordProcessor.fromXML(itemXml); 1052 }catch (Exception e){ 1053 LOG.error(OLEConstants.PAR_EXP); 1054 throw new Exception(OLEConstants.PAR_EXP); 1055 } 1056 return oleItem; 1057 } 1058 1059 1060 /** 1061 * Retrieves item xml using itemuuid. 1062 * @param itemUUID 1063 * @return 1064 * @throws Exception 1065 */ 1066 public String getItemXML(String itemUUID) throws Exception{ 1067 LOG.debug("Inside the getItemXML method"); 1068 String itemXml =""; 1069 try{ 1070 itemXml = getDocstoreData(itemUUID); 1071 LOG.info("item XML ----- > " + itemXml); 1072 }catch (Exception e) { 1073 LOG.error(OLEConstants.ITM_BARCD_NT_AVAL_DOC); 1074 throw new Exception(OLEConstants.ITM_BARCD_NT_AVAL_DOC); 1075 } 1076 return itemXml; 1077 } 1078 1079 1080 /** 1081 * Retrieves Holding Object for given instance UUID. 1082 * @param instanceUUID 1083 * @return 1084 * @throws Exception 1085 */ 1086 public OleHoldings getOleHoldings(String instanceUUID) throws Exception{ 1087 LOG.info("--Inside getOleHoldings---"); 1088 DocstoreHelperService docstoreHelperService = new DocstoreHelperService(); 1089 String responseFromDocstore = docstoreHelperService.getDocstoreData(instanceUUID); 1090 InstanceCollection instanceCollection = new WorkInstanceOlemlRecordProcessor().fromXML(responseFromDocstore); 1091 List<Instance> instances =instanceCollection!=null? instanceCollection.getInstance():new ArrayList<Instance>(); 1092 Instance instance = instances.size()>0?instances.get(0):null; 1093 OleHoldings oleHoldings =instance!=null?instance.getOleHoldings():null; 1094 return oleHoldings; 1095 } 1096 1097 1098 private List<OleItemSearch> getOleItemListByItemInfo(String solrQuery,Map<String, String> searchCriteria){ 1099 1100 List<OleItemSearch> oleItemSearchList=new ArrayList<OleItemSearch>(); 1101 int rowSize=10; 1102 String bibIdentifier=null; 1103 String itemIdentfier=""; 1104 String instanceIdentifier=""; 1105 String holdingsIdentifier=""; 1106 if(searchCriteria.get("rowSize")!=null) 1107 rowSize=Integer.parseInt(searchCriteria.get("rowSize")); 1108 try { 1109 1110 List<HashMap<String, Object>> documentList= QueryServiceImpl.getInstance().retriveResults("(DocType:item) AND ("+solrQuery+")",rowSize); 1111 for(int i=0;i<documentList.size();i++){ 1112 OleItemSearch oleItemSearch=null; 1113 try{ 1114 if(documentList.get(i).get("ItemIdentifier_display")!=null) { 1115 itemIdentfier=(String) ((ArrayList) documentList.get(i).get("ItemIdentifier_display")).get(0); 1116 instanceIdentifier=(String) ((ArrayList) documentList.get(i).get("instanceIdentifier")).get(0); 1117 holdingsIdentifier= (String) ((ArrayList) documentList.get(i).get("holdingsIdentifier")).get(0); 1118 bibIdentifier= (String) ((ArrayList) documentList.get(i).get("bibIdentifier")).get(0); 1119 } 1120 String itemXml = getItemXML(itemIdentfier); 1121 Item oleItem = getItemPojo(itemXml); 1122 if(oleItem!=null) { 1123 if(oleItem!=null && (oleItem.getLocation()==null || oleItem.getCallNumber()==null)) { 1124 OleHoldings oleHoldings = getOleHoldings(instanceIdentifier); 1125 oleItem.setLocation(oleHoldings.getLocation()); 1126 oleItem.setCallNumber(oleHoldings.getCallNumber()); 1127 } 1128 LocationValuesBuilder locationValuesBuilder = new LocationValuesBuilder(); 1129 /*OleHoldings oleHoldings = getOleHoldings(instanceIdentifier); 1130 oleItem.setLocation(oleHoldings.getLocation());*/ 1131 oleItemSearch=new OleItemSearch(); 1132 oleItemSearch.setItemBarCode(oleItem.getAccessInformation()==null?"":oleItem.getAccessInformation().getBarcode()); 1133 oleItemSearch.setCallNumber(oleItem.getCallNumber()==null?"":oleItem.getCallNumber().getNumber()); 1134 oleItemSearch.setItemType(oleItem.getItemType()==null?"":oleItem.getItemType().getCodeValue()); 1135 oleItemSearch.setItemUUID(oleItem.getItemIdentifier()); 1136 oleItemSearch.setInstanceUUID(instanceIdentifier); 1137 oleItemSearch.setBibUUID(bibIdentifier); 1138 oleItemSearch.setCopyNumber(oleItem.getCopyNumber()); 1139 oleItemSearch.setShelvingLocation(locationValuesBuilder.getShelvingLocation(oleItem.getLocation())); 1140 oleItemSearch.setItemStatus(oleItem.getItemStatus()); 1141 oleItemSearch.setHoldingUUID (holdingsIdentifier); 1142 if(bibIdentifier!=null){ 1143 Map<String, String> bibDetails=QueryServiceImpl.getInstance().getBibInformation(bibIdentifier, searchCriteria); 1144 if(bibDetails!=null) { 1145 if(bibDetails.get("Title")!=null) 1146 oleItemSearch.setTitle((String)bibDetails.get("Title")); 1147 if(bibDetails.get("Author")!=null) 1148 oleItemSearch.setAuthor((String)bibDetails.get("Author")); 1149 if(bibDetails.get("Publisher")!=null) 1150 oleItemSearch.setPublisher((String)bibDetails.get("Publisher")); 1151 1152 oleItemSearchList.add(oleItemSearch); 1153 } 1154 } 1155 1156 } 1157 } 1158 1159 catch(Exception e){ 1160 e.getStackTrace(); 1161 } 1162 1163 1164 } 1165 } 1166 catch(Exception ex){ 1167 LOG.info("Exception ------> " + ex); 1168 ex.printStackTrace(); 1169 } 1170 1171 return oleItemSearchList; 1172 } 1173 1174 private List<OleItemSearch> getOleItemListByBibInfo(String solrQuery,Map<String, String> searchCriteria){ 1175 1176 int rowSize=10; 1177 List<OleItemSearch> oleItemSearchList=new ArrayList<OleItemSearch>(); 1178 if(searchCriteria.get("rowSize")!=null) 1179 rowSize=Integer.parseInt(searchCriteria.get("rowSize")); 1180 try { 1181 1182 List<HashMap<String, Object>> documentList= QueryServiceImpl.getInstance().retriveResults("(DocType:bibliographic) AND (" + solrQuery + ")",rowSize); 1183 for(int i=0;i<documentList.size();i++){ 1184 String instanceIdentifier=null; 1185 OleItemSearch oleItemSearch=new OleItemSearch(); 1186 Item itemDetails=null; 1187 try{ 1188 HashMap<String, Object> itemvalues = documentList.get(i); 1189 if(itemvalues.get("Title_display")!=null) 1190 oleItemSearch.setTitle((String) ((ArrayList) itemvalues.get("Title_display")).get(0)); 1191 else if(itemvalues.get("Title_search")!=null) 1192 oleItemSearch.setTitle((String) ((ArrayList) itemvalues.get("Title_search")).get(0)); 1193 if(itemvalues.get("Author_display")!=null) 1194 oleItemSearch.setAuthor((String) ((ArrayList) itemvalues.get("Author_display")).get(0)); 1195 else if(itemvalues.get("Author_search")!=null) 1196 oleItemSearch.setAuthor((String) ((ArrayList) itemvalues.get("Author_search")).get(0)); 1197 if(itemvalues.get("Publisher_display")!=null) 1198 oleItemSearch.setPublisher((String)((ArrayList)itemvalues.get("Publisher_display")).get(0)); 1199 else if(itemvalues.get("Publisher_search")!=null) 1200 oleItemSearch.setPublisher((String)((ArrayList)itemvalues.get("Publisher_search")).get(0)); 1201 1202 if(itemvalues.get("uniqueId") != null) 1203 oleItemSearch.setBibUUID((String)itemvalues.get("uniqueId")); 1204 if(itemvalues.get("instanceIdentifier")!=null) { 1205 instanceIdentifier=((String)((ArrayList)itemvalues.get("instanceIdentifier")).get(0)); 1206 if(!"".equals(instanceIdentifier) && instanceIdentifier!=null) { 1207 oleItemSearch.setInstanceUUID(instanceIdentifier); 1208 String query= "id:"+instanceIdentifier; 1209 List<HashMap<String, Object>> documentList1= QueryServiceImpl.getInstance().retriveResults(query); 1210 if(documentList1.size()>0){ 1211 HashMap<String, Object> itemIDvalues=documentList1.get(0); 1212 String itemUUID=(String)((ArrayList)itemIDvalues.get("itemIdentifier")).get(0); 1213 String holdingUUID = (String)((ArrayList)itemIDvalues.get("holdingsIdentifier")).get(0); 1214 oleItemSearch.setItemUUID(itemUUID); 1215 oleItemSearch.setHoldingUUID(holdingUUID); 1216 } 1217 } 1218 } 1219 1220 if(instanceIdentifier!=null){ 1221 itemDetails=getItemInformation(instanceIdentifier,searchCriteria,oleItemSearch.getItemUUID()); 1222 if(itemDetails!=null) { 1223 LocationValuesBuilder locationValuesBuilder = new LocationValuesBuilder(); 1224 oleItemSearch.setItemBarCode(itemDetails.getAccessInformation()==null?"":itemDetails.getAccessInformation().getBarcode()); 1225 oleItemSearch.setCallNumber(itemDetails.getCallNumber()==null?"":itemDetails.getCallNumber().getNumber()); 1226 oleItemSearch.setItemType(itemDetails.getItemType()==null?"":itemDetails.getItemType().getCodeValue()); 1227 oleItemSearch.setCopyNumber(itemDetails.getCopyNumber()); 1228 oleItemSearch.setItemStatus(itemDetails.getItemStatus()); 1229 if(itemDetails.getLocation()!=null) 1230 oleItemSearch.setShelvingLocation(locationValuesBuilder.getShelvingLocation(itemDetails.getLocation())); 1231 1232 } 1233 1234 } 1235 } 1236 catch(Exception e){ 1237 e.printStackTrace(); 1238 } 1239 if(itemDetails!=null && !"".equals(oleItemSearch.getTitle()) && oleItemSearch.getTitle()!=null) 1240 oleItemSearchList.add(oleItemSearch); 1241 } 1242 1243 } 1244 catch(Exception ex){ 1245 LOG.info("Exception ------> " + ex); 1246 } 1247 1248 return oleItemSearchList; 1249 } 1250 1251 private Item getItemInformation(String instanceIdentifier,Map<String, String> searchCriteria,String itemIdentfier) throws Exception { 1252 1253 String callNumber=(String)searchCriteria.get("callNumber"); 1254 String itemType=(String)searchCriteria.get("itemType"); 1255 String itemBarCode=(String)searchCriteria.get("itemBarCode"); 1256 1257 StringBuffer solrQuery=new StringBuffer(); 1258 1259 if(callNumber!=null && !callNumber.equals("")) 1260 solrQuery.append("(CallNumber_search:"+callNumber.toLowerCase()+"*) AND "); 1261 if(itemType!=null && !itemType.equals("")) 1262 solrQuery.append("(ItemTypeCodeValue_search:"+itemType.toLowerCase()+") AND "); 1263 if(itemBarCode!=null && !itemBarCode.equals("")) 1264 solrQuery.append("(ItemBarcode_display:"+itemBarCode+") AND "); 1265 1266 if(!solrQuery.toString().equals("")) { 1267 solrQuery.append("(id:"+itemIdentfier+") AND "); 1268 String query=solrQuery.substring(0,solrQuery.lastIndexOf("AND")); 1269 List<HashMap<String, Object>> documentList= QueryServiceImpl.getInstance().retriveResults("(DocType:item) AND ("+query+")"); 1270 if(documentList.size()==0) { 1271 return null; 1272 } 1273 } 1274 String itemXml = getItemXML(itemIdentfier); 1275 Item oleItem = getItemPojo(itemXml); 1276 if(oleItem!=null && (oleItem.getLocation()==null || oleItem.getCallNumber()==null)) { 1277 OleHoldings oleHoldings = getOleHoldings(instanceIdentifier); 1278 oleItem.setLocation(oleHoldings.getLocation()); 1279 oleItem.setCallNumber(oleHoldings.getCallNumber()); 1280 return oleItem; 1281 } 1282 return oleItem; 1283 } 1284 1285 1286 1287 /** 1288 * Thsi method is to check whether the item is available in doc store or not 1289 * @param oleDeliverRequestBo 1290 * @return boolean 1291 */ 1292 public boolean isItemAvailableInDocStore(OleDeliverRequestBo oleDeliverRequestBo) { 1293 LOG.info("Inside isItemAvailableInDocStore"); 1294 boolean available=false; 1295 Map<String, String> itemMap = new HashMap<String, String>(); 1296 LocationValuesBuilder locationValuesBuilder = new LocationValuesBuilder(); 1297 try { 1298 Map<String,String> itemUUIDMap = QueryServiceImpl.getInstance().getItemDetails(oleDeliverRequestBo.getItemId(),null); 1299 String itemUUID=itemUUIDMap.get(OLEConstants.ITEM_UUID); 1300 oleDeliverRequestBo.setItemUuid(itemUUID); 1301 1302 itemMap.put(OLEConstants.ITEM_UUID, oleDeliverRequestBo.getItemUuid()); 1303 List<OleItemSearch> itemSearchList =getOleItemSearchList(itemMap); 1304 if (itemSearchList != null && itemSearchList.size() > 0) { 1305 oleDeliverRequestBo.setTitle(itemSearchList.get(0).getTitle()); 1306 oleDeliverRequestBo.setAuthor(itemSearchList.get(0).getAuthor()); 1307 oleDeliverRequestBo.setCallNumber(itemSearchList.get(0).getCallNumber()); 1308 oleDeliverRequestBo.setItemType(itemSearchList.get(0).getItemType()); 1309 } 1310 String itemXml = getItemXML(oleDeliverRequestBo.getItemUuid()); 1311 Item oleItem = getItemPojo(itemXml); 1312 oleDeliverRequestBo.setOleItem(oleItem); 1313 oleDeliverRequestBo.setCopyNumber(oleItem.getCopyNumber()); 1314 oleDeliverRequestBo.setItemStatus(oleItem.getItemStatus()); 1315 locationValuesBuilder.getLocation(oleItem, oleDeliverRequestBo, (String) itemUUIDMap.get(OLEConstants.INSTANCE_UUID)); 1316 available=true; 1317 } catch (Exception e) { 1318 LOG.error("Item Barcode not available in doc store"+e); 1319 } 1320 1321 1322 return available; 1323 } 1324 1325 1326 public List<OleItemSearch> getOleItemSearchList(Map<String, String> searchCriteria) { 1327 1328 List<OleItemSearch> oleItemSearchList=new ArrayList<OleItemSearch>(); 1329 StringBuffer query=new StringBuffer(""); 1330 String title=((String)searchCriteria.get("title")); 1331 String author=((String)searchCriteria.get("author")); 1332 String publisher=((String)searchCriteria.get("publisher")); 1333 String callNumber=((String)searchCriteria.get("callNumber")); 1334 String itemType=((String)searchCriteria.get("itemType")); 1335 String itemBarCode=(String)searchCriteria.get("itemBarCode"); 1336 String itemUuid = (String)searchCriteria.get("itemUuid"); 1337 1338 1339 1340 if( title !=null && !title.equals("")) 1341 query.append("(Title_search:"+title.toLowerCase()+"*) AND "); 1342 if(author !=null && !author.equals("")) 1343 query.append("(Author_search:"+author.toLowerCase()+"*) AND "); 1344 if(publisher!=null && !publisher.equals("")) 1345 query.append("(Publisher_search:"+publisher.toLowerCase()+"*) AND"); 1346 1347 if(!query.toString().equals("")){ 1348 query=new StringBuffer(query.substring(0,query.lastIndexOf("AND"))); 1349 oleItemSearchList=getOleItemListByBibInfo(query.toString(),searchCriteria); 1350 return oleItemSearchList; 1351 } 1352 1353 1354 if(itemBarCode!=null && !itemBarCode.equals("")) 1355 query.append("(ItemBarcode_display:"+itemBarCode+") AND "); 1356 if(callNumber !=null && !callNumber.equals("")) 1357 query.append("(CallNumber_search:"+callNumber.toLowerCase()+"*) AND "); 1358 if(itemType !=null && !itemType.equals("")) 1359 query.append("(ItemTypeCodeValue_search:"+itemType.toLowerCase()+") AND "); 1360 if(itemUuid != null && !itemUuid.equals("")) 1361 query.append("(id:"+itemUuid+") AND "); 1362 1363 if(!query.toString().equals("")){ 1364 query=new StringBuffer(query.substring(0,query.lastIndexOf("AND"))); 1365 oleItemSearchList=getOleItemListByItemInfo(query.toString(),searchCriteria); 1366 return oleItemSearchList; 1367 } 1368 1369 if(query.toString().equals("")) { 1370 query.append("*:*"); 1371 oleItemSearchList=getOleItemListByBibInfo(query.toString(),searchCriteria); 1372 } 1373 return oleItemSearchList; 1374 } 1375 1376 public DocumentConfig getDocumentConfigObj() { 1377 String docstoreURL = PropertyUtil.getPropertyUtil().getProperty(DOCSTORE_BASE_URL); 1378 DocumentConfigConverter documentConverter = new DocumentConfigConverter(); 1379 DocumentConfig documentConfig = null; 1380 try { 1381 URL url = new URL(docstoreURL + DOC_CONFIG_INFO); 1382 InputStream in = new BufferedInputStream(url.openStream()); 1383 BufferedReader br = new BufferedReader(new InputStreamReader(in)); 1384 String line; 1385 StringBuilder sb = new StringBuilder(); 1386 while ((line = br.readLine()) != null) { 1387 sb.append(line); 1388 } 1389 String docXml = sb.toString(); 1390 documentConfig = documentConverter.unmarshal(docXml); 1391 } 1392 catch (Exception e) { 1393 LOG.error(e); 1394 } 1395 1396 return documentConfig; 1397 } 1398 1399 /** 1400 * 1401 * @param uuids 1402 * @param fieldValueList 1403 * @return 1404 * @throws SolrServerException 1405 */ 1406 public boolean checkItemStatus(List<String> uuids, List<String> fieldValueList) throws SolrServerException { 1407 for (String uuid : uuids) { 1408 boolean isNotValidItem = QueryServiceImpl.getInstance() 1409 .verifyFieldValue(uuid, "ItemStatus_display", fieldValueList); 1410 if (isNotValidItem) { 1411 return true; 1412 } 1413 } 1414 return false; 1415 } 1416 1417 /** 1418 * 1419 * @param instanceIds 1420 * @param fieldValueList 1421 * @return 1422 * @throws SolrServerException 1423 */ 1424 public boolean checkItemStatusForInstances(List<String> instanceIds, List<String> fieldValueList) throws SolrServerException { 1425 1426 List<String> itemIds = QueryServiceImpl.getInstance().getItemIdsForInstanceIds(instanceIds); 1427 1428 return checkItemStatus(itemIds,fieldValueList); 1429 } 1430 1431 }