View Javadoc
1   package org.kuali.ole.batch.impl;
2   
3   import org.apache.commons.lang.StringUtils;
4   import org.apache.log4j.Logger;
5   import org.kuali.ole.batch.bo.OLEBatchProcessProfileBo;
6   import org.kuali.ole.batch.helper.EInstanceMappingHelper;
7   import org.kuali.ole.batch.helper.InstanceMappingHelper;
8   import org.kuali.ole.batch.helper.OLEBatchProcessDataHelper;
9   import org.kuali.ole.batch.service.ExportDataService;
10  import org.kuali.ole.docstore.common.document.Bib;
11  import org.kuali.ole.docstore.common.document.BibTree;
12  import org.kuali.ole.docstore.common.document.HoldingsTree;
13  import org.kuali.ole.docstore.common.document.content.bib.marc.BibMarcRecord;
14  import org.kuali.ole.docstore.common.document.content.bib.marc.BibMarcRecords;
15  import org.kuali.ole.docstore.common.document.content.bib.marc.DataField;
16  import org.kuali.ole.docstore.common.document.content.bib.marc.xstream.BibMarcRecordProcessor;
17  import org.kuali.ole.docstore.common.search.SearchResult;
18  import org.kuali.ole.docstore.common.search.SearchResultField;
19  import org.kuali.ole.docstore.engine.service.DocstoreServiceImpl;
20  
21  import java.util.*;
22  
23  import static org.kuali.ole.OLEConstants.OLEBatchProcess.*;
24  
25  /**
26   * Created with IntelliJ IDEA.
27   * User: meenrajd
28   * Date: 7/5/13
29   * Time: 2:38 PM
30   */
31  public class ExportDataServiceImpl implements ExportDataService {
32  
33      private static final Logger LOG = Logger.getLogger(ExportDataServiceImpl.class);
34      private List<String> bibIdList = new ArrayList<>();
35      private DocstoreServiceImpl docstoreService ;
36  
37      public DocstoreServiceImpl getDocstoreService() {
38          if (null == docstoreService) {
39              docstoreService= new DocstoreServiceImpl();
40          }
41          return docstoreService;
42      }
43  
44  
45      public ExportDataServiceImpl() {
46          bibIdList.clear();
47      }
48  
49      /**
50       * public method to retrieves the list of bib / instance records for the given profile
51       * <p/>
52       * Returns object array - array size is  4
53       * Following positions of the array has the details of the data it contains
54       * 0 - has the count of bib records
55       * 1 - List with xml data of the bib records , if the export type is marc xml the list will have only one item will
56       * all the bib records in a single String object, if the export type is marc the list will have each record as an item
57       * 2 - Errors generated
58       * 3 -  Error count
59       *
60       * @param searchResultList
61       * @param profile
62       * @return
63       * @throws Exception
64       */
65      public Object[] getExportDataBySolr(List<SearchResult> searchResultList, OLEBatchProcessProfileBo profile) throws Exception {
66          List<String> bibMarcRecordList = new ArrayList<String>();
67          List<BibMarcRecord> bibRecords = new ArrayList<BibMarcRecord>();
68          StringBuilder errBuilder = new StringBuilder();
69          int errCnt = 0;
70          for (SearchResult searchResult : searchResultList) {
71              try {
72                  for (SearchResultField searchResultField : searchResult.getSearchResultFields()) {
73                      if (searchResultField.getDocType().equalsIgnoreCase("bibliographic") && searchResultField.getFieldName().equalsIgnoreCase("bibIdentifier")) {
74                          String bibId = searchResultField.getFieldValue();
75                          if (bibIdList.contains(bibId)) continue;
76                          bibIdList.add(bibId);
77                          try {
78                              if (StringUtils.isNotEmpty(bibId)) {
79                                  //BibliographicRecord bibliographicRecord = helperService.getBibliographicRecord(bibId);
80                                  BibMarcRecord bibMarcRecord = getBibMarcRecord(bibId);
81                                  //Intance mapping
82  
83                                  if (!profile.getOleBatchProcessProfileMappingOptionsList().isEmpty()
84                                          && StringUtils.isNotEmpty(profile.getDataToExport()) && (profile.getDataToExport().equalsIgnoreCase(OLEBatchProcess.EXPORT_BIB_AND_INSTANCE) || profile.getDataToExport().equalsIgnoreCase(OLEBatchProcess.EXPORT_BIB_INSTANCE_AND_EINSTANCE))) {
85                                      try {
86                                          getInstanceDetails(bibMarcRecord, profile, errBuilder);
87                                          LOG.debug("Instance data mapping completed");
88                                      } catch (Exception ex) {
89                                          LOG.error("Instance data mapping Error for Bib record id::" + bibMarcRecord.getRecordId(), ex);
90                                          buildError(errBuilder, ERR_BIB, bibMarcRecord.getRecordId(), "", "",
91                                                  ERR_CAUSE, ex.getMessage(), TIME_STAMP, new Date().toString());
92                                      }
93                                  }
94                                  //Marc record rename
95                                  if (!profile.getOleBatchProcessProfileRenameFieldsList().isEmpty()) {
96                                      try {
97                                          OLEBatchProcessDataHelper.getInstance().renameMarcFieldsSubFields(profile, bibMarcRecord);
98                                          LOG.debug("Rename of bib marc records completed");
99                                      } catch (Exception ex) {
100                                         LOG.error("Marc Record Rename error for Bib record id::" + bibMarcRecord.getRecordId(), ex);
101                                         buildError(errBuilder, ERR_BIB, bibMarcRecord.getRecordId(), ERR_CAUSE, ex.getMessage(), " ::At:: ", "renameMarcFieldsSubFields", TIME_STAMP, new Date().toString());
102                                     }
103                                 }
104                                 //Marc record delete
105                                 if (!profile.getOleBatchProcessProfileDeleteFieldsList().isEmpty()) {
106                                     try {
107                                         OLEBatchProcessDataHelper.getInstance().deleteFieldsSubfields(profile, bibMarcRecord);
108                                         LOG.debug("Deletion of bib marc records completed");
109                                     } catch (Exception ex) {
110                                         LOG.error("Marc record delete Error for Bib record id::" + bibMarcRecord.getRecordId(), ex);
111                                         buildError(errBuilder, ERR_BIB, bibMarcRecord.getRecordId(), ERR_CAUSE, ex.getMessage(), " ::At:: ", "deleteFieldsSubfields", TIME_STAMP, new Date().toString());
112                                     }
113                                 }
114                                 bibRecords.add(bibMarcRecord);
115                             }
116                         } catch (Exception ex) {
117                             LOG.error("Error while getting bib information for record id::" + bibId, ex);
118                             buildError(errBuilder, ERR_BIB, bibId, ERR_CAUSE, ex.getMessage(), " ::At:: ", "getBibliographicRecord", TIME_STAMP, new Date().toString());
119                             errCnt++;
120                         }
121                     }
122                 }
123             } catch (Exception ex) {
124                 LOG.error("Error while Exporting bibs :: No of bibs processed while error occured :: " + bibIdList.size(), ex);
125 
126                 if (!bibIdList.isEmpty()) {
127                     LOG.error("Bib record where error occured: " + bibIdList.get(bibIdList.size() - 1), ex);
128                     buildError(errBuilder, ERR_BIB, bibIdList.get(bibIdList.size() - 1), ERR_CAUSE, ex.getMessage(), " ::At:: ", "getBibliographicRecord-P", TIME_STAMP, new Date().toString());
129                     errCnt++;
130                 }
131             }
132         }//End loop of bib ids
133         BibMarcRecordProcessor bibMarcRecordProcessor = new BibMarcRecordProcessor(errBuilder);
134         try {
135             getResult(bibMarcRecordProcessor, bibRecords, bibMarcRecordList);
136         } catch (Exception ex) {
137             LOG.error("Error while Exporting bibs :: No of bibs processed while error occured :: " + bibIdList.size(), ex);
138             buildError(errBuilder, ERR_CAUSE, "Error while getting bib data::" + ex.getMessage(), TIME_STAMP, new Date().toString());
139         }
140         return new Object[]{String.valueOf(bibMarcRecordProcessor.getSuccessCnt()), bibMarcRecordList, errBuilder.toString(), String.valueOf((errCnt + bibMarcRecordProcessor.getErrCnt()))};
141 
142     }
143 
144 
145     /**
146      * Method retrives the list of instances record for the bib record with the given instanceIdentifier list
147      *
148      * @param bibMarcRecord
149      * @param profile
150      */
151     private void getInstanceDetails(BibMarcRecord bibMarcRecord, OLEBatchProcessProfileBo profile, StringBuilder errBuilder) throws Exception {
152         List<DataField> dataFields = bibMarcRecord.getDataFields();
153         //for (String bibIdentifier : holdingsIdentifierList) {
154         try {
155             // if (StringUtils.isBlank(bibIdentifier)) continue;
156             List<DataField> holdingsItemDataField = Collections.emptyList();
157             BibTree bibTree = getDocstoreService().retrieveBibTree(bibMarcRecord.getRecordId());
158             if (bibTree != null && bibTree.getHoldingsTrees() != null && bibTree.getHoldingsTrees().size() > 0) {
159                 for (HoldingsTree holdingsTree : bibTree.getHoldingsTrees()) {
160                     boolean isStaffOnly = false;
161                     if (profile.getExportScope().equalsIgnoreCase(OLEBatchProcess.INCREMENTAL_EXPORT_EX_STAFF)) {
162                         if (holdingsTree.getHoldings().isStaffOnly()) {
163                             isStaffOnly = true;
164                         }
165                     }
166 
167                     if (!isStaffOnly) {
168                         if (holdingsTree.getHoldings().getHoldingsType().equalsIgnoreCase("print")) {
169                             holdingsItemDataField = new InstanceMappingHelper().generateDataFieldForHolding(holdingsTree, profile, errBuilder);
170                         } else {
171                             holdingsItemDataField = new EInstanceMappingHelper().generateDataFieldForEHolding(holdingsTree, profile, errBuilder);
172                         }
173                     }
174                     dataFields.addAll(holdingsItemDataField);
175                 }
176             }
177         } catch (Exception ex) {
178             LOG.error("Error while getting instance details for instanceID :: " + bibMarcRecord.getRecordId(), ex);
179             errBuilder.append("-----");
180             buildError(errBuilder, ERR_INSTANCE, bibMarcRecord.getRecordId(), ERR_CAUSE, ex.getMessage(), " ::At:: ", "getInstanceDetails", TIME_STAMP, new Date().toString());
181 
182         }
183     }
184 
185 
186     private void getResult(BibMarcRecordProcessor bibMarcRecordProcessor, List<BibMarcRecord> bibRecords, List<String> bibMarcRecordList) {
187         String bibMarcRecord = bibMarcRecordProcessor.generateXML(bibRecords);
188         bibMarcRecordList.add(bibMarcRecord);
189     }
190 
191 
192     private void buildError(StringBuilder errBuilder, String... errorString) {
193         for (String str : errorString) {
194             errBuilder.append(str).append(COMMA);
195         }
196         errBuilder.append(lineSeparator);
197     }
198 
199     private BibMarcRecord getBibMarcRecord(String bibUUID) throws Exception {
200         BibMarcRecord bibMarcRecord = null;
201         Bib bib = getDocstoreService().retrieveBib(bibUUID);
202         String responseDocStoreData = bib.getContent();
203         BibMarcRecordProcessor bibMarcRecordProcessor = new BibMarcRecordProcessor();
204         BibMarcRecords marcRecords = bibMarcRecordProcessor.fromXML(responseDocStoreData);
205         List<BibMarcRecord> bibMarcRecordList = marcRecords.getRecords();
206         Iterator<BibMarcRecord> bibMarcRecordListIterator = bibMarcRecordList.iterator();
207         if (bibMarcRecordListIterator.hasNext()) {
208             bibMarcRecord = bibMarcRecordListIterator.next();
209         }
210         return bibMarcRecord;
211     }
212 }