1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.myfaces.tobago.internal.renderkit.renderer;
21
22 import org.apache.myfaces.tobago.component.Attributes;
23 import org.apache.myfaces.tobago.internal.util.StringUtils;
24 import org.apache.myfaces.tobago.renderkit.RendererBase;
25 import org.apache.myfaces.tobago.util.ComponentUtils;
26 import org.slf4j.Logger;
27 import org.slf4j.LoggerFactory;
28
29 import javax.faces.component.EditableValueHolder;
30 import javax.faces.component.UIComponent;
31 import javax.faces.context.FacesContext;
32 import java.lang.invoke.MethodHandles;
33 import java.util.Map;
34
35 public abstract class DecodingInputRendererBase<T extends UIComponent> extends RendererBase<T> {
36
37 private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
38
39 @Override
40 public void decodeInternal(final FacesContext facesContext, final T component) {
41 if (!(component instanceof EditableValueHolder)) {
42 return;
43 }
44
45 if (isOutputOnly(component)) {
46 return;
47 }
48
49 final String clientId = component.getClientId(facesContext);
50
51 final Map<String, String> requestParameterMap = facesContext.getExternalContext().getRequestParameterMap();
52 if (requestParameterMap.containsKey(clientId)) {
53 final String newValue = requestParameterMap.get(clientId);
54 if (LOG.isDebugEnabled()) {
55 final boolean password = ComponentUtils.getBooleanAttribute(component, Attributes.password);
56 LOG.debug("clientId='{}'", clientId);
57 LOG.debug("requestParameterMap.get(clientId)='{}'", StringUtils.toConfidentialString(newValue, password));
58 }
59
60 setSubmittedValue(facesContext, (EditableValueHolder) component, newValue);
61 }
62
63 decodeClientBehaviors(facesContext, component);
64 }
65
66 protected abstract boolean isOutputOnly(T component);
67
68 protected void setSubmittedValue(
69 final FacesContext facesContext, final EditableValueHolder component, final String newValue) {
70 component.setSubmittedValue(newValue);
71 }
72
73 }