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