blob: 84a9f27135c5c1d786458e1eed151d334a848d62 [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 org.apache.myfaces.trinidad.component;
import javax.faces.component.ActionSource;
import javax.faces.context.FacesContext;
import javax.faces.el.MethodBinding;
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.trinidad.context.RequestContext;
import org.apache.myfaces.trinidad.event.LaunchEvent;
import org.apache.myfaces.trinidad.event.LaunchListener;
import org.apache.myfaces.trinidad.event.ReturnEvent;
import org.apache.myfaces.trinidad.event.ReturnListener;
/**
* Base class for command components.
*
* @version $Name: $ ($Revision: 1.3 $) $Date: 2004/07/19 18:25:17 $
*/
abstract public class UIXCommandTemplate extends UIXComponentBase
implements ActionSource, DialogSource
{
/**/ // Abstract methods implemented by code gen
/**/ abstract public MethodBinding getActionListener();
/**/ abstract public MethodBinding getReturnListener();
/**/ abstract public MethodBinding getLaunchListener();
/**
* Add a LaunchListener.
*/
public void addLaunchListener(LaunchListener listener)
{
addFacesListener(listener);
}
/**
* Remove a LaunchListener.
*/
public void removeLaunchListener(LaunchListener listener)
{
removeFacesListener(listener);
}
/**
* Launch all added LaunchListeners.
*/
public LaunchListener[] getLaunchListeners()
{
return (LaunchListener[]) getFacesListeners(LaunchListener.class);
}
/**
* <p>Intercept <code>queueEvent</code> and mark the phaseId for the
* event to be <code>PhaseId.APPLY_REQUEST_VALUES</code> if the
* <code>immediate</code> flag is true,
* <code>PhaseId.INVOKE_APPLICATION</code> otherwise.</p>
*/
public void queueEvent(FacesEvent e)
{
if (e instanceof ActionEvent)
{
if (isImmediate())
{
e.setPhaseId(PhaseId.ANY_PHASE);
}
else
{
e.setPhaseId(PhaseId.INVOKE_APPLICATION);
}
}
super.queueEvent(e);
}
public void broadcast(FacesEvent event) throws AbortProcessingException
{
// Perform special processing for ActionEvents: tell
// the RequestContext to remember this command instance
// so that the NavigationHandler can locate us to queue
// a LaunchEvent.
if (event instanceof ActionEvent)
{
RequestContext afContext = RequestContext.getCurrentInstance();
afContext.getDialogService().setCurrentLaunchSource(this);
try
{
// Perform standard superclass processing
super.broadcast(event);
// Notify the specified action listener method (if any),
// and the default action listener
__broadcast(event, getActionListener());
FacesContext context = getFacesContext();
ActionListener defaultActionListener =
context.getApplication().getActionListener();
if (defaultActionListener != null)
{
defaultActionListener.processAction((ActionEvent) event);
}
}
finally
{
afContext.getDialogService().setCurrentLaunchSource(null);
}
}
else
{
// Perform standard superclass processing
super.broadcast(event);
if (event instanceof LaunchEvent)
{
__broadcast(event, getLaunchListener());
boolean useWindow =
Boolean.TRUE.equals(getAttributes().get("useWindow"));
((LaunchEvent) event).launchDialog(useWindow);
}
else if (event instanceof ReturnEvent)
{
__broadcast(event, getReturnListener());
// =-=AEW: always jump to render response??? Seems the safest
// option, because we don't want to immediately update a model
// or really perform any validation.
getFacesContext().renderResponse();
}
}
}
}