1 package org.kuali.ole.describe.rule;
2
3 import org.apache.commons.lang.StringUtils;
4 import org.apache.log4j.Logger;
5 import org.kuali.ole.OLEConstants;
6 import org.kuali.ole.describe.bo.DocumentSelectionTree;
7 import org.kuali.ole.describe.bo.DocumentTreeNode;
8 import org.kuali.ole.describe.form.AnalyticsForm;
9 import org.kuali.ole.docstore.common.client.DocstoreClientLocator;
10 import org.kuali.ole.docstore.common.document.*;
11 import org.kuali.ole.sys.context.SpringContext;
12 import org.kuali.rice.core.api.util.tree.Node;
13 import org.kuali.rice.core.api.util.tree.Tree;
14 import org.kuali.rice.krad.util.GlobalVariables;
15 import org.springframework.util.CollectionUtils;
16
17 import java.util.ArrayList;
18 import java.util.HashSet;
19 import java.util.List;
20 import java.util.Set;
21
22
23
24
25
26
27
28
29 public class OLEAnalyticsRule {
30 private static final Logger LOG = Logger.getLogger(OLEAnalyticsRule.class);
31
32 private DocstoreClientLocator docstoreClientLocator;
33
34 public DocstoreClientLocator getDocstoreClientLocator() {
35 if (null == docstoreClientLocator) {
36 return SpringContext.getBean(DocstoreClientLocator.class);
37 }
38 return docstoreClientLocator;
39 }
40
41 public void selectCheckedNodesForSeriesTree(AnalyticsForm analyticsForm, Node<DocumentTreeNode, String> seriesTreeRootElement) {
42 DocumentTreeNode documentTreeNode;
43 BibTree bibTree = new BibTree();
44 HoldingsTree holdingsTree = new HoldingsTree();
45 Holdings holdings = new Holdings();
46 Set<String> selectedBibsList = new HashSet<String>();
47 List<String> selectedBibs = new ArrayList<String>();
48 List<String> selectedBibsFromTree1 = new ArrayList<String>();
49 List<String> selectedInstancesList = new ArrayList<String>();
50 List<String> selectedHoldings = new ArrayList<String>();
51 List<String> selectedHoldingsFromTree1 = new ArrayList<String>();
52 String tree1BibId = null;
53 Bib bib = new Bib();
54 List<Item> items = new ArrayList<Item>();
55 if (seriesTreeRootElement != null) {
56 List<Node<DocumentTreeNode, String>> seriesTreeList = seriesTreeRootElement.getChildren();
57 for (Node<DocumentTreeNode, String> bibNode : seriesTreeList) {
58 documentTreeNode = bibNode.getData();
59 LOG.info("Series-bibId-->" + bibNode.getNodeType());
60 LOG.info("Series-bibNodeTitle-->" + bibNode.getData().getTitle());
61 LOG.info("Series-bibNodeSelected-->" + documentTreeNode.isSelect());
62 List<Node<DocumentTreeNode, String>> holdingsList = bibNode.getChildren();
63 for (Node<DocumentTreeNode, String> holdingsNode : holdingsList) {
64 documentTreeNode = holdingsNode.getData();
65 LOG.info("Series-holdingsId-->" + holdingsNode.getNodeType());
66 LOG.info("Series-holdingsNodeTitle-->" + holdingsNode.getData().getTitle());
67 LOG.info("Series-holdingsNodeSelected-->" + documentTreeNode.isSelect());
68 if (documentTreeNode.isSelect()) {
69 bib.setId(bibNode.getNodeType());
70 selectedBibsList.add(bibNode.getNodeType());
71 selectedBibs.add(bibNode.getNodeType());
72 selectedBibsFromTree1.add(bibNode.getNodeType());
73 bib.setTitle(bibNode.getNodeLabel());
74 tree1BibId = bibNode.getNodeType();
75 analyticsForm.setTree1BibId(tree1BibId);
76 holdings.setId(holdingsNode.getNodeType());
77 selectedInstancesList.add(holdingsNode.getNodeType());
78 selectedHoldings.add(holdingsNode.getNodeType());
79 selectedHoldingsFromTree1.add(holdingsNode.getNodeType());
80 holdings.setLocationName(holdingsNode.getNodeLabel());
81 documentTreeNode.setSelect(true);
82 List<Node<DocumentTreeNode, String>> itemList = holdingsNode.getChildren();
83 for (Node<DocumentTreeNode, String> itemNode : itemList) {
84 Item itemDoc = new Item();
85 documentTreeNode = itemNode.getData();
86 LOG.info("Series-itemId-->" + holdingsNode.getNodeType());
87 LOG.info("Series-itemNodeTitle-->" + holdingsNode.getData().getTitle());
88 LOG.info("Series-itemNodeSelected-->" + documentTreeNode.isSelect());
89 itemDoc.setId(itemNode.getNodeType());
90 itemDoc.setCallNumber(itemNode.getNodeLabel());
91 items.add(itemDoc);
92 }
93 holdingsTree.getItems().addAll(items);
94 holdingsTree.setHoldings(holdings);
95 bibTree.getHoldingsTrees().add(holdingsTree);
96 bibTree.setBib(bib);
97 analyticsForm.setBibTree(bibTree);
98 analyticsForm.setSelectedBibsList(selectedBibsList);
99 analyticsForm.setSelectedInstancesList(selectedInstancesList);
100 analyticsForm.setSelectedBibs(selectedBibs);
101 analyticsForm.setSelectedHoldings(selectedHoldings);
102 analyticsForm.setSelectedBibsFromTree1(selectedBibs);
103 analyticsForm.setSelectedHoldingsFromTree1(selectedHoldings);
104 }
105 }
106 }
107 }
108 }
109
110 public void selectCheckedNodesForAnalyticTree(AnalyticsForm analyticsForm, Node<DocumentTreeNode, String> analyticsTreeRootElement) {
111 DocumentTreeNode documentTreeNode;
112 BibTree bibTree = new BibTree();
113 HoldingsTree holdingsTree = new HoldingsTree();
114 Holdings holdings = new Holdings();
115 List<Item> items = new ArrayList<Item>();
116 Set<String> selectedItemsList = new HashSet<String>();
117 ArrayList<String> setSelectedBibsFromTree2 = new ArrayList<String>();
118 ArrayList<String> setSelectedItemsFromTree2 = new ArrayList<String>();
119 ArrayList<String> selectedItems = new ArrayList<String>();
120 if (analyticsTreeRootElement != null) {
121 List<Node<DocumentTreeNode, String>> analyticTreeList = analyticsTreeRootElement.getChildren();
122 for (Node<DocumentTreeNode, String> bibNode : analyticTreeList) {
123 documentTreeNode = bibNode.getData();
124 LOG.info("Analytic-bibId-->" + bibNode.getNodeType());
125 LOG.info("Analytic-bibNodeTitle-->" + bibNode.getData().getTitle());
126 LOG.info("Analytic-bibNodeSelected-->" + documentTreeNode.isSelect());
127 List<Node<DocumentTreeNode, String>> holdingsList = bibNode.getChildren();
128 for (Node<DocumentTreeNode, String> holdingsNode : holdingsList) {
129 documentTreeNode = holdingsNode.getData();
130 LOG.info("Analytic-holdingsId-->" + holdingsNode.getNodeType());
131 LOG.info("Analytic-holdingsNodeTitle-->" + holdingsNode.getData().getTitle());
132 LOG.info("Analytic-holdingsNodeSelected-->" + documentTreeNode.isSelect());
133 holdings.setId(holdingsNode.getNodeType());
134 holdings.setLocationName(holdingsNode.getNodeLabel());
135 List<Node<DocumentTreeNode, String>> itemList = holdingsNode.getChildren();
136 for (Node<DocumentTreeNode, String> itemNode : itemList) {
137 Item item = new Item();
138 documentTreeNode = itemNode.getData();
139 LOG.info("Analytic-itemId-->" + holdingsNode.getNodeType());
140 LOG.info("Analytic-itemNodeTitle-->" + holdingsNode.getData().getTitle());
141 LOG.info("Analytic-itemNodeSelected-->" + documentTreeNode.isSelect());
142 if (documentTreeNode.isSelect()) {
143 item.setId(itemNode.getNodeType());
144 item.setCallNumber(itemNode.getNodeLabel());
145 items.add(item);
146 if (!setSelectedItemsFromTree2.contains(itemNode.getNodeType())) {
147 setSelectedItemsFromTree2.add(itemNode.getNodeType());
148 }
149 selectedItems.add(itemNode.getNodeType());
150 selectedItemsList.add(itemNode.getNodeType());
151 documentTreeNode.setSelect(true);
152 }
153 }
154 analyticsForm.setSelectedItems(selectedItems);
155 analyticsForm.setSelectedItemsFromTree2(setSelectedItemsFromTree2);
156 analyticsForm.setSelectedItemsList(selectedItemsList);
157 }
158 }
159 }
160 }
161
162 public void getAnalyticsSummaryByItemId(AnalyticsForm analyticsForm, String itemId) throws Exception {
163 Item item = getDocstoreClientLocator().getDocstoreClient().retrieveItem(itemId);
164 if (item != null) {
165 if (!CollectionUtils.isEmpty(item.getHoldings())) {
166 for (Holdings holdings : item.getHoldings()) {
167 if (holdings.isSeries()) {
168 getAnalyticsSummaryByHoldingsId(analyticsForm, holdings.getId());
169 }
170 }
171 }
172 }
173 }
174
175 public void getAnalyticsSummaryByHoldingsId(AnalyticsForm analyticsForm, String holdingsId) throws Exception {
176 DocumentSelectionTree documentSelectionTree = new DocumentSelectionTree();
177 Node<DocumentTreeNode, String> seriesRootNode = null;
178 Node<DocumentTreeNode, String> analyticRootNode = null;
179 List<String> bibUuidList = new ArrayList<String>();
180 List<String> holdingsUuidList = new ArrayList<String>();
181 HoldingsTree holdingsTree = getDocstoreClientLocator().getDocstoreClient().retrieveHoldingsTree(holdingsId);
182 if (holdingsTree.getHoldings().isSeries()) {
183 bibUuidList.add(holdingsTree.getHoldings().getBib().getId());
184 seriesRootNode = documentSelectionTree.add(bibUuidList, org.kuali.ole.docstore.model.enums.DocType.BIB.getDescription(), true);
185 analyticsForm.getLeftTree().setRootElement(seriesRootNode);
186 analyticsForm.setShowSeriesTree(true);
187 bibUuidList.clear();
188 for (Item item : holdingsTree.getItems()) {
189 if (!holdingsId.equalsIgnoreCase(item.getHolding().getId())) {
190 if (!holdingsUuidList.contains(item.getHolding().getId())) {
191 if (!bibUuidList.contains(item.getHolding().getBib().getId())) {
192 bibUuidList.add(item.getHolding().getBib().getId());
193 }
194 holdingsUuidList.add(item.getHolding().getId());
195 }
196 }
197 }
198 if (!CollectionUtils.isEmpty(bibUuidList)) {
199 DocumentSelectionTree documentSelectionTree1 = new DocumentSelectionTree();
200 analyticRootNode = documentSelectionTree1.add(bibUuidList, org.kuali.ole.docstore.model.enums.DocType.BIB.getDescription(), true);
201 if (analyticRootNode != null) {
202 analyticsForm.getRightTree().setRootElement(analyticRootNode);
203 analyticsForm.setShowAnalyticsTree(true);
204 }
205 }
206 } else {
207 analyticsForm.setShowSeriesTree(false);
208 analyticsForm.setShowAnalyticsTree(false);
209 }
210 }
211
212 public Boolean validateInputForAnalytics(AnalyticsForm analyticsForm, String createOrBreak) throws Exception {
213 DocumentTreeNode documentTreeNode;
214 boolean isSeriesBibSelected = false, isSeriesHoldingsSelected = false, isSeriesItemSelected = false;
215 boolean isAnalyticBibSelected = false, isAnalyticHoldingsSelected = false, isAnalyticItemSelected = false;
216 Tree<DocumentTreeNode, String> leftTree = analyticsForm.getLeftTree();
217 Tree<DocumentTreeNode, String> rightTree = analyticsForm.getRightTree();
218 Node<DocumentTreeNode, String> leftTreeRootElement = leftTree.getRootElement();
219 Node<DocumentTreeNode, String> rightTreeRootElement = rightTree.getRootElement();
220
221 if (leftTreeRootElement == null && rightTreeRootElement == null) {
222 GlobalVariables.getMessageMap().putErrorForSectionId(OLEConstants.ANALYTICS_SELECTION_SECTION, OLEConstants.ERROR_SELECT_SERIES_AND_ANALYTICS);
223 } else if (leftTreeRootElement != null && rightTreeRootElement == null) {
224 GlobalVariables.getMessageMap().putErrorForSectionId(OLEConstants.ANALYTICS_SELECTION_SECTION, OLEConstants.ERROR_SELECT_ANALYTICS);
225 } else if (leftTreeRootElement == null && rightTreeRootElement != null) {
226 GlobalVariables.getMessageMap().putErrorForSectionId(OLEConstants.ANALYTICS_SELECTION_SECTION, OLEConstants.ERROR_SELECT_SERIES);
227 } else if (leftTreeRootElement != null && rightTreeRootElement != null) {
228 List<Node<DocumentTreeNode, String>> leftList = leftTree.getRootElement().getChildren();
229 List<Node<DocumentTreeNode, String>> rightList = rightTree.getRootElement().getChildren();
230 if (CollectionUtils.isEmpty(leftList) && CollectionUtils.isEmpty(rightList)) {
231 GlobalVariables.getMessageMap().putErrorForSectionId(OLEConstants.ANALYTICS_SELECTION_SECTION, OLEConstants.ERROR_SELECT_SERIES_AND_ANALYTICS);
232 } else if (!CollectionUtils.isEmpty(leftList) && CollectionUtils.isEmpty(rightList)) {
233 GlobalVariables.getMessageMap().putErrorForSectionId(OLEConstants.ANALYTICS_SELECTION_SECTION, OLEConstants.ERROR_SELECT_ANALYTICS);
234 } else if (CollectionUtils.isEmpty(leftList) && !CollectionUtils.isEmpty(rightList)) {
235 GlobalVariables.getMessageMap().putErrorForSectionId(OLEConstants.ANALYTICS_SELECTION_SECTION, OLEConstants.ERROR_SELECT_SERIES);
236 } else if (!CollectionUtils.isEmpty(leftList) && !CollectionUtils.isEmpty(rightList)) {
237 if (createOrBreak.equalsIgnoreCase(OLEConstants.CREATE_ANALYTICS)) {
238 for (Node<DocumentTreeNode, String> bibNode : leftList) {
239 documentTreeNode = bibNode.getData();
240 LOG.info("bibNode-->" + documentTreeNode.isSelect());
241 if (documentTreeNode.isSelect()) {
242 isSeriesBibSelected = true;
243 }
244 List<Node<DocumentTreeNode, String>> holdingsList = bibNode.getChildren();
245 for (Node<DocumentTreeNode, String> holdingsNode : holdingsList) {
246 documentTreeNode = holdingsNode.getData();
247 LOG.info("holdingsNode-->" + documentTreeNode.isSelect());
248 if (documentTreeNode.isSelect()) {
249 isSeriesHoldingsSelected = true;
250 }
251 List<Node<DocumentTreeNode, String>> itemList = holdingsNode.getChildren();
252 for (Node<DocumentTreeNode, String> itemNode : itemList) {
253 documentTreeNode = itemNode.getData();
254 LOG.info("itemNode-->" + documentTreeNode.isSelect());
255 if (documentTreeNode.isSelect()) {
256 isSeriesItemSelected = true;
257 }
258 }
259 }
260 }
261 if (isSeriesBibSelected || isSeriesItemSelected) {
262 GlobalVariables.getMessageMap().putErrorForSectionId(OLEConstants.ANALYTICS_SELECTION_SECTION, OLEConstants.ERROR_SELECT_ONLY_HOLDINGS);
263 } else if (!isSeriesHoldingsSelected) {
264 GlobalVariables.getMessageMap().putErrorForSectionId(OLEConstants.ANALYTICS_SELECTION_SECTION, OLEConstants.ERROR_SELECT_ONE_HOLDINGS);
265 }
266 }
267
268 BibTree bibTree = null;
269 List<String> analyticItemIds = new ArrayList<>();
270 if (createOrBreak.equalsIgnoreCase(OLEConstants.BREAK_ANALYTICS)) {
271 String bibId = null;
272 bibId = leftList.get(0).getNodeType();
273 bibTree = getDocstoreClientLocator().getDocstoreClient().retrieveBibTree(bibId);
274 analyticItemIds = getAnalyticItemIdsByBibTree(bibTree);
275 }
276
277 StringBuffer itemLabelsBuffer = new StringBuffer();
278 for (Node<DocumentTreeNode, String> bibNode : rightList) {
279 documentTreeNode = bibNode.getData();
280 LOG.info("bibNode-->" + documentTreeNode.isSelect());
281 if (documentTreeNode.isSelect()) {
282 isAnalyticBibSelected = true;
283 }
284 List<Node<DocumentTreeNode, String>> holdingsList = bibNode.getChildren();
285 for (Node<DocumentTreeNode, String> holdingsNode : holdingsList) {
286 documentTreeNode = holdingsNode.getData();
287 LOG.info("holdingsNode-->" + documentTreeNode.isSelect());
288 if (documentTreeNode.isSelect()) {
289 isAnalyticHoldingsSelected = true;
290 }
291 List<Node<DocumentTreeNode, String>> itemList = holdingsNode.getChildren();
292 for (Node<DocumentTreeNode, String> itemNode : itemList) {
293 documentTreeNode = itemNode.getData();
294 LOG.info("itemNode-->" + documentTreeNode.isSelect());
295 if (documentTreeNode.isSelect()) {
296 isAnalyticItemSelected = true;
297 if (createOrBreak.equalsIgnoreCase(OLEConstants.BREAK_ANALYTICS)) {
298 String itemLabel = validateAnalyticRelatedItem(analyticItemIds, itemNode);
299 if (StringUtils.isNotBlank(itemLabel)) {
300 if (StringUtils.isBlank(itemLabelsBuffer.toString())) {
301 itemLabelsBuffer.append("\n");
302 }
303 itemLabelsBuffer.append(itemLabel).append("\n");
304 }
305 } else {
306 if (isAnalytic(itemNode.getNodeType())) {
307 itemLabelsBuffer.append(itemNode.getNodeLabel());
308 }
309 }
310 }
311 }
312 }
313 }
314 if (isAnalyticBibSelected || isAnalyticHoldingsSelected) {
315 GlobalVariables.getMessageMap().putErrorForSectionId(OLEConstants.ANALYTICS_SELECTION_SECTION, OLEConstants.ERROR_SELECT_ONLY_ITEMS);
316 } else if (!isAnalyticItemSelected) {
317 GlobalVariables.getMessageMap().putErrorForSectionId(OLEConstants.ANALYTICS_SELECTION_SECTION, OLEConstants.ERROR_SELECT_ONE_ITEM);
318 } else if (StringUtils.isNotBlank(itemLabelsBuffer.toString()) && !isAnalyticBibSelected && !isAnalyticHoldingsSelected) {
319 if (createOrBreak.equalsIgnoreCase(OLEConstants.BREAK_ANALYTICS)) {
320 GlobalVariables.getMessageMap().putErrorForSectionId(OLEConstants.ANALYTICS_SELECTION_SECTION, OLEConstants.ERROR_SELECT_ITEM_NOT_ANALYTIC);
321 } else {
322 GlobalVariables.getMessageMap().putErrorForSectionId(OLEConstants.ANALYTICS_SELECTION_SECTION, OLEConstants.ERROR_SELECT_ITEM_IN_ANALYTIC_RELATION);
323 }
324 }
325 }
326 }
327
328 int errorCount = GlobalVariables.getMessageMap().getErrorCount();
329 if (errorCount > 0) {
330 return false;
331 } else {
332 return true;
333 }
334 }
335
336 public boolean isAnalytic(String itemId) throws Exception {
337 boolean isAnalytic = false;
338 if (StringUtils.isNotBlank(itemId)) {
339 Item item = getDocstoreClientLocator().getDocstoreClient().retrieveItem(itemId);
340 if (item.isAnalytic()) {
341 isAnalytic = true;
342 }
343 }
344 return isAnalytic;
345 }
346
347 public List<String> getAnalyticItemIdsByBibTree(BibTree bibTree) {
348 List<String> analyticItemIdList = new ArrayList<>();
349 if (bibTree != null) {
350 if (!CollectionUtils.isEmpty(bibTree.getHoldingsTrees())) {
351 for (HoldingsTree holdingsTree : bibTree.getHoldingsTrees()) {
352 if (!CollectionUtils.isEmpty(holdingsTree.getItems())) {
353 for (Item item : holdingsTree.getItems()) {
354 if (item.isAnalytic()) {
355 if (!analyticItemIdList.contains(item.getId())) {
356 analyticItemIdList.add(item.getId());
357 }
358 }
359 }
360 }
361 }
362 }
363 }
364 return analyticItemIdList;
365 }
366
367 public String validateAnalyticRelatedItem(List<String> analyticItemIds, Node<DocumentTreeNode, String> item) {
368 String itemLabel = null;
369 if (!CollectionUtils.isEmpty(analyticItemIds)) {
370 if (!analyticItemIds.contains(item.getNodeType())) {
371 itemLabel = item.getNodeLabel();
372 }
373 }
374 return itemLabel;
375 }
376
377
378 }