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    }