1 package org.kuali.ole.describe.bo;
2
3 import org.apache.commons.lang.StringUtils;
4 import org.apache.log4j.Logger;
5 import org.apache.solr.client.solrj.SolrServerException;
6 import org.kuali.ole.describe.form.EditorForm;
7 import org.kuali.ole.docstore.common.document.BibTree;
8 import org.kuali.ole.docstore.common.document.Holdings;
9 import org.kuali.ole.docstore.common.document.HoldingsTree;
10 import org.kuali.ole.docstore.common.document.Item;
11 import org.kuali.ole.docstore.common.document.content.instance.LocationLevel;
12 import org.kuali.ole.docstore.common.document.content.instance.OleHoldings;
13 import org.kuali.ole.docstore.common.document.content.instance.xstream.HoldingOlemlRecordProcessor;
14 import org.kuali.ole.docstore.common.document.content.instance.xstream.ItemOlemlRecordProcessor;
15 import org.kuali.ole.docstore.model.enums.DocType;
16 import org.kuali.rice.core.api.util.tree.Node;
17 import org.kuali.rice.krad.service.BusinessObjectService;
18 import org.kuali.rice.krad.service.KRADServiceLocator;
19 import org.kuali.ole.docstore.common.document.EHoldings;
20
21 import java.util.*;
22 import java.util.regex.Matcher;
23 import java.util.regex.Pattern;
24
25
26
27
28
29
30
31
32 public class EditorFormDataHandler {
33
34 private static final Logger LOG = Logger.getLogger(EditorFormDataHandler.class);
35
36 public EditorForm buildLeftPaneData(EditorForm editorForm) {
37 DocumentSelectionTree documentSelectionTree = new DocumentSelectionTree();
38 List<BibTree> bibTreeList = editorForm.getDocumentForm().getBibTreeList();
39 if (bibTreeList == null) {
40 bibTreeList = editorForm.getBibTreeList();
41 }
42 Collection<String> uuids = null;
43 List<HoldingsTree> holdingsTrees = new ArrayList<HoldingsTree>();
44 List<HoldingsTree> eHoldingsTrees = new ArrayList<HoldingsTree>();
45
46 if (bibTreeList != null) {
47 for (BibTree bibTree : bibTreeList) {
48 if (bibTree != null && bibTree.getBib() != null) {
49 editorForm.setBibId(bibTree.getBib().getId());
50 if (bibTree.getHoldingsTrees() != null) {
51 Collections.sort(bibTree.getHoldingsTrees());
52 for (HoldingsTree holdingsTree : bibTree.getHoldingsTrees()) {
53 Collections.sort(holdingsTree.getItems());
54 if (holdingsTree.getHoldings().getId() != null) {
55 Holdings holdings = holdingsTree.getHoldings();
56 if (holdings instanceof EHoldings) {
57 eHoldingsTrees.add(holdingsTree);
58 } else {
59 holdingsTrees.add(holdingsTree);
60 }
61 }
62 }
63 }
64 }
65 }
66 }
67
68 Node<DocumentTreeNode, String> rootNode = null;
69 try {
70 rootNode = documentSelectionTree.addHoldingsTree(holdingsTrees, DocType.HOLDINGS.getCode());
71
72 if (eHoldingsTrees.size() > 0) {
73 documentSelectionTree.addHoldingsTree(eHoldingsTrees, DocType.EHOLDINGS.getCode());
74 }
75 } catch (SolrServerException e) {
76 LOG.error("buildLeftPaneData Exception:" + e);
77 }
78 editorForm.getLeftTree().setRootElement(rootNode);
79 return editorForm;
80 }
81
82
83 public String prepareBibTree(EditorForm editorForm) {
84
85 List<BibTree> bibTreeList = editorForm.getBibTreeList();
86 String editable = editorForm.getEditable();
87 StringBuilder sb = new StringBuilder();
88 String docFormat = editorForm.getDocFormat();
89 if (bibTreeList != null) {
90 sb.append("<ul id='navigation'>");
91 for (BibTree bibTree : bibTreeList) {
92 sb.append(" ");
93 if (editable.equals("true") && bibTree.getId() != null) {
94 sb.append(
95 "<img src='../krms/images/add.png' alt='Add Holdings' title='Add Holdings' class='addInstance' id='")
96 .append(bibTree.getId() + "_work_instance_oleml").append("'></img> ");
97 sb.append(
98 "<img src='../krad/images/cancel.png' alt='Delete Bib' title='Delete Bib' class='deleteBib' id='")
99 .append(bibTree.getId() + "_work_bibliographic_marc").append("'></img>");
100 }
101 if (bibTree != null) {
102 List<HoldingsTree> holdingsTreeList = bibTree.getHoldingsTrees();
103 Holdings holdings = new Holdings();
104 List<Item> itemList = new ArrayList<Item>();
105 if (null != holdingsTreeList && holdingsTreeList.size() > 0) {
106 sb.append("<ul>");
107 for (HoldingsTree holdingsTree : holdingsTreeList) {
108 holdings = holdingsTree.getHoldings();
109 if (holdings != null) {
110 String holdingIdentifier = holdings.getId()
111 + "_work_holdings_oleml_" + bibTree.getId();
112
113
114 sb.append("<li><div align='left' title='View/Edit Holdings' class='holdingIdentifierClass' id='")
115 .append(holdingIdentifier).append("'");
116 if (holdings.getId() != null && holdings.getId().equals(editorForm.getDocId())) {
117 sb.append(" style='color:blue'");
118 }
119
120
121 sb.append(" ");
122 if ((editable.equals("true") && (holdingsTree.getHoldings().getId() != null))) {
123 sb.append(
124 "<img src='../krms/images/add.png' alt='Add Item' title='Add Item' class='addItem' id='")
125 .append(holdingsTree.getHoldings().getId() + "_work_item_oleml_"
126 + bibTree.getId()).append("'></img>");
127 sb.append(
128 "<img src='../krad/images/cancel.png' alt='Delete Instance' title='Delete Instance' class='deleteBib' id='")
129 .append(holdingsTree.getHoldings().getId() + "_work_instance_oleml" + "_"
130 + bibTree.getId()).append("'></img>");
131 }
132 sb.append("</div>");
133 sb.append("<ul>");
134 }
135 itemList = holdingsTree.getItems();
136 if (itemList != null) {
137 for (int i = 0; i < itemList.size(); i++) {
138 Item item = itemList.get(i);
139 if (item != null) {
140 String itemIdentifier = item.getId() + "_work_item_oleml_"
141 + holdingsTree.getHoldings().getId() + "_"
142 + bibTree.getId();
143
144
145 sb.append("<li><div align='left' title='View/Edit Item' class='itemIdentifierClass' id='")
146 .append(itemIdentifier).append("'");
147 if (item.getId() != null && item.getId().equals(editorForm.getDocId())) {
148 sb.append(" style='color:blue'");
149 }
150
151 sb.append(" ");
152 if ((editable.equals("true")) && (item.getId() != null)) {
153 sb.append(
154 "<img src='../krad/images/cancel.png' alt='Add Item' title='Delete Item' class='deleteBib' id='")
155 .append(item.getId() + "_work_item_oleml" + "_"
156 + item.getId()).append("'></img>").append("</div></li>");
157 }
158
159 }
160 }
161 }
162 sb.append("</ul></li>");
163 }
164
165 } else {
166 sb.append("</li>");
167 }
168 }
169 }
170 sb.append("</ul>");
171 }
172 return sb.toString();
173 }
174
175 public String getItemLabel(Holdings holdings, Item item) {
176
177 String itemLabel = "";
178 StringBuffer itemLabelBuffer = new StringBuffer();
179 StringBuffer itemLabelBufferForStaffOnly = new StringBuffer();
180 StringBuffer holdingsCallNumberInformation = new StringBuffer();
181 OleHoldings oleHoldings = new HoldingOlemlRecordProcessor().fromXML(holdings.getContent());
182 org.kuali.ole.docstore.common.document.content.instance.Item oleItem = new ItemOlemlRecordProcessor().fromXML(item.getContent());
183
184 if (oleHoldings != null && oleHoldings.getCallNumber() != null) {
185 getCallNumberInformation(holdingsCallNumberInformation, oleHoldings.getCallNumber().getPrefix(),
186 oleHoldings.getCallNumber().getNumber());
187 }
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214 itemLabelBuffer.append(item.getDisplayLabel());
215 if (StringUtils.isEmpty(itemLabelBuffer.toString().trim())) {
216 itemLabelBuffer = itemLabelBuffer.append("Item");
217 }
218 if (itemLabelBuffer.length() > 0) {
219 if (item.isAnalytic()) {
220 itemLabelBuffer.append("<a href='analyticsController?viewId=AnalyticsSummaryView&methodToCall=showAnalyticsSummary&itemId="+ item.getId()
221 + "&docType=item&' class='analytics' target='_blank'>AI</a>");
222 }
223 if (item.isStaffOnly()) {
224 itemLabelBufferForStaffOnly.append("<i><font color='red'>");
225 itemLabelBufferForStaffOnly.append(itemLabelBuffer);
226 itemLabelBufferForStaffOnly.append("</font></i>");
227 } else {
228 itemLabelBufferForStaffOnly.append(itemLabelBuffer);
229 }
230 itemLabel = itemLabelBufferForStaffOnly.toString();
231 }
232
233 return itemLabel;
234 }
235
236
237 public String getHoldingsLabel(HoldingsTree holdingsTree) {
238 StringBuffer holdingsLabelBuffer = new StringBuffer();
239 StringBuffer holdingsLabelBufferForStaffOnly = new StringBuffer();
240 String holdingsLabel = "";
241
242 Boolean staffOnlyFlag = holdingsTree.getHoldings().isStaffOnly();
243 String linkedBibCount = "";
244 boolean analyticHoldingFlag = false;
245 String itemId = "";
246
247
248
249
250
251
252
253
254
255
256
257
258 if (StringUtils.isNotBlank(holdingsTree.getHoldings().getDisplayLabel())) {
259 if (staffOnlyFlag != null && staffOnlyFlag) {
260 holdingsLabelBuffer.append("<i><font color='red'>");
261 holdingsLabelBuffer.append(holdingsTree.getHoldings().getDisplayLabel());
262 holdingsLabelBuffer.append("</font></i>");
263 } else {
264 holdingsLabelBuffer.append(holdingsTree.getHoldings().getDisplayLabel());
265 }
266 }
267
268 boolean boundWithFlag = false;
269
270 if (holdingsLabelBuffer.length() > 0) {
271 int bibUUIDS = 0;
272 String showBibLink = null;
273 String showSHLink = null;
274 if(holdingsTree.getHoldings().isBoundWithBib()){
275 bibUUIDS = holdingsTree.getHoldings().getBibs().getBibs().size();
276 }
277 if (holdingsTree.getHoldings().isSeries()) {
278 showSHLink = "<a href='analyticsController?viewId=AnalyticsSummaryView&methodToCall=showAnalyticsSummary&holdingsId="+ holdingsTree.getHoldings().getId()
279 + "&docType=holdings&' class='analytics' target='_blank'>SH</a>";
280
281 holdingsLabelBuffer.append(showSHLink);
282 }
283 String holdingsId = "";
284 for (Item item : holdingsTree.getItems()) {
285 if (item.isAnalytic()) {
286 for (Holdings holdings : item.getHoldings()) {
287 holdingsId = holdings.getId();
288 }
289 if(!(holdingsId.equals(holdingsTree.getHoldings().getId()))){
290
291
292 analyticHoldingFlag = true;
293 itemId = item.getId();
294 }
295 }
296 }
297 if(analyticHoldingFlag == true) {
298 showSHLink = "<a href='analyticsController?viewId=AnalyticsSummaryView&methodToCall=showAnalyticsSummary&itemId="+ itemId
299 + "&docType=item&' class='analytics' target='_blank'>AH</a>" ;
300
301 holdingsLabelBuffer.append(showSHLink);
302 }
303 if (bibUUIDS > 0) {
304 if ((bibUUIDS > 1)) {
305 boundWithFlag = true;
306 linkedBibCount = "BIBS(" + (bibUUIDS) + ")";
307 }
308 showBibLink =
309 "<a href='editorcontroller?viewId=ShowBibView&methodToCall=showBibs&holdingsId="
310 + holdingsTree.getHoldings().getId()
311 + "&docCategory=work&docType=holdings&docFormat=oleml&editable=true' class='boundWithbibs' target='_blank'>"
312 + linkedBibCount + "</a>";
313 }
314 if (boundWithFlag) {
315
316 holdingsLabelBuffer.append(showBibLink);
317 }
318 holdingsLabel = holdingsLabelBuffer.toString();
319 }
320 if(StringUtils.isEmpty(holdingsLabel.trim())) {
321 holdingsLabel ="Holdings";
322 }
323 return holdingsLabel;
324 }
325
326
327 private String getLocationCode(LocationLevel locationLevel) {
328 String locationCode = "";
329 while (locationLevel != null) {
330 String name = locationLevel.getName();
331 if (name != null) {
332 BusinessObjectService businessObjectService = KRADServiceLocator.getBusinessObjectService();
333 Map parentCriteria = new HashMap();
334 parentCriteria.put("locationCode", name);
335 OleLocation oleLocationCollection = businessObjectService.findByPrimaryKey(OleLocation.class, parentCriteria);
336 if (oleLocationCollection != null) {
337 String code = oleLocationCollection.getLocationCode();
338 if (locationCode.equalsIgnoreCase("")) {
339 locationCode = code;
340 } else {
341 locationCode = locationCode + "/" + code;
342 }
343 }
344 }
345 locationLevel = locationLevel.getLocationLevel();
346 }
347 return locationCode;
348 }
349
350 private void getCallNumberInformation(StringBuffer holdingsData, String prefix, String callNumber) {
351
352 if (prefix != null) {
353 addDataToLabel(holdingsData, prefix);
354 }
355
356 if (callNumber != null) {
357 addDataToLabel(holdingsData, callNumber);
358 }
359
360 }
361
362
363 private void addDataToLabel(StringBuffer label, String data) {
364 if (data.length() > 0) {
365 if (label.length() > 0) {
366 label.append("-");
367 }
368 label.append(data);
369 }
370 }
371
372
373 public String validateTitleForLeftPane(String title) {
374 StringBuffer stringBuffer = new StringBuffer();
375 String regex = "<";
376 String replaceString = " < ";
377 Pattern pattern = Pattern.compile(regex);
378 Matcher matcher = pattern.matcher(title);
379 while (matcher.find()) {
380 matcher.appendReplacement(stringBuffer, replaceString);
381 }
382 matcher.appendTail(stringBuffer);
383 return stringBuffer.toString();
384 }
385
386 }