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
27
28
29
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
51
52
53
54
55
56
57
58
59
60
61
62
63
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
80 BibMarcRecord bibMarcRecord = getBibMarcRecord(bibId);
81
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
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
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 }
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
147
148
149
150
151 private void getInstanceDetails(BibMarcRecord bibMarcRecord, OLEBatchProcessProfileBo profile, StringBuilder errBuilder) throws Exception {
152 List<DataField> dataFields = bibMarcRecord.getDataFields();
153
154 try {
155
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 }