/
QueryParameterBindingHandler.java
110 lines (87 loc) · 3.64 KB
/
QueryParameterBindingHandler.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package org.ocpsoft.prettyfaces.annotation.handlers;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.faces.event.PhaseId;
import org.ocpsoft.logging.Logger;
import org.ocpsoft.prettyfaces.annotation.QueryParameterBinding;
import org.ocpsoft.rewrite.annotation.api.FieldContext;
import org.ocpsoft.rewrite.annotation.spi.FieldAnnotationHandler;
import org.ocpsoft.rewrite.bind.Bindable;
import org.ocpsoft.rewrite.bind.Binding;
import org.ocpsoft.rewrite.bind.Bindings;
import org.ocpsoft.rewrite.config.Condition;
import org.ocpsoft.rewrite.context.EvaluationContext;
import org.ocpsoft.rewrite.el.El;
import org.ocpsoft.rewrite.faces.config.PhaseBinding;
import org.ocpsoft.rewrite.servlet.config.HttpCondition;
import org.ocpsoft.rewrite.servlet.http.event.HttpInboundServletRewrite;
import org.ocpsoft.rewrite.servlet.http.event.HttpServletRewrite;
public class QueryParameterBindingHandler extends FieldAnnotationHandler<QueryParameterBinding>
{
private final Logger log = Logger.getLogger(QueryParameterBindingHandler.class);
@Override
public Class<QueryParameterBinding> handles()
{
return QueryParameterBinding.class;
}
@Override
public void process(FieldContext context, Field field, QueryParameterBinding annotation)
{
// default name is the name of the field
String queryParam = field.getName();
// but the name specified in the annotation is preferred
if (!annotation.value().isEmpty()) {
queryParam = annotation.value();
}
// FIXME: dirty way to build the EL expression
String simpleClassName = field.getDeclaringClass().getSimpleName();
String beanName = String.valueOf(simpleClassName.charAt(0)).toLowerCase()
+ simpleClassName.substring(1);
String expression = "#{" + beanName + "." + field.getName() + "}";
// add the binding condition
QueryParameterBindingCondition bindingCondition = new QueryParameterBindingCondition(queryParam);
Condition conjunction = context.getRuleBuilder().getConditionBuilder().and(bindingCondition);
context.getRuleBuilder().when(conjunction);
// build an deferred EL binding
El elBinding = El.property(expression);
PhaseBinding deferredBinding = PhaseBinding.to(elBinding).after(PhaseId.RESTORE_VIEW);
bindingCondition.bindsTo(deferredBinding);
// register the binding builder in the field context
context.setBindingBuilder(elBinding);
if (log.isTraceEnabled()) {
log.trace("Binding query parameter [{}] to EL expression: {}", queryParam, expression);
}
}
private static class QueryParameterBindingCondition extends HttpCondition implements
Bindable<QueryParameterBindingCondition>
{
private final String name;
private final List<Binding> bindings = new ArrayList<Binding>();
public QueryParameterBindingCondition(String name)
{
this.name = name;
}
@Override
public boolean evaluateHttp(HttpServletRewrite event, EvaluationContext context)
{
if (event instanceof HttpInboundServletRewrite) {
String[] values = ((HttpInboundServletRewrite) event).getRequest().getParameterValues(name);
Bindings.enqueueSubmission(event, context, this, values);
}
return true;
}
@Override
public QueryParameterBindingCondition bindsTo(Binding binding)
{
this.bindings.add(binding);
return null;
}
@Override
public List<Binding> getBindings()
{
return Collections.unmodifiableList(bindings);
}
}
}