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 }