1 package org.argeo.tracker.ui.controls;
2
3 import java.util.ArrayList;
4 import java.util.LinkedHashMap;
5 import java.util.List;
6 import java.util.Map;
7 import java.util.stream.Collectors;
8
9 import javax.jcr.Node;
10 import javax.jcr.NodeIterator;
11 import javax.jcr.Property;
12 import javax.jcr.RepositoryException;
13 import javax.jcr.Session;
14 import javax.jcr.query.QueryResult;
15
16 import org.argeo.connect.ui.widgets.ConnectAbstractDropDown;
17 import org.argeo.connect.util.XPathUtils;
18 import org.argeo.tracker.TrackerException;
19 import org.argeo.tracker.TrackerTypes;
20 import org.eclipse.swt.widgets.Text;
21
22
23 public class ProjectDropDown extends ConnectAbstractDropDown {
24
25 private final Session session;
26 private final boolean onlyItProject;
27 private final Map<String, Node> knownProjects = new LinkedHashMap<>();
28 private Map<String, Node> filteredProjects;
29
30 public ProjectDropDown(Session session, Text text, boolean onlyItProjects) {
31 super(text);
32 this.session = session;
33 this.onlyItProject = onlyItProjects;
34 populateProjectList();
35 init();
36 }
37
38 protected void populateProjectList() {
39 try {
40 knownProjects.clear();
41 StringBuilder builder = new StringBuilder();
42 builder.append("//element(*, ");
43 if (onlyItProject)
44 builder.append(TrackerTypes.TRACKER_IT_PROJECT);
45 else
46 builder.append(TrackerTypes.TRACKER_PROJECT);
47 builder.append(")");
48 builder.append(" order by @").append(Property.JCR_TITLE);
49 QueryResult result = XPathUtils.createQuery(session, builder.toString()).execute();
50 NodeIterator nIt = result.getNodes();
51 while (nIt.hasNext()) {
52 Node currProj = nIt.nextNode();
53 knownProjects.put(currProj.getProperty(Property.JCR_TITLE).getString(), currProj);
54 }
55 } catch (RepositoryException e) {
56 throw new TrackerException("Unable to get projects for session " + session.getUserID(), e);
57 }
58 }
59
60 @Override
61 protected List<String> getFilteredValues(String filter) {
62 filteredProjects = knownProjects.entrySet().stream()
63 .filter(p -> p.getKey().toLowerCase().indexOf(filter.toLowerCase()) >= 0)
64 .collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));
65 List<String> res = new ArrayList<>();
66 res.addAll(filteredProjects.keySet());
67 return res;
68 }
69
70 public Node getChosenProject() {
71 return knownProjects.get(getText());
72 }
73 }