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