001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019
020 package org.apache.myfaces.tobago.component;
021
022 import static org.apache.myfaces.tobago.TobagoConstants.ATTR_DEFAULT_COMMAND;
023 import static org.apache.myfaces.tobago.TobagoConstants.ATTR_DISABLED;
024 import static org.apache.myfaces.tobago.TobagoConstants.ATTR_RENDERED_PARTIALLY;
025 import static org.apache.myfaces.tobago.TobagoConstants.ATTR_TARGET;
026 import static org.apache.myfaces.tobago.TobagoConstants.ATTR_TRANSITION;
027 import org.apache.commons.logging.Log;
028 import org.apache.commons.logging.LogFactory;
029 import org.apache.commons.lang.StringUtils;
030
031 import javax.faces.component.UIComponent;
032 import javax.faces.context.FacesContext;
033 import javax.faces.el.ValueBinding;
034 import javax.faces.event.FacesEvent;
035 import javax.faces.event.PhaseId;
036 import java.io.IOException;
037 import java.util.Iterator;
038
039 /*
040 * Date: Apr 4, 2005
041 * Time: 5:02:10 PM
042 * $Id: UICommand.java 1368577 2012-08-02 16:20:31Z lofwyr $
043 */
044 public class UICommand extends javax.faces.component.UICommand {
045
046 public static final String COMPONENT_TYPE = "org.apache.myfaces.tobago.Command";
047
048 private static final Log LOG = LogFactory.getLog(UICommand.class);
049 private static final String[] RENDERED_PARTIALLY_DEFAULT = {};
050
051 private Boolean defaultCommand;
052 private Boolean disabled;
053 private String[] renderedPartially;
054 private String target;
055 private Boolean transition;
056
057 public boolean isDefaultCommand() {
058 if (defaultCommand != null) {
059 return defaultCommand;
060 }
061 ValueBinding vb = getValueBinding(ATTR_DEFAULT_COMMAND);
062 if (vb != null) {
063 return Boolean.TRUE.equals(vb.getValue(getFacesContext()));
064 } else {
065 return false;
066 }
067 }
068
069 public void setDefaultCommand(boolean defaultCommand) {
070 this.defaultCommand = defaultCommand;
071 }
072
073 public String[] getRenderedPartially() {
074 if (renderedPartially != null) {
075 return renderedPartially;
076 }
077 ValueBinding vb = getValueBinding(ATTR_RENDERED_PARTIALLY);
078 if (vb != null) {
079 Object value = vb.getValue(getFacesContext());
080 if (value != null) {
081 if (value instanceof String[]) {
082 return (String[]) value;
083 } else if (value instanceof String) {
084 return StringUtils.split((String) value, ",");
085 } else {
086 LOG.error("Ignoring RenderedPartially value binding. Unknown instance " + value.getClass().getName());
087 }
088 }
089 }
090 return RENDERED_PARTIALLY_DEFAULT;
091 }
092
093 public void setRenderedPartially(String renderedPartially) {
094 if (renderedPartially != null) {
095 String[] components = StringUtils.split(renderedPartially, ",");
096 setRenderedPartially(components);
097 }
098 }
099
100 public void setRenderedPartially(String[] renderedPartially) {
101 this.renderedPartially = renderedPartially;
102 }
103
104 public boolean isDisabled() {
105 if (disabled != null) {
106 return disabled;
107 }
108 ValueBinding vb = getValueBinding(ATTR_DISABLED);
109 if (vb != null) {
110 return Boolean.TRUE.equals(vb.getValue(getFacesContext()));
111 } else {
112 return false;
113 }
114 }
115
116 public void setDisabled(boolean disabled) {
117 this.disabled = disabled;
118 }
119
120 public boolean isTransition() {
121 if (transition != null) {
122 return transition;
123 }
124 ValueBinding vb = getValueBinding(ATTR_TRANSITION);
125 if (vb != null) {
126 return Boolean.TRUE.equals(vb.getValue(getFacesContext()));
127 } else {
128 return true;
129 }
130 }
131
132 public void setTransition(boolean transition) {
133 this.transition = transition;
134 }
135
136 public String getTarget() {
137 if (target != null) {
138 return target;
139 }
140 ValueBinding vb = getValueBinding(ATTR_TARGET);
141 if (vb != null) {
142 return (String) vb.getValue(getFacesContext());
143 } else {
144 return null;
145 }
146 }
147
148 public void setTarget(String target) {
149 this.target = target;
150 }
151
152
153 public Object saveState(FacesContext context) {
154 Object[] saveState = new Object[6];
155 saveState[0] = super.saveState(context);
156 saveState[1] = defaultCommand;
157 saveState[2] = disabled;
158 saveState[3] = renderedPartially;
159 saveState[4] = target;
160 saveState[5] = transition;
161 return saveState;
162 }
163
164 public void restoreState(FacesContext context, Object savedState) {
165 Object[] values = (Object[]) savedState;
166 super.restoreState(context, values[0]);
167 defaultCommand = (Boolean) values[1];
168 disabled = (Boolean) values[2];
169 renderedPartially = (String[]) values[3];
170 target = (String) values[4];
171 transition = (Boolean) values[5];
172 }
173
174
175 public void processDecodes(FacesContext context) {
176 if (context == null) {
177 throw new NullPointerException();
178 }
179
180 // Skip processing if our rendered flag is false
181 if (!isRendered()) {
182 return;
183 }
184
185 // Process this component itself
186 try {
187 decode(context);
188 } catch (RuntimeException e) {
189 context.renderResponse();
190 throw e;
191 }
192
193 Iterator kids = getFacetsAndChildren();
194 while (kids.hasNext()) {
195 UIComponent kid = (UIComponent) kids.next();
196 kid.processDecodes(context);
197 }
198
199 }
200
201 public void encodeChildren(FacesContext facesContext) throws IOException {
202 if (isRendered()) {
203 UILayout.getLayout(this).encodeChildrenOfComponent(facesContext, this);
204 }
205 }
206
207 public void queueEvent(FacesEvent facesEvent) {
208 // fix for TOBAGO-262
209 super.queueEvent(facesEvent);
210 if (this == facesEvent.getSource()) {
211 if (isImmediate()) {
212 facesEvent.setPhaseId(PhaseId.APPLY_REQUEST_VALUES);
213 } else {
214 facesEvent.setPhaseId(PhaseId.INVOKE_APPLICATION);
215 }
216 }
217 }
218 }