View Javadoc
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  /** Simple DropDown that displays the list of known project */
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  }