1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package cz.zcu.mre.sparkle.gui.query.autoComplete;
21
22 import cz.zcu.mre.sparkle.data.PrefixesStorage;
23 import cz.zcu.mre.sparkle.data.StorageEntry;
24 import cz.zcu.mre.sparkle.gui.query.QueryFormPane;
25 import cz.zcu.mre.sparkle.gui.query.other.TypedTextField;
26 import cz.zcu.mre.sparkle.tools.Definitions;
27 import cz.zcu.mre.sparkle.tools.Utils;
28 import cz.zcu.mre.sparkle.tools.sparqlValidation.SparqlValidationUtils;
29 import javafx.collections.FXCollections;
30 import javafx.collections.ObservableList;
31 import javafx.scene.control.TextField;
32 import java.util.List;
33 import java.util.Set;
34 import java.util.stream.Collectors;
35
36
37
38
39
40
41
42
43
44 public class ExpressionAutoCompleteListHandler
45 implements AutoCompleteListHandler {
46
47 private final QueryFormPane<?> queryFormPane;
48
49 public ExpressionAutoCompleteListHandler(final QueryFormPane<?> queryFormPane) {
50 this.queryFormPane = queryFormPane;
51 }
52
53 @Override
54 public PrefixesStorage getPrefixesStorage() {
55 return queryFormPane.getQueryPrefixesStorage();
56 }
57
58 @Override
59 public ObservableList<Object> getAutoCompleteList(final TextField textField) {
60
61 final String text = textField.getText().substring(0, textField.getCaretPosition());
62 final int lastVariableStartIndex = text.lastIndexOf(Definitions.VARIABLE_PREFIX);
63 final int lastPrefixDelimiterIndex = text.lastIndexOf(Definitions.PREFIXED_NAME_PREFIX_DELIMITER);
64
65
66 if (lastVariableStartIndex > lastPrefixDelimiterIndex) {
67 ObservableList<Object> variablesList = getVariablesList(text, lastVariableStartIndex);
68 if (variablesList != null) {
69 return variablesList;
70 }
71 }
72
73 if ((lastPrefixDelimiterIndex > lastVariableStartIndex)) {
74
75 return getFunctionsWithPrefixAndResources(text, lastPrefixDelimiterIndex);
76 }
77
78
79 final ObservableList<Object> functionsList = getFunctionsAndResourcesWithoutPrefix();
80
81 int pos = text.length() - 1;
82 String part = null;
83
84 while (pos >= 0) {
85 final String tempPart = text.substring(pos);
86 if (SparqlValidationUtils.isPrefixOrLocalNameValid(tempPart)) {
87 part = tempPart;
88 } else {
89 break;
90 }
91 pos--;
92 }
93
94 if (part == null) {
95 return functionsList;
96 }
97
98 final String constPart = part;
99
100
101 return functionsList.filtered((t) -> Utils
102 .stringStartsWithIgnoreCase(AutoCompleteWrapper.getIRI(t, getPrefixesStorage()), constPart));
103 }
104
105
106
107
108
109
110 private ObservableList<Object> getFunctionsAndResourcesWithoutPrefix() {
111 final Set<String> prefixesSet = queryFormPane.getQueryPrefixesStorage().getPrefixesUsed(true);
112 List<StorageEntry> storageEntryStream = prefixesSet.stream().map(p -> new StorageEntry(null, p, "")).collect(
113 Collectors.toList());
114
115 final ObservableList<Object> prefixesList = FXCollections.observableArrayList(storageEntryStream);
116
117
118 final ObservableList<Object> functionsList = queryFormPane.getQueryFunctionsStorage().getUnprefixedFunctionNames();
119
120
121 functionsList.addAll(functionsList.size(), prefixesList);
122 return functionsList;
123 }
124
125
126
127
128
129
130
131
132
133 private ObservableList<Object> getVariablesList(final String text, final int lastVariableStartIndex) {
134
135 final String variablePart = text.substring(lastVariableStartIndex + 1);
136 if (variablePart.isEmpty()) {
137 return Utils.getObjectList(queryFormPane.getSortedVariables());
138 }
139
140 if (SparqlValidationUtils.isVariableNameValid(variablePart)) {
141 return Utils.getObjectList(queryFormPane
142 .getSortedVariables()
143 .filtered((t) -> Utils.stringStartsWithIgnoreCase(t, variablePart)));
144 }
145
146 return null;
147 }
148
149
150
151
152
153
154
155
156
157 private ObservableList<Object> getFunctionsWithPrefixAndResources(final String text,
158 final int lastPrefixDelimiterIndex) {
159
160 int prefixPartPos = lastPrefixDelimiterIndex;
161 String prefixPart = null;
162 while (--prefixPartPos > -1) {
163 final String _prefixPart = text.substring(prefixPartPos, lastPrefixDelimiterIndex);
164 if (!SparqlValidationUtils.isPrefixNameValid(_prefixPart)) {
165 break;
166 }
167 prefixPart = _prefixPart;
168 }
169
170 if (prefixPart == null) {
171 return FXCollections.emptyObservableList();
172 }
173
174 final ObservableList<String> functions
175 = queryFormPane.getQueryFunctionsStorage().getFunctionsNamesByPrefix(prefixPart, false);
176
177
178 final ObservableList<String> resources
179 = queryFormPane.getQueryResourcesStorage().getResourcesNamesByPrefix(prefixPart, false);
180
181
182 functions.addAll(resources);
183
184 if (((lastPrefixDelimiterIndex + 1) == text.length()) || functions.isEmpty()) {
185 return Utils.getObjectList(functions);
186 }
187 final String termPart = text.substring(lastPrefixDelimiterIndex + 1);
188
189
190 return Utils.getObjectList(functions.filtered((t) -> Utils.stringStartsWithIgnoreCase(t, termPart)));
191 }
192
193 }