blob: b5700dc34be540491918e53509d0e19a4d8af21f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package javax.faces.component;
import javax.el.MethodExpression;
import javax.faces.context.FacesContext;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.ActionEvent;
import javax.faces.event.ActionListener;
import javax.faces.event.FacesEvent;
import javax.faces.event.PhaseId;
import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFComponent;
import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFListener;
import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFProperty;
/**
*
* UICommand is a base abstraction for components that implement ActionSource.
*
*/
@JSFComponent(defaultRendererType = "javax.faces.Button")
public class UICommand extends UIComponentBase implements ActionSource2
{
public static final String COMPONENT_TYPE = "javax.faces.Command";
public static final String COMPONENT_FAMILY = "javax.faces.Command";
/**
* Construct an instance of the UICommand.
*/
public UICommand()
{
setRendererType("javax.faces.Button");
}
@Override
public void broadcast(FacesEvent event) throws AbortProcessingException
{
super.broadcast(event);
if (event instanceof ActionEvent)
{
FacesContext context = getFacesContext();
ActionListener defaultActionListener = context.getApplication()
.getActionListener();
if (defaultActionListener != null)
{
defaultActionListener.processAction((ActionEvent) event);
}
}
}
@Override
public void queueEvent(FacesEvent event)
{
if (event != null && event instanceof ActionEvent)
{
UIComponent component = event.getComponent();
if (component instanceof ActionSource)
{
if (((ActionSource)component).isImmediate())
{
event.setPhaseId(PhaseId.APPLY_REQUEST_VALUES);
}
else
{
event.setPhaseId(PhaseId.INVOKE_APPLICATION);
}
}
}
super.queueEvent(event);
}
/**
* A boolean value that identifies the phase during which action events
* should fire.
* <p>
* During normal event processing, action methods and action listener methods are fired during the
* "invoke application" phase of request processing. If this attribute is set to "true", these methods
* are fired instead at the end of the "apply request values" phase.
* </p>
*/
@JSFProperty
@Override
public boolean isImmediate()
{
return (Boolean) getStateHelper().eval(PropertyKeys.immediate, Boolean.FALSE);
}
@Override
public void setImmediate(boolean immediate)
{
getStateHelper().put(PropertyKeys.immediate, immediate );
}
/**
* The text to display to the user for this command component.
*/
@JSFProperty
public Object getValue()
{
return getStateHelper().eval(PropertyKeys.value);
}
public void setValue(Object value)
{
getStateHelper().put(PropertyKeys.value, value );
}
/**
* The action to take when this command is invoked.
* <p>
* If the value is an expression, it is expected to be a method binding EL expression that identifies
* an action method. An action method accepts no parameters and has a String return value, called the
* action outcome, that identifies the next view displayed. The phase that this event is fired in
* can be controlled via the immediate attribute.
* </p>
* <p>
* If the value is a string literal, it is treated as a navigation outcome for the current view. This
* is functionally equivalent to a reference to an action method that returns the string literal.
* </p>
*/
@JSFProperty(stateHolder=true, returnSignature = "java.lang.Object", jspName = "action", clientEvent="action")
@Override
public MethodExpression getActionExpression()
{
return (MethodExpression) getStateHelper().eval(PropertyKeys.actionExpression);
}
@Override
public void setActionExpression(MethodExpression actionExpression)
{
getStateHelper().put(PropertyKeys.actionExpression, actionExpression);
}
@Override
public void addActionListener(ActionListener listener)
{
addFacesListener(listener);
}
@Override
public void removeActionListener(ActionListener listener)
{
removeFacesListener(listener);
}
/**
* Event delivered when the "action" of the component has been
* invoked; for example, by clicking on a button. The action may result
* in page navigation.
*/
@JSFListener(event="javax.faces.event.ActionEvent",
phases="Invoke Application, Apply Request Values")
@Override
public ActionListener[] getActionListeners()
{
return (ActionListener[]) getFacesListeners(ActionListener.class);
}
enum PropertyKeys
{
immediate
, value
, actionExpression
, actionListener
}
@Override
public String getFamily()
{
return COMPONENT_FAMILY;
}
}