1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.mina.integration.ognl;
18
19 import java.util.LinkedHashSet;
20 import java.util.Set;
21
22 import ognl.Ognl;
23 import ognl.OgnlContext;
24 import ognl.OgnlException;
25 import ognl.TypeConverter;
26
27 import org.apache.mina.core.session.IoSession;
28
29
30
31
32
33
34 public class IoSessionFinder {
35
36 private final String query;
37
38 private final TypeConverter typeConverter = new PropertyTypeConverter();
39
40 private final Object expression;
41
42
43
44
45
46
47
48 public IoSessionFinder(String query) {
49 if (query == null) {
50 throw new IllegalArgumentException("query");
51 }
52
53 query = query.trim();
54
55 if (query.length() == 0) {
56 throw new IllegalArgumentException("query is empty.");
57 }
58
59
60 int comp = -1;
61
62 for (int i=0; i<query.length();i++) {
63 char c = query.charAt(i);
64
65 if ((c == '=') || (c == '<') || (c == '>') || (c == '!')) {
66 comp = i;
67 } else if ( !Character.isJavaIdentifierPart(c) && (c != ' ')) {
68 throw new IllegalArgumentException("Invalid query.");
69 } else {
70 if ( comp > 0) {
71 break;
72 }
73 }
74 }
75
76 if (comp<=0) {
77 throw new IllegalArgumentException("Invalid query.");
78 }
79
80 for (int i=comp+1; i<query.length();i++) {
81 char c = query.charAt(i);
82
83 if (!Character.isJavaIdentifierPart(c) && (c != ' ') && (c != '"') && (c != '\'')) {
84 throw new IllegalArgumentException("Invalid query.");
85 }
86 }
87
88 this.query = query;
89
90 try {
91 expression = Ognl.parseExpression(query);
92 } catch (OgnlException e) {
93 throw new IllegalArgumentException("query: " + query);
94 }
95 }
96
97
98
99
100
101
102
103
104
105 public Set<IoSession> find(Iterable<IoSession> sessions) throws OgnlException {
106 if (sessions == null) {
107 throw new IllegalArgumentException("sessions");
108 }
109
110 Set<IoSession> answer = new LinkedHashSet<>();
111
112 for (IoSession s : sessions) {
113 OgnlContext context = (OgnlContext) Ognl.createDefaultContext(s);
114 context.setTypeConverter(typeConverter);
115 context.put(AbstractPropertyAccessor.READ_ONLY_MODE, true);
116 context.put(AbstractPropertyAccessor.QUERY, query);
117 Object result = Ognl.getValue(expression, context, s);
118
119 if (result instanceof Boolean) {
120 if (((Boolean) result).booleanValue()) {
121 answer.add(s);
122 }
123 } else {
124 throw new OgnlException("Query didn't return a boolean value: " + query);
125 }
126 }
127
128 return answer;
129 }
130 }