001: /*
002: * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved
003: *
004: * This file is part of Resin(R) Open Source
005: *
006: * Each copy or derived work must preserve the copyright notice and this
007: * notice unmodified.
008: *
009: * Resin Open Source is free software; you can redistribute it and/or modify
010: * it under the terms of the GNU General Public License version 2
011: * as published by the Free Software Foundation.
012: *
013: * Resin Open Source is distributed in the hope that it will be useful,
014: * but WITHOUT ANY WARRANTY; without even the implied warranty of
015: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
016: * of NON-INFRINGEMENT. See the GNU General Public License for more
017: * details.
018: *
019: * You should have received a copy of the GNU General Public License
020: * along with Resin Open Source; if not, write to the
021: *
022: * Free Software Foundation, Inc.
023: * 59 Temple Place, Suite 330
024: * Boston, MA 02111-1307 USA
025: *
026: * @author Scott Ferguson
027: */
028:
029: package javax.faces.component;
030:
031: import java.util.*;
032:
033: import javax.el.*;
034: import javax.faces.context.*;
035: import javax.faces.convert.*;
036:
037: public class UIForm extends UIComponentBase implements NamingContainer {
038: public static final String COMPONENT_FAMILY = "javax.faces.Form";
039: public static final String COMPONENT_TYPE = "javax.faces.Form";
040:
041: private static final HashMap<String, PropEnum> _propMap = new HashMap<String, PropEnum>();
042:
043: private Boolean _isPrependId;
044: private ValueExpression _isPrependIdExpr;
045:
046: private boolean _isSubmitted;
047:
048: public UIForm() {
049: setRendererType("javax.faces.Form");
050: }
051:
052: /**
053: * Returns the component family, used to select the renderer.
054: */
055: public String getFamily() {
056: return COMPONENT_FAMILY;
057: }
058:
059: //
060: // properties
061: //
062:
063: public boolean isPrependId() {
064: if (_isPrependId != null)
065: return _isPrependId;
066: else if (_isPrependIdExpr != null)
067: return Util
068: .evalBoolean(_isPrependIdExpr, getFacesContext());
069: else
070: return true;
071: }
072:
073: public void setPrependId(boolean value) {
074: _isPrependId = value;
075: }
076:
077: /**
078: * Returns the value expression with the given name.
079: */
080: @Override
081: public ValueExpression getValueExpression(String name) {
082: if ("prependId".equals(name)) {
083: return _isPrependIdExpr;
084: } else
085: return super .getValueExpression(name);
086: }
087:
088: /**
089: * Sets the value expression with the given name.
090: */
091: @Override
092: public void setValueExpression(String name, ValueExpression expr) {
093: if ("prependId".equals(name)) {
094: if (expr != null && expr.isLiteralText()) {
095: _isPrependId = Util.booleanValueOf(expr.getValue(null));
096: return;
097: } else
098: _isPrependIdExpr = expr;
099: }
100:
101: super .setValueExpression(name, expr);
102: }
103:
104: //
105: // render properties
106: //
107:
108: public boolean isSubmitted() {
109: return _isSubmitted;
110: }
111:
112: public void setSubmitted(boolean isSubmitted) {
113: _isSubmitted = isSubmitted;
114: }
115:
116: /**
117: * @Since 1.2
118: */
119: @Override
120: public String getContainerClientId(FacesContext context) {
121: if (isPrependId())
122: return getClientId(context);
123: else {
124: for (UIComponent comp = getParent(); comp != null; comp = comp
125: .getParent()) {
126: if (comp instanceof NamingContainer)
127: return comp.getContainerClientId(context);
128: }
129:
130: return null;
131: }
132: }
133:
134: //
135: // decode
136: //
137:
138: /**
139: * Recursively calls the decodes for any children, then calls
140: * decode().
141: */
142: public void processDecodes(FacesContext context) {
143: if (context == null)
144: throw new NullPointerException();
145:
146: if (!isRendered())
147: return;
148:
149: decode(context);
150:
151: if (isSubmitted()) {
152: Iterator iter = getFacetsAndChildren();
153: while (iter.hasNext()) {
154: UIComponent child = (UIComponent) iter.next();
155:
156: child.processDecodes(context);
157: }
158: }
159: }
160:
161: //
162: // validators
163: //
164:
165: /**
166: * Recursively calls the validators for any children, then calls
167: * decode().
168: */
169: public void processValidators(FacesContext context) {
170: if (context == null)
171: throw new NullPointerException();
172:
173: if (isSubmitted()) {
174: super .processValidators(context);
175: }
176: }
177:
178: //
179: // updates
180: //
181:
182: /**
183: * Recursively calls the updates for any children, then calls
184: * update().
185: */
186: @Override
187: public void processUpdates(FacesContext context) {
188: if (context == null)
189: throw new NullPointerException();
190:
191: if (isSubmitted()) {
192: super .processUpdates(context);
193: }
194: }
195:
196: //
197: // state
198: //
199:
200: public Object saveState(FacesContext context) {
201: return new Object[] { super .saveState(context), _isPrependId, };
202: }
203:
204: public void restoreState(FacesContext context, Object value) {
205: Object[] state = (Object[]) value;
206:
207: super .restoreState(context, state[0]);
208:
209: _isPrependId = (Boolean) state[1];
210: }
211:
212: //
213: // private helpers
214: //
215:
216: private static enum PropEnum {
217: PREPEND_ID,
218: }
219:
220: static {
221: _propMap.put("prependId", PropEnum.PREPEND_ID);
222: }
223: }
|