testautoa 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. data/Rakefile +7 -7
  2. data/bin/calabash-android +8 -1
  3. data/bin/calabash-android-build.rb +1 -1
  4. data/bin/calabash-android-console.rb +4 -4
  5. data/bin/calabash-android-run.rb +2 -10
  6. data/bin/testautoa +461 -0
  7. data/calabash-android.gemspec +3 -1
  8. data/features-skeleton/support/app_life_cycle_hooks.rb +0 -1
  9. data/irbrc +3 -1
  10. data/lib/calabash-android/helpers.rb +45 -17
  11. data/lib/calabash-android/lib/TestServer.apk +0 -0
  12. data/lib/calabash-android/lib/unsign.jar +0 -0
  13. data/lib/calabash-android/operations.rb +150 -66
  14. data/lib/calabash-android/steps/list_steps.rb +1 -1
  15. data/lib/calabash-android/steps/time_picker_steps.rb +1 -1
  16. data/lib/calabash-android/touch_helpers.rb +9 -0
  17. data/lib/calabash-android/version.rb +1 -1
  18. data/lib/calabash-android/wait_helpers.rb +93 -0
  19. data/test-server/AndroidManifest.xml +2 -0
  20. data/test-server/build.xml +1 -0
  21. data/test-server/instrumentation-backend/.classpath +0 -1
  22. data/test-server/instrumentation-backend/AndroidManifest.xml +1 -1
  23. data/test-server/instrumentation-backend/antlr/UIQuery.g +48 -5
  24. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/Command.java +4 -3
  25. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/FranklyResult.java +95 -0
  26. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/Result.java +7 -1
  27. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/HttpServer.java +14 -29
  28. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/activity/FinishOpenedActivities.java +19 -0
  29. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/activity/GetOpenedActivities.java +31 -0
  30. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/activity/GoBackToActivity.java +67 -0
  31. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/gestures/DragCoordinates.java +28 -0
  32. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/gestures/Swipe.java +11 -5
  33. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/location/FakeGPSLocation.java +13 -10
  34. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/softkey/LeftKey.java +24 -0
  35. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/softkey/RightKey.java +24 -0
  36. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/softkey/UpKey.java +24 -0
  37. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/version/Version.java +31 -0
  38. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/CalabashChromeClient.java +131 -36
  39. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/DumpBodyHtml.java +38 -18
  40. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/DumpHtml.java +38 -16
  41. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/EnterTextByCssSelector.java +94 -66
  42. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/ExecuteAsyncJavascript.java +55 -33
  43. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/ExecuteJavascript.java +53 -31
  44. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/JavaScriptOperation.java +44 -0
  45. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/PressByCssSelector.java +52 -27
  46. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/QueryHelper.java +39 -32
  47. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/ScrollTo.java +56 -41
  48. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/SetPropertyByCssSelector.java +50 -25
  49. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/SetText.java +19 -22
  50. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/CompletedFuture.java +40 -0
  51. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/InvocationOperation.java +222 -0
  52. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/Operation.java +7 -0
  53. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/PropertyOperation.java +56 -0
  54. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/Query.java +151 -43
  55. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/UIQuery.tokens +19 -12
  56. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/UIQueryResultVoid.java +22 -0
  57. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ViewMapper.java +41 -11
  58. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/antlr/UIQueryLexer.java +1010 -242
  59. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/antlr/UIQueryParser.java +406 -98
  60. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/BeginsWithRelation.java +45 -0
  61. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/ComparisonOperator.java +54 -0
  62. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/ContainsRelation.java +41 -0
  63. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/EndsWithRelation.java +42 -0
  64. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/LikeRelation.java +79 -0
  65. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/PartialFutureList.java +100 -0
  66. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryAST.java +1 -1
  67. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryASTClassName.java +54 -25
  68. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryASTPredicate.java +147 -0
  69. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryASTPredicateRelation.java +5 -0
  70. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryASTWith.java +153 -89
  71. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryDirection.java +12 -2
  72. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryEvaluator.java +58 -141
  73. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryUtils.java +162 -7
  74. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/ast/UIQueryVisibility.java +32 -0
  75. metadata +130 -97
  76. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/Query.java +0 -24
  77. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/actions/webview/Touch.java +0 -44
  78. data/test-server/instrumentation-backend/src/sh/calaba/instrumentationbackend/query/antlr/UIQuery.tokens +0 -10
  79. data/test-server/instrumentation-backend/tests/sh/calaba/instrumentationbackend/query/tests/UIQueryTest.java +0 -134
