View Javadoc
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   * Created with IntelliJ IDEA.
24   * User: rajeshbabuk
25   * Date: 3/19/14
26   * Time: 7:30 PM
27   * To change this template use File | Settings | File Templates.
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 }