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 public IoSessionFinder(String query) {
47 if (query == null) {
48 throw new IllegalArgumentException("query");
49 }
50
51 query = query.trim();
52 if (query.length() == 0) {
53 throw new IllegalArgumentException("query is empty.");
54 }
55
56 this.query = query;
57 try {
58 expression = Ognl.parseExpression(query);
59 } catch (OgnlException e) {
60 throw new IllegalArgumentException("query: " + query);
61 }
62 }
63
64
65
66
67
68
69 public Set<IoSession> find(Iterable<IoSession> sessions) throws OgnlException {
70 if (sessions == null) {
71 throw new IllegalArgumentException("sessions");
72 }
73
74 Set<IoSession> answer = new LinkedHashSet<IoSession>();
75 for (IoSession s : sessions) {
76 OgnlContext context = (OgnlContext) Ognl.createDefaultContext(s);
77 context.setTypeConverter(typeConverter);
78 context.put(AbstractPropertyAccessor.READ_ONLY_MODE, true);
79 context.put(AbstractPropertyAccessor.QUERY, query);
80 Object result = Ognl.getValue(expression, context, s);
81 if (result instanceof Boolean) {
82 if (((Boolean) result).booleanValue()) {
83 answer.add(s);
84 }
85 } else {
86 throw new OgnlException("Query didn't return a boolean value: " + query);
87 }
88 }
89
90 return answer;
91 }
92 }