@@ -3,136 +3,200 @@ package sh.calaba.instrumentationbackend.query.ast;
3
3
  import java.lang.reflect.Method;
4
4
  import java.util.ArrayList;
5
5
  import java.util.List;
6
+ import java.util.Map;
7
+ import java.util.concurrent.Callable;
8
+ import java.util.concurrent.Future;
6
9
 
7
10
  import org.antlr.runtime.tree.CommonTree;
8
11
 
9
- import sh.calaba.instrumentationbackend.InstrumentationBackend;
10
- import sh.calaba.instrumentationbackend.query.antlr.UIQueryParser;
12
+ import sh.calaba.instrumentationbackend.actions.webview.QueryHelper;
11
13
  import android.view.View;
14
+ import android.webkit.WebView;
12
15
 
13
16
  public class UIQueryASTWith implements UIQueryAST {
14
- public final String propertyName;
17
+ public final String propertyName;
15
18
  public final Object value;
16
-
17
- public UIQueryASTWith(String property, Object value)
18
- {
19
- if (property == null) {throw new IllegalArgumentException("Cannot instantiate Filter with null property name");}
19
+
20
+ public UIQueryASTWith(String property, Object value) {
21
+ if (property == null) {
22
+ throw new IllegalArgumentException(
23
+ "Cannot instantiate Filter with null property name");
24
+ }
20
25
  this.propertyName = property;
21
26
  this.value = value;
22
27
  }
23
28
 
24
- @SuppressWarnings({ "rawtypes", "unchecked"})
29
+ @SuppressWarnings({ "rawtypes", "unchecked" })
25
30
  @Override
26
- public List evaluateWithViewsAndDirection(List inputViews,
27
- UIQueryDirection direction) {
28
- List result = new ArrayList(8);
29
-
30
- for (int i=0;i<inputViews.size();i++)
31
- {
32
- Object o = inputViews.get(i);
33
- if (this.propertyName.equals("marked") && isMarked(o,this.value))
34
- {
35
- result.add(o);
36
- }
37
- else if (this.propertyName.equals("index") && this.value.equals(i))
38
- {
39
- result.add(o);
40
- }
41
- else
42
- {
43
- Method propertyAccessor = UIQueryUtils.hasProperty(o, this.propertyName);
44
- if (propertyAccessor != null)
45
- {
46
- Object value = UIQueryUtils.getProperty(o, propertyAccessor);
47
- System.out.println(this.value);
48
- System.out.println(value);
49
- System.out.println(this.value.getClass());
50
- System.out.println(this.value.getClass());
51
- System.out.println(value.toString().equals(this.value));
52
- if (value == this.value || (value != null && value.equals(this.value)))
53
- {
54
- result.add(o);
55
- }
56
- else if (this.value instanceof String && this.value.equals(value.toString()))
57
- {
58
- result.add(o);
31
+ public List evaluateWithViews(final List inputViews, final UIQueryDirection direction,
32
+ final UIQueryVisibility visibility) {
33
+
34
+ List queryResult = (List) UIQueryUtils.evaluateSyncInMainThread(new Callable() {
35
+
36
+ @Override
37
+ public Object call() throws Exception {
38
+ List futureResult = new ArrayList(8);
39
+
40
+ for (int i = 0; i < inputViews.size(); i++) {
41
+ Object o = inputViews.get(i);
42
+
43
+ if (o instanceof WebView) {
44
+ Future webResult = evaluateForWebView((WebView) o);
45
+ if (webResult != null) {
46
+ futureResult.add(webResult);
47
+ }
48
+ }
49
+ else if (o instanceof Map) {
50
+ Map result = evaluateForMap((Map) o);
51
+ if (result != null) {
52
+ futureResult.add(result);
53
+ }
54
+
59
55
  }
60
56
  else {
61
- System.out.println(false);
57
+ Object result = evaluateForObject(o, i);
58
+ if (result != null) {
59
+ futureResult.add(result);
60
+ }
62
61
  }
63
-
64
- }
62
+
63
+ }
64
+ List visibilityFilteredResults = visibility.evaluateWithViews(futureResult, direction,
65
+ visibility);
66
+ return new PartialFutureList(visibilityFilteredResults);
65
67
  }
66
-
67
- }
68
+ });
68
69
 
70
+ List processedResult = new ArrayList(queryResult.size());
71
+ for (Object o : queryResult) {
72
+ if (o instanceof Map) {
73
+ Map m = (Map) o;
74
+ if (m.containsKey("result")) {
75
+ processedResult.addAll(UIQueryUtils.mapWebViewJsonResponse((String) m.get("result"),(WebView) m.get("webView")));
76
+ }
77
+ else {
78
+ processedResult.add(m);
79
+ }
80
+
81
+ }
82
+ else {
83
+ processedResult.add(o);
84
+ }
85
+ }
86
+ return processedResult;
69
87
 
70
- return result;
88
+
89
+ }
90
+
91
+
92
+ @SuppressWarnings("rawtypes")
93
+ private Map evaluateForMap(Map map) {
94
+ if (map.containsKey(this.propertyName)) {
95
+ Object value = map.get(this.propertyName);
96
+ if (value == this.value || (value != null && value.equals(this.value))) {
97
+ return map;
98
+ }
99
+ }
100
+ return null;
101
+ }
102
+
103
+ private Object evaluateForObject(Object o, int index) {
104
+ if (this.propertyName.equals("id") && hasId(o, this.value)) {
105
+ return o;
106
+ } else if (this.propertyName.equals("marked")
107
+ && isMarked(o, this.value)) {
108
+ return o;
109
+ } else if (this.propertyName.equals("index")
110
+ && this.value.equals(index)) {
111
+ return o;
112
+ } else {
113
+
114
+ Method propertyAccessor = UIQueryUtils.hasProperty(o,
115
+ this.propertyName);
116
+ if (propertyAccessor != null) {
117
+ Object value = UIQueryUtils.getProperty(o, propertyAccessor);
118
+
119
+ if (value == this.value
120
+ || (value != null && value.equals(this.value))) {
121
+ return o;
122
+ } else if (this.value instanceof String
123
+ && this.value.equals(value.toString())) {
124
+ return o;
125
+ }
126
+ }
127
+ }
128
+ return null;
129
+
130
+ }
131
+
132
+ @SuppressWarnings({ "rawtypes" })
133
+ private Future evaluateForWebView(WebView o) {
134
+ if (!(this.value instanceof String)) {
135
+ return null;
136
+ }
137
+ return QueryHelper.executeAsyncJavascriptInWebviews(o,
138
+ "calabash.js", (String) this.value,this.propertyName);
139
+
140
+ }
141
+
142
+ private boolean hasId(Object o, Object expectedValue) {
143
+ if (!(o instanceof View)) {
144
+ return false;
145
+ }
146
+ if (!(expectedValue instanceof String)) {
147
+ return false;
148
+ }
149
+ View view = (View) o;
150
+ String expected = (String) expectedValue;
151
+ String id = UIQueryUtils.getId(view);
152
+ return (id != null && id.equals(expected));
71
153
  }
72
154
 
73
155
  private boolean isMarked(Object o, Object expectedValue) {
74
- if (! (o instanceof View)) { return false; }
75
- if (! (expectedValue instanceof String)) { return false; }
156
+ if (!(o instanceof View)) {
157
+ return false;
158
+ }
159
+ if (!(expectedValue instanceof String)) {
160
+ return false;
161
+ }
76
162
  View view = (View) o;
77
163
  String expected = (String) expectedValue;
78
-
79
- String id = InstrumentationBackend.solo.getCurrentActivity()
80
- .getResources().getResourceEntryName(view.getId());
81
-
82
- if (id != null && id.equals(expected)) {
164
+
165
+ if (hasId(o, expectedValue)) {
83
166
  return true;
84
167
  }
85
-
86
- CharSequence contentDescription = view.getContentDescription();
87
- if (contentDescription != null && contentDescription.toString().equals(expected))
88
- {
168
+
169
+ CharSequence contentDescription = view.getContentDescription();
170
+ if (contentDescription != null
171
+ && contentDescription.toString().equals(expected)) {
89
172
  return true;
90
173
  }
91
-
174
+
92
175
  try {
93
176
  Method getTextM = view.getClass().getMethod("getText");
94
177
  Object text = getTextM.invoke(view);
95
- if (text != null && text.toString().equals(expected))
96
- {
178
+ if (text != null && text.toString().equals(expected)) {
97
179
  return true;
98
180
  }
99
-
100
- } catch (Exception e) {}
101
-
181
+
182
+ } catch (Exception e) {
183
+ }
184
+
102
185
  return false;
186
+
103
187
  }
104
188
 
105
189
  public static UIQueryASTWith fromAST(CommonTree step) {
106
190
  CommonTree prop = (CommonTree) step.getChild(0);
107
191
  CommonTree val = (CommonTree) step.getChild(1);
108
192
 
109
- switch(val.getType())
110
- {
111
- case UIQueryParser.STRING: {
112
- String textWithPings = val.getText();
113
- String text = textWithPings.substring(1, textWithPings.length()-1);
114
- return new UIQueryASTWith(prop.getText(), text);
115
- }
116
- case UIQueryParser.INT:
117
- return new UIQueryASTWith(prop.getText(), Integer.parseInt(val.getText(), 10));
118
- case UIQueryParser.BOOL:{
119
- String text = val.getText();
120
- return new UIQueryASTWith(prop.getText(), Boolean.parseBoolean(text));
121
- }
122
- case UIQueryParser.NIL:
123
- return new UIQueryASTWith(prop.getText(), null);
124
-
125
- default:
126
- throw new IllegalArgumentException("Unable to parse value type:" + val.getType()+ " text "+val.getText());
127
-
128
- }
129
-
193
+ Object parsedVal = UIQueryUtils.parseValue(val);
194
+ return new UIQueryASTWith(prop.getText(), parsedVal);
130
195
  }
131
-
132
-
196
+
133
197
  @Override
134
198
  public String toString() {
135
- return "With["+this.propertyName+":"+this.value+"]";
199
+ return "With[" + this.propertyName + ":" + this.value + "]";
136
200
  }
137
-
201
+
138
202
  }
@@ -1,5 +1,15 @@
1
1
  package sh.calaba.instrumentationbackend.query.ast;
2
2
 
3
- public enum UIQueryDirection {
4
- DESCENDANT, CHILD, PARENT, ANCESTOR, SIBLING;
3
+ import java.util.List;
4
+
5
+ public enum UIQueryDirection implements UIQueryAST {
6
+ DESCENDANT, CHILD, PARENT, SIBLING;
7
+
8
+ @SuppressWarnings("rawtypes")
9
+ @Override
10
+ public List evaluateWithViews(List inputViews, UIQueryDirection direction,
11
+ UIQueryVisibility visibility) {
12
+ //Never called. Not so pretty, I know.
13
+ throw new UnsupportedOperationException("This method should never be called");
14
+ }
5
15
  }
@@ -1,122 +1,72 @@
1
1
  package sh.calaba.instrumentationbackend.query.ast;
2
2
 
3
- import java.io.IOException;
4
- import java.lang.reflect.Method;
5
3
  import java.util.ArrayList;
6
- import java.util.Collections;
7
- import java.util.HashMap;
8
4
  import java.util.List;
9
- import java.util.Map;
10
5
 
11
- import org.antlr.runtime.ANTLRStringStream;
12
- import org.antlr.runtime.CommonTokenStream;
13
- import org.antlr.runtime.RecognitionException;
14
- import org.antlr.runtime.tree.CommonTree;
15
-
16
- import sh.calaba.instrumentationbackend.query.antlr.UIQueryLexer;
17
- import sh.calaba.instrumentationbackend.query.antlr.UIQueryParser;
18
- import sh.calaba.org.codehaus.jackson.map.ObjectMapper;
6
+ import sh.calaba.instrumentationbackend.query.Operation;
7
+ import sh.calaba.instrumentationbackend.query.UIQueryResultVoid;
8
+ import sh.calaba.instrumentationbackend.query.ViewMapper;
19
9
 
20
10
  public class UIQueryEvaluator {
21
-
22
- private static class UIQueryResultVoid {
23
- public static final UIQueryResultVoid instance = new UIQueryResultVoid();
11
+
12
+ @SuppressWarnings({ "rawtypes" })
13
+ public static List evaluateQueryWithOptions(List<UIQueryAST> query, List inputViews,
14
+ List<Operation> operations) {
24
15
 
25
- private UIQueryResultVoid() {}
26
-
27
- @SuppressWarnings({ "rawtypes", "unchecked" })
28
- public String asJSON(String methodName, Object receiver) {
29
- ObjectMapper mapper = new ObjectMapper();
30
-
31
- try {
32
- Map map = new HashMap();
33
- map.put("error","Unable to invoke method");
34
- map.put("methodName",methodName);
35
- map.put("receiverClass", receiver.getClass().getName());
36
- map.put("receiverString",receiver.toString());
37
- return mapper.writeValueAsString(map);
38
- } catch (IOException e) {
39
- throw new RuntimeException("Could not convert result to json",e);
40
- }
41
- }
16
+ long before = System.currentTimeMillis();
17
+
18
+ List views = evaluateQueryForPath(query, inputViews);
19
+
20
+ long after = System.currentTimeMillis();
21
+ String action = "EvaluateQuery";
22
+ System.out.println(action+ " took: "+ (after-before) + "ms");
23
+
24
+ before = System.currentTimeMillis();
25
+
26
+ List result = applyOperations(views, operations);
27
+
28
+ after = System.currentTimeMillis();
29
+ action = "ApplyOperations";
30
+ System.out.println(action+ " took: "+ (after-before) + "ms");
31
+
32
+ before = System.currentTimeMillis();
33
+
34
+ List finalResult = mapViews(result);
35
+
36
+ after = System.currentTimeMillis();
37
+ action = "MapViews";
38
+ return finalResult;
39
+ }
42
40
 
43
- @SuppressWarnings({ "rawtypes", "unchecked" })
44
- public Object asJSON(String methodName, Object receiver,String errorMessage) {
45
- ObjectMapper mapper = new ObjectMapper();
46
41
 
47
- try {
48
- Map map = new HashMap();
49
- map.put("error",errorMessage);
50
- map.put("methodName",methodName);
51
- map.put("receiverClass", receiver.getClass().getName());
52
- map.put("receiverString",receiver.toString());
53
- return mapper.writeValueAsString(map);
54
- } catch (IOException e) {
55
- throw new RuntimeException("Could not convert result to json",e);
56
- }
42
+ @SuppressWarnings({ "unchecked", "rawtypes" })
43
+ public static List mapViews(List result) {
44
+ List finalResult = new ArrayList(result.size());
45
+ for (Object o : result) {
46
+ finalResult.add(ViewMapper.mapView(o));
57
47
  }
48
+ return finalResult;
58
49
  }
59
50
 
60
- @SuppressWarnings({ "rawtypes" })
61
- public static List evaluateQuery(String query, List inputViews) {
62
- return evaluateQueryForPath(parseQuery(query), inputViews);
63
- }
64
51
 
65
52
  @SuppressWarnings({ "rawtypes", "unchecked" })
66
- public static List evaluateQueryWithOptions(String query, List inputViews,
67
- List options) {
68
- List views = evaluateQueryForPath(parseQuery(query), inputViews);
69
-
53
+ public static List applyOperations(List views, List<Operation> operations) {
70
54
  List result = views;
71
- for (Object methodNameObj : options) {
72
- String propertyName = (String) methodNameObj;
73
- List nextResult = new ArrayList(views.size());
74
- for (Object o : result) {
55
+ for(Operation op : operations) {
56
+ List nextResult = new ArrayList(result.size());
57
+ for (Object obj : result) {
75
58
  try {
76
- Method m = UIQueryUtils.hasProperty(o, propertyName);
77
- if (m != null) {
78
- nextResult.add(m.invoke(o));
79
- }
80
- else
81
- {
82
- nextResult.add(UIQueryResultVoid.instance.asJSON(propertyName,o,"NO accessor for "+propertyName));
83
- }
84
-
59
+ nextResult.add(op.apply(obj));
85
60
  } catch (Exception e) {
86
- System.out.println(e.getMessage());
87
- nextResult.add(UIQueryResultVoid.instance.asJSON(propertyName,o));
88
- }
61
+ e.printStackTrace();
62
+ nextResult.add(UIQueryResultVoid.instance.asMap(op.getName(), obj, e.getMessage()));
63
+ }
89
64
  }
90
65
  result = nextResult;
91
66
  }
92
67
  return result;
93
-
94
68
  }
95
69
 
96
- @SuppressWarnings("unchecked")
97
- public static List<UIQueryAST> parseQuery(String query) {
98
- UIQueryLexer lexer = new UIQueryLexer(new ANTLRStringStream(query));
99
- UIQueryParser parser = new UIQueryParser(new CommonTokenStream(lexer));
100
-
101
- UIQueryParser.query_return q;
102
- try {
103
- q = parser.query();
104
- } catch (RecognitionException e) {
105
- // TODO Auto-generated catch block
106
- throw new InvalidUIQueryException(e.getMessage());
107
- }
108
- if (q == null) {
109
- throw new InvalidUIQueryException(query);
110
- }
111
- CommonTree rootNode = (CommonTree) q.getTree();
112
- List<CommonTree> queryPath = rootNode.getChildren();
113
-
114
- if (queryPath == null || queryPath.isEmpty()) {
115
- queryPath = Collections.singletonList(rootNode);
116
- }
117
-
118
- return mapUIQueryFromAstNodes(queryPath);
119
- }
120
70
 
121
71
  @SuppressWarnings("rawtypes")
122
72
  private static List evaluateQueryForPath(List<UIQueryAST> queryPath,
@@ -124,59 +74,26 @@ public class UIQueryEvaluator {
124
74
 
125
75
  List currentResult = inputViews;
126
76
  UIQueryDirection currentDirection = UIQueryDirection.DESCENDANT;
77
+ UIQueryVisibility currentVisibility = UIQueryVisibility.VISIBLE;
78
+
127
79
  for (UIQueryAST step : queryPath) {
128
- if (isDirection(step)) {
129
- currentDirection = directionFromAst(step);
130
- } else {
131
- currentResult = step.evaluateWithViewsAndDirection(
132
- currentResult, currentDirection);
80
+ if (step instanceof UIQueryDirection) {
81
+ currentDirection = (UIQueryDirection) step;
82
+ }
83
+ else if (step instanceof UIQueryVisibility) {
84
+ currentVisibility = (UIQueryVisibility) step;
85
+ }
86
+ else {
87
+ currentResult = step.evaluateWithViews(currentResult, currentDirection,currentVisibility);
133
88
  }
134
89
 
135
90
  }
136
91
  return currentResult;
137
92
  }
138
-
139
- public static UIQueryDirection directionFromAst(UIQueryAST step) {
140
- // TODO Auto-generated method stub
141
- return null;
142
- }
93
+
143
94
 
144
95
  public static boolean isDirection(UIQueryAST step) {
145
- // TODO Auto-generated method stub
146
- return false;
147
- }
148
-
149
- public static List<UIQueryAST> mapUIQueryFromAstNodes(List<CommonTree> nodes) {
150
- List<UIQueryAST> mapped = new ArrayList<UIQueryAST>(nodes.size());
151
- for (CommonTree t : nodes) {
152
- mapped.add(uiQueryFromAst(t));
153
- }
154
- return mapped;
96
+ return step instanceof UIQueryDirection;
155
97
  }
156
-
157
- public static UIQueryAST uiQueryFromAst(CommonTree step) {
158
- String stepType = UIQueryParser.tokenNames[step.getType()];
159
- switch (step.getType()) {
160
- case UIQueryParser.QUALIFIED_NAME:
161
- try {
162
- return new UIQueryASTClassName(Class.forName(step.getText()));
163
- } catch (ClassNotFoundException e) {
164
- // TODO Auto-generated catch block
165
- throw new InvalidUIQueryException("Qualified class name: "
166
- + step.getText() + " not found. (" + e.getMessage()
167
- + ")");
168
- }
169
- case UIQueryParser.NAME:
170
- return new UIQueryASTClassName(step.getText());
171
-
172
- case UIQueryParser.FILTER_COLON:
173
- return UIQueryASTWith.fromAST(step);
174
- default:
175
- throw new InvalidUIQueryException("Unknown query: " + stepType
176
- + " with text: " + step.getText());
177
-
178
- }
179
-
180
- }
181
-
98
+
182
99
  }