1 package org.kuali.ole.docstore.engine.service.index.solr;
2
3 import org.apache.solr.common.SolrInputDocument;
4 import org.kuali.ole.docstore.common.document.Bib;
5 import org.kuali.ole.docstore.common.document.content.bib.dc.unqualified.BibDublinUnQualifiedRecord;
6 import org.kuali.ole.docstore.common.document.content.bib.dc.unqualified.OaiDcDoc;
7 import org.kuali.ole.docstore.common.document.content.bib.dc.unqualified.Record;
8 import org.kuali.ole.docstore.common.document.content.bib.dc.unqualified.Tag;
9 import org.kuali.ole.docstore.common.document.content.bib.dc.unqualified.xstream.BibDublinUnQualifiedRecordProcessor;
10 import org.kuali.ole.docstore.common.document.content.enums.DocCategory;
11 import org.kuali.ole.docstore.common.document.content.enums.DocFormat;
12 import org.kuali.ole.docstore.common.document.content.enums.DocType;
13 import org.kuali.ole.docstore.model.xmlpojo.config.DocumentCategory;
14 import org.kuali.ole.docstore.model.xmlpojo.config.DocumentConfig;
15 import org.kuali.ole.docstore.model.xmlpojo.config.DocumentFormat;
16 import org.kuali.ole.docstore.model.xmlpojo.config.DocumentType;
17 import org.kuali.ole.docstore.model.xmlpojo.metadata.DocumentMetaData;
18 import org.kuali.ole.docstore.model.xmlpojo.metadata.Field;
19
20 import java.util.ArrayList;
21 import java.util.List;
22
23
24
25
26
27
28
29
30 public class BibDcUnqualifiedIndexer extends BibMarcIndexer {
31
32 private static BibDcUnqualifiedIndexer bibDcUnqualifiedIndexer = null;
33
34 public static BibDcUnqualifiedIndexer getInstance() {
35 if(bibDcUnqualifiedIndexer == null) {
36 bibDcUnqualifiedIndexer = new BibDcUnqualifiedIndexer();
37 }
38 return bibDcUnqualifiedIndexer;
39 }
40 private static DocumentMetaData dublinUnqMetaData = new DocumentMetaData();
41
42 static {
43
44 List<DocumentCategory> docCategories = DocumentConfig.getInstance().getDocumentCategories();
45
46 for (DocumentCategory cat : docCategories) {
47
48 for (DocumentType type : cat.getDocumentTypes()) {
49
50 for (DocumentFormat format : type.getDocumentFormats()) {
51
52 if (DocCategory.WORK.isEqualTo(cat.getId()) && DocType.BIB.isEqualTo(type.getId())
53 && DocFormat.DUBLIN_UNQUALIFIED.isEqualTo(format.getId())) {
54
55 for (org.kuali.ole.docstore.model.xmlpojo.config.Field field : format.getFields()) {
56
57 Field dublinField = new Field();
58 dublinField.setName(field.getId());
59
60 if (field.getMapping().getInclude() != null)
61 dublinField.set("tag", field.getMapping().getInclude());
62
63 dublinUnqMetaData.getFields().add(dublinField);
64
65 }
66
67 }
68
69 }
70
71 }
72
73 }
74
75
76
77 }
78
79
80 private BibDublinUnQualifiedRecordProcessor bibDublinUnQualifiedRecordProcessor = new BibDublinUnQualifiedRecordProcessor();
81 protected void buildSolrInputDocument(Object object, List<SolrInputDocument> solrInputDocuments) {
82 Bib bib = (Bib) object;
83
84 BibDublinUnQualifiedRecord bibDublinUnQualifiedRecord = bibDublinUnQualifiedRecordProcessor.fromXML(bib.getContent());
85
86 List<SolrInputDocument> solrInputDocumentList = buildSolrInputDocuments(bibDublinUnQualifiedRecord);
87
88 for(SolrInputDocument solrInputDocument : solrInputDocumentList) {
89 setCommonFields(bib, solrInputDocument);
90 }
91
92 solrInputDocuments.addAll(solrInputDocumentList);
93
94 }
95
96
97
98
99
100
101
102 public SolrInputDocument buildSolrInputDocument(OaiDcDoc doc) {
103 SolrInputDocument solrDoc = new SolrInputDocument();
104 solrDoc.addField(DOC_TYPE, DocType.BIB.getCode());
105 solrDoc.addField(DOC_FORMAT, DocFormat.DUBLIN_UNQUALIFIED.getCode());
106
107 for (Field field : dublinUnqMetaData.getFields()) {
108
109 if (field.getName().equals(PUBLICATIONDATE_FACET)) {
110 addFieldToSolrDoc(field.getName(), buildPublicationDateFacetValues(buildFieldValue(field.getName(), field.get("tag"), doc)), solrDoc);
111 } else {
112 addFieldToSolrDoc(field.getName(), buildFieldValue(field.getName(), field.get("tag"), doc), solrDoc);
113 }
114
115 }
116
117 addFieldToSolrDoc(ALL_TEXT, getAllText(doc), solrDoc);
118 return solrDoc;
119 }
120
121
122
123
124
125
126
127
128 public List<SolrInputDocument> buildSolrInputDocuments(BibDublinUnQualifiedRecord unqRecord) {
129 List<SolrInputDocument> solrDocs = new ArrayList<SolrInputDocument>();
130 if (unqRecord.getListRecords() != null) {
131 for (Record rec : unqRecord.getListRecords().getRecords()) {
132 if (rec.getMetadata() != null) {
133 for (OaiDcDoc doc : rec.getMetadata().getOaiDcDocs()) {
134 solrDocs.add(buildSolrInputDocument(doc));
135 }
136 }
137 }
138 }
139 return solrDocs;
140
141 }
142
143 private void addFieldToSolrDoc(String fieldName, Object value, SolrInputDocument solrDoc) {
144
145
146
147
148
149
150
151 if (value instanceof List) {
152 if (fieldName.toLowerCase().endsWith("_sort"))
153 {
154 solrDoc.addField(fieldName, ((List) value).get(0));
155 } else if (fieldName.endsWith("_facet")) {
156 solrDoc.addField(fieldName, getSortString((List) value));
157 } else {
158 for (Object obj : (List<Object>) value)
159
160 {
161 solrDoc.addField(fieldName, obj);
162 }
163 }
164 } else {
165 if (fieldName.endsWith("_sort")) {
166 if (value != null) {
167 solrDoc.addField(fieldName, value.toString());
168 }
169 } else if (fieldName.endsWith("_facet")) {
170 if (value != null) {
171 solrDoc.addField(fieldName, getSortString(value.toString()));
172 }
173 } else {
174 solrDoc.addField(fieldName, value);
175 }
176 }
177 }
178
179
180
181
182
183
184
185
186
187 private List<String> buildFieldValue(String name, String tagName, OaiDcDoc record) {
188
189 List<String> fieldValues = new ArrayList<String>();
190
191
192
193
194
195
196
197 for (Tag tag : record.get(tagName))
198 if (name.startsWith("PublicationDate")) {
199 String pubDate = extractPublicationDateWithRegex(tag.getValue());
200 fieldValues.add(pubDate);
201 } else if (tagName.equals(OaiDcDoc.LANGUAGE)) {
202 String lang = Languages.getInstance(Languages.ISO_639_3).getLanguageDescription(tag.getValue());
203 fieldValues.add(lang == null ? "Undefined" : lang);
204 } else if (name.startsWith("ISBN")) {
205 if (tag.getValue().toUpperCase().contains("(ISBN)"))
206 fieldValues.add(tag.getValue().toUpperCase().replace("(ISBN)", ""));
207 } else if (name.startsWith("ISSN")) {
208 if (tag.getValue().toUpperCase().contains("(ISSN)"))
209 fieldValues.add(tag.getValue().toUpperCase().replace("(ISSN)", ""));
210 } else {
211 fieldValues.add(tag.getValue());
212 }
213
214 if (fieldValues.size() > 0) {
215 return fieldValues;
216 } else {
217 return null;
218 }
219 }
220
221
222
223
224
225
226
227 public List getAllText(OaiDcDoc record) {
228 List allTxt = new ArrayList();
229 for (Tag tag : record.getAllTags()) {
230 allTxt.add(tag.getValue());
231 }
232 return allTxt;
233 }
234
235 protected void updateRecordInSolr(Object object, List<SolrInputDocument> solrInputDocuments) {
236
237 }
238
239 }