[jboss-cvs] jboss-seam/src/main/org/jboss/seam/faces ...
Gavin King
gavin.king at jboss.com
Tue Jun 19 15:12:44 EDT 2007
User: gavin
Date: 07/06/19 15:12:44
Added: src/main/org/jboss/seam/faces
FacesContext.java FacesMessages.java FacesPage.java
HttpError.java IsUserInRole.java
JsfBusinessProcess.java JsfExpressions.java
JsfManager.java JsfParameters.java JsfProvider.java
Navigator.java Redirect.java RedirectException.java
Selector.java Switcher.java UiComponent.java
UserPrincipal.java Validation.java
Log:
repackaged built-in components
sorry for breakage, but it had to happen eventually :-(
Revision Changes Path
1.1 date: 2007/06/19 19:12:44; author: gavin; state: Exp;jboss-seam/src/main/org/jboss/seam/faces/FacesContext.java
Index: FacesContext.java
===================================================================
//$Id: FacesContext.java,v 1.1 2007/06/19 19:12:44 gavin Exp $
package org.jboss.seam.faces;
import static org.jboss.seam.InterceptionType.NEVER;
import static org.jboss.seam.annotations.Install.BUILT_IN;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Install;
import org.jboss.seam.annotations.Intercept;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.Unwrap;
/**
* Support for injecting the JSF FacesContext object
*
* @author Gavin King
*/
@Scope(ScopeType.APPLICATION)
@Intercept(NEVER)
@Name("org.jboss.seam.core.facesContext")
@Install(precedence=BUILT_IN, classDependencies="javax.faces.context.FacesContext")
public class FacesContext
{
@Unwrap
public javax.faces.context.FacesContext getContext()
{
return javax.faces.context.FacesContext.getCurrentInstance();
}
}
1.1 date: 2007/06/19 19:12:44; author: gavin; state: Exp;jboss-seam/src/main/org/jboss/seam/faces/FacesMessages.java
Index: FacesMessages.java
===================================================================
package org.jboss.seam.faces;
import static org.jboss.seam.InterceptionType.NEVER;
import static org.jboss.seam.annotations.Install.BUILT_IN;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.MissingResourceException;
import javax.faces.application.FacesMessage;
import javax.faces.application.FacesMessage.Severity;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import org.hibernate.validator.InvalidValue;
import org.jboss.seam.Component;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Install;
import org.jboss.seam.annotations.Intercept;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.contexts.Contexts;
import org.jboss.seam.core.Interpolator;
import org.jboss.seam.international.ResourceBundle;
import org.jboss.seam.util.Strings;
/**
* A Seam component that TBD.
*
* @author Gavin King
*/
@Scope(ScopeType.CONVERSATION)
@Name("org.jboss.seam.core.facesMessages")
@Install(precedence=BUILT_IN, classDependencies="javax.faces.context.FacesContext")
@Intercept(NEVER)
public class FacesMessages implements Serializable
{
private static final long serialVersionUID = -5395975397632138270L;
private transient List<Runnable> tasks;
private List<Message> facesMessages = new ArrayList<Message>();
private Map<String, List<Message>> keyedFacesMessages = new HashMap<String, List<Message>>();
/**
* Workaround for non-serializability of
* JSF FacesMessage.Severity class.
*
* @author Gavin King
*
*/
class Message implements Serializable
{
private String summary;
private String detail;
private int severityOrdinal;
Message(FacesMessage fm)
{
summary = fm.getSummary();
detail = fm.getDetail();
severityOrdinal = fm.getSeverity().getOrdinal();
}
FacesMessage toFacesMessage()
{
Severity severity = null;
for (Object o : FacesMessage.VALUES) {
severity = (Severity) o;
if (severity.getOrdinal() == severityOrdinal) {
break;
}
}
return new FacesMessage(severity, summary, detail );
}
}
public void beforeRenderResponse()
{
for (Message message: facesMessages)
{
FacesContext.getCurrentInstance().addMessage( null,message.toFacesMessage() );
}
for ( Map.Entry<String, List<Message>> entry: keyedFacesMessages.entrySet() )
{
for ( Message msg: entry.getValue() )
{
FacesContext.getCurrentInstance().addMessage( entry.getKey(), msg.toFacesMessage() );
}
}
clear();
}
/**
* Get all faces messages that have already been added
* to the context.
*
* @return a list of messages
*/
public List<FacesMessage> getCurrentMessages()
{
List<FacesMessage> result = new ArrayList<FacesMessage>();
Iterator<FacesMessage> iter = FacesContext.getCurrentInstance().getMessages();
while ( iter.hasNext() )
{
result.add( iter.next() );
}
return result;
}
/**
* Get all faces global messages that have already been added
* to the context.
*
* @return a list of global messages
*/
public List<FacesMessage> getCurrentGlobalMessages()
{
List<FacesMessage> result = new ArrayList<FacesMessage>();
Iterator<FacesMessage> iter = FacesContext.getCurrentInstance().getMessages(null);
while ( iter.hasNext() )
{
result.add( iter.next() );
}
return result;
}
/**
* Get all faces messages that have already been added
* to the control.
*
* @return a list of messages
*/
public List<FacesMessage> getCurrentMessagesForControl(String id)
{
String clientId = getClientId(id);
List<FacesMessage> result = new ArrayList<FacesMessage>();
Iterator<FacesMessage> iter = FacesContext.getCurrentInstance().getMessages(clientId);
while ( iter.hasNext() )
{
result.add( iter.next() );
}
return result;
}
private void runTasks()
{
if (tasks!=null)
{
for (Runnable task: tasks) task.run();
tasks.clear();
}
}
public static void afterPhase()
{
if ( Contexts.isConversationContextActive() )
{
FacesMessages instance = (FacesMessages) Component.getInstance(FacesMessages.class, ScopeType.CONVERSATION, false);
if (instance!=null) instance.runTasks();
}
}
public void clear()
{
facesMessages.clear();
keyedFacesMessages.clear();
}
/**
* Add a FacesMessage that will be used
* the next time a page is rendered.
*/
public void add(FacesMessage facesMessage)
{
if (facesMessage!=null)
{
facesMessages.add( new Message(facesMessage) );
}
}
/**
* Add a FacesMessage instance to a particular component id
* @param id a JSF component id
*/
public void addToControl(String id, FacesMessage facesMessage)
{
if (facesMessage!=null)
{
String clientId = getClientId(id);
List<Message> list = keyedFacesMessages.get(clientId);
if (list==null)
{
list = new ArrayList<Message>();
keyedFacesMessages.put(clientId, list);
}
list.add( new Message(facesMessage) );
}
}
/**
* Add a templated FacesMessage that will be used
* the next time a page is rendered.
*/
public void add(String messageTemplate, Object... params)
{
addToTasks(FacesMessage.SEVERITY_INFO, null, messageTemplate, params);
}
/**
* Add a templated FacesMessage that will be used
* the next time a page is rendered.
*/
public void add(Severity severity, String messageTemplate, Object... params)
{
addToTasks(severity, null, messageTemplate, params);
}
/**
* Add a templated FacesMessage to a particular JSF control
* @param id a JSF component id
*/
public void addToControl(String id, String messageTemplate, Object... params)
{
addToControl(id, FacesMessage.SEVERITY_INFO, messageTemplate, params);
}
/**
* Add a templated FacesMessage to a particular JSF control
* @param id a JSF component id
*/
public void addToControl(String id, Severity severity, String messageTemplate, Object... params)
{
addToTasks(id, severity, null, messageTemplate, params);
}
/**
* Add a templated FacesMessage by looking for the message
* template in the resource bundle.
*/
public void addFromResourceBundle(String key, Object... params)
{
addFromResourceBundle(FacesMessage.SEVERITY_INFO, key, params);
}
/**
* Add a templated FacesMessage by looking for the message
* template in the resource bundle.
*/
public void addFromResourceBundle(Severity severity, String key, Object... params)
{
addFromResourceBundleOrDefault(severity, key, key, params);
}
/**
* Add a templated FacesMessage to a particular component id by looking
* for the message template in the resource bundle. If it is missing, use
* the given message template.
*/
public void addFromResourceBundleOrDefault(String key, String defaultMessageTemplate, Object... params)
{
addFromResourceBundleOrDefault(FacesMessage.SEVERITY_INFO, key, defaultMessageTemplate, params);
}
/**
* Add a templated FacesMessage to a particular component id by looking
* for the message template in the resource bundle. If it is missing, use
* the given message template.
*/
public void addFromResourceBundleOrDefault(Severity severity, String key, String defaultMessageTemplate, Object... params)
{
addToTasks(severity, key, defaultMessageTemplate, params);
}
/**
* Add a templated FacesMessage to a particular component id by looking
* for the message template in the resource bundle.
*/
public void addToControlFromResourceBundle(String id, String key, Object... params)
{
addToControlFromResourceBundle(id, FacesMessage.SEVERITY_INFO, key, params);
}
/**
* Add a templated FacesMessage to a particular component id by looking
* for the message template in the resource bundle.
*/
public void addToControlFromResourceBundle(String id, Severity severity, String key, Object... params)
{
addToControlFromResourceBundleOrDefault(id, severity, key, key, params);
}
/**
* Add a templated FacesMessage to a particular component id by looking
* for the message template in the resource bundle. If it is missing, use
* the given message template.
*/
public void addToControlFromResourceBundleOrDefault(String id, String key, String defaultMessageTemplate, Object... params)
{
addToControlFromResourceBundleOrDefault(id, FacesMessage.SEVERITY_INFO, key, defaultMessageTemplate, params);
}
/**
* Add a templated FacesMessage to a particular component id by looking
* for the message template in the resource bundle. If it is missing, use
* the given message template.
*/
public void addToControlFromResourceBundleOrDefault(String id, Severity severity, String key, String defaultMessageTemplate, Object... params)
{
addToTasks(id, severity, key, defaultMessageTemplate, params);
}
private static String interpolateBundleMessage(String key, String defaultMessageTemplate)
{
String messageTemplate = defaultMessageTemplate;
if ( key!=null )
{
java.util.ResourceBundle resourceBundle = ResourceBundle.instance();
if ( resourceBundle!=null )
{
try
{
String bundleMessage = resourceBundle.getString(key);
if (bundleMessage!=null) messageTemplate = bundleMessage;
}
catch (MissingResourceException mre) {} //swallow
}
}
return messageTemplate;
}
public void add(InvalidValue[] ivs)
{
for (InvalidValue iv: ivs)
{
add(iv);
}
}
public void addToControls(InvalidValue[] ivs)
{
for (InvalidValue iv: ivs)
{
addToControl(iv);
}
}
public void add(InvalidValue iv)
{
add( FacesMessage.SEVERITY_WARN, iv.getMessage() );
}
public void addToControl(InvalidValue iv)
{
addToControl( iv.getPropertyName(), iv );
}
public void addToControl(String id, InvalidValue iv)
{
addToControl( id, FacesMessage.SEVERITY_WARN, iv.getMessage() );
}
public static FacesMessage createFacesMessage(Severity severity, String messageTemplate, Object... params)
{
return new FacesMessage( severity, Interpolator.instance().interpolate(messageTemplate, params), null );
}
public static FacesMessage createFacesMessage(Severity severity, String key, String defaultMessageTemplate, Object... params)
{
String message = interpolateBundleMessage(key, defaultMessageTemplate);
if ( !Strings.isEmpty(message) )
{
return createFacesMessage( severity, message, params );
}
else
{
return null;
}
}
private String getClientId(String id)
{
FacesContext facesContext = FacesContext.getCurrentInstance();
return getClientId( facesContext.getViewRoot(), id, facesContext);
}
private static String getClientId(UIComponent component, String id, FacesContext facesContext)
{
String componentId = component.getId();
if (componentId!=null && componentId.equals(id))
{
return component.getClientId(facesContext);
}
else
{
Iterator iter = component.getFacetsAndChildren();
while ( iter.hasNext() )
{
UIComponent child = (UIComponent) iter.next();
String clientId = getClientId(child, id, facesContext);
if (clientId!=null) return clientId;
}
return null;
}
}
private List<Runnable> getTasks()
{
if (tasks==null)
{
tasks = new ArrayList<Runnable>();
}
return tasks;
}
private void addToTasks(final Severity severity, final String key, final String messageTemplate, final Object... params)
{
getTasks().add( new Runnable() {
public void run() { add( createFacesMessage(severity, key, messageTemplate, params) ); }
} );
}
private void addToTasks(final String id, final Severity severity, final String key, final String messageTemplate, final Object... params)
{
getTasks().add( new Runnable() {
public void run() { addToControl( id, createFacesMessage(severity, key, messageTemplate, params) ); }
} );
}
public static FacesMessages instance()
{
if ( !Contexts.isConversationContextActive() )
{
throw new IllegalStateException("No active conversation context");
}
return (FacesMessages) Component.getInstance(FacesMessages.class, ScopeType.CONVERSATION);
}
}
1.1 date: 2007/06/19 19:12:44; author: gavin; state: Exp;jboss-seam/src/main/org/jboss/seam/faces/FacesPage.java
Index: FacesPage.java
===================================================================
package org.jboss.seam.faces;
import static org.jboss.seam.annotations.Install.BUILT_IN;
import java.io.Serializable;
import org.jboss.seam.Component;
import org.jboss.seam.InterceptionType;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Install;
import org.jboss.seam.annotations.Intercept;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.contexts.Contexts;
import org.jboss.seam.core.Init;
import org.jboss.seam.core.Manager;
import org.jboss.seam.core.ServletSession;
import org.jboss.seam.navigation.Pageflow;
/**
* Book-keeping component that persists information
* about the conversation associated with the current
* page.
*
* @author Gavin King
*
*/
@Name("org.jboss.seam.core.facesPage")
@Intercept(InterceptionType.NEVER)
@Install(precedence=BUILT_IN, classDependencies="javax.faces.context.FacesContext")
@Scope(ScopeType.PAGE)
public class FacesPage implements Serializable
{
private static final long serialVersionUID = 4807114041808347239L;
private String pageflowName;
private Integer pageflowCounter;
private String pageflowNodeName;
private String conversationId;
private boolean conversationIsLongRunning;
//private Map<String, Object> pageParameters;
public String getConversationId()
{
return conversationId;
}
public void discardTemporaryConversation()
{
conversationId = null;
conversationIsLongRunning = false;
}
public void discardNestedConversation(String outerConversationId)
{
conversationId = outerConversationId;
conversationIsLongRunning = true;
}
public void storeConversation(String conversationId)
{
this.conversationId = conversationId;
conversationIsLongRunning = true;
}
public void storePageflow()
{
if ( Init.instance().isJbpmInstalled() )
{
Pageflow pageflow = Pageflow.instance();
if ( pageflow.isInProcess() /*&& !pageflow.getProcessInstance().hasEnded()*/ && Manager.instance().isLongRunningConversation() )
{
pageflowName = pageflow.getSubProcessInstance().getProcessDefinition().getName();
pageflowNodeName = pageflow.getNode().getName();
pageflowCounter = pageflow.getPageflowCounter();
}
else
{
pageflowName = null;
pageflowNodeName = null;
pageflowCounter = null;
}
}
}
public static FacesPage instance()
{
if ( !Contexts.isPageContextActive() )
{
throw new IllegalStateException("No page context active");
}
return (FacesPage) Component.getInstance(FacesPage.class, ScopeType.PAGE);
}
public boolean isConversationLongRunning()
{
return conversationIsLongRunning;
}
public Integer getPageflowCounter()
{
return pageflowCounter;
}
public String getPageflowName()
{
return pageflowName;
}
public String getPageflowNodeName()
{
return pageflowNodeName;
}
public void storeConversation()
{
Manager manager = Manager.instance();
//we only need to execute this code when we are in the
//RENDER_RESPONSE phase, ie. not before redirects
ServletSession servletSession = ServletSession.getInstance();
boolean sessionInvalid = servletSession!=null && servletSession.isInvalid();
if ( !sessionInvalid && manager.isLongRunningConversation() )
{
storeConversation( manager.getCurrentConversationId() );
}
else if ( !sessionInvalid && manager.isNestedConversation() )
{
discardNestedConversation( manager.getParentConversationId() );
}
else
{
discardTemporaryConversation();
}
if ( !sessionInvalid && Init.instance().isClientSideConversations() )
{
// if we are using client-side conversations, put the
// map containing the conversation context variables
// into the view root (or remove it for a temp
// conversation context)
Contexts.getConversationContext().flush();
}
}
/*public Map<String, Object> getPageParameters()
{
return pageParameters==null ? Collections.EMPTY_MAP : pageParameters;
}
public void setPageParameters(Map<String, Object> pageParameters)
{
this.pageParameters = pageParameters.isEmpty() ? null : pageParameters;
}
/**
* Used by test harness
*
* @param name the page parameter name
* @param value the value
*/
/*public void setPageParameter(String name, Object value)
{
if (pageParameters==null)
{
pageParameters = new HashMap<String, Object>();
}
pageParameters.put(name, value);
}*/
}
1.1 date: 2007/06/19 19:12:44; author: gavin; state: Exp;jboss-seam/src/main/org/jboss/seam/faces/HttpError.java
Index: HttpError.java
===================================================================
//$Id: HttpError.java,v 1.1 2007/06/19 19:12:44 gavin Exp $
package org.jboss.seam.faces;
import static org.jboss.seam.InterceptionType.NEVER;
import static org.jboss.seam.annotations.Install.BUILT_IN;
import java.io.IOException;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletResponse;
import org.jboss.seam.Component;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Install;
import org.jboss.seam.annotations.Intercept;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.contexts.Contexts;
/**
* Convenient HTTP errors
*
* @author Gavin King
*/
@Scope(ScopeType.APPLICATION)
@Intercept(NEVER)
@Name("org.jboss.seam.core.httpError")
@Install(precedence=BUILT_IN, classDependencies="javax.faces.context.FacesContext")
public class HttpError
{
/**
* Send a HTTP error as the response
*/
public void send(int code)
{
try
{
getResponse().sendError(code);
}
catch (IOException ioe)
{
throw new IllegalStateException(ioe);
}
FacesContext.getCurrentInstance().responseComplete();
}
/**
* Send a HTTP error as the response
*/
public void send(int code, String message)
{
try
{
getResponse().sendError(code, message);
}
catch (IOException ioe)
{
throw new IllegalStateException(ioe);
}
FacesContext.getCurrentInstance().responseComplete();
}
private static HttpServletResponse getResponse()
{
return (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
}
public static HttpError instance()
{
if ( !Contexts.isApplicationContextActive() )
{
throw new IllegalStateException("No active application scope");
}
return (HttpError) Component.getInstance(HttpError.class, ScopeType.APPLICATION);
}
}
1.1 date: 2007/06/19 19:12:44; author: gavin; state: Exp;jboss-seam/src/main/org/jboss/seam/faces/IsUserInRole.java
Index: IsUserInRole.java
===================================================================
package org.jboss.seam.faces;
import static org.jboss.seam.InterceptionType.NEVER;
import static org.jboss.seam.annotations.Install.BUILT_IN;
import java.util.AbstractMap;
import java.util.Map;
import java.util.Set;
import javax.faces.context.FacesContext;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Install;
import org.jboss.seam.annotations.Intercept;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.Unwrap;
import org.jboss.seam.web.ServletContexts;
/**
* Manager component for a map of roles assigned
* to the current user, as exposed via the JSF
* ExternalContext.
*
* @author Gavin King
*/
@Scope(ScopeType.APPLICATION)
@Intercept(NEVER)
@Name("org.jboss.seam.core.isUserInRole")
@Install(precedence=BUILT_IN, classDependencies="javax.faces.context.FacesContext")
public class IsUserInRole
{
@Unwrap
public Map<String, Boolean> getMap()
{
return new AbstractMap<String, Boolean>()
{
@Override
public Set<Map.Entry<String, Boolean>> entrySet() {
throw new UnsupportedOperationException();
}
@Override
public Boolean get(Object key)
{
if ( !(key instanceof String ) ) return false;
String role = (String) key;
FacesContext facesContext = FacesContext.getCurrentInstance();
if ( facesContext != null )
{
return facesContext.getExternalContext().isUserInRole(role);
}
ServletRequest servletRequest = ServletContexts.instance().getRequest();
if ( servletRequest != null )
{
return ( (HttpServletRequest) servletRequest ).isUserInRole(role);
}
return null;
}
};
}
}
1.1 date: 2007/06/19 19:12:44; author: gavin; state: Exp;jboss-seam/src/main/org/jboss/seam/faces/JsfBusinessProcess.java
Index: JsfBusinessProcess.java
===================================================================
package org.jboss.seam.faces;
import static org.jboss.seam.InterceptionType.NEVER;
import static org.jboss.seam.annotations.Install.FRAMEWORK;
import javax.faces.application.FacesMessage;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Install;
import org.jboss.seam.annotations.Intercept;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.bpm.BusinessProcess;
/**
* Holds the task and process ids for the current conversation,
* and provides programmatic control over the business process.
*
* @author Gavin King
*
*/
@Scope(ScopeType.CONVERSATION)
@Name("org.jboss.seam.core.businessProcess")
@Intercept(NEVER)
@Install(dependencies="org.jboss.seam.core.jbpm", precedence=FRAMEWORK, classDependencies="javax.faces.context.FacesContext")
public class JsfBusinessProcess extends BusinessProcess
{
@Override
protected void taskNotFound(Long taskId)
{
FacesMessages.instance().addFromResourceBundleOrDefault(
FacesMessage.SEVERITY_WARN,
"org.jboss.seam.TaskNotFound",
"Task #0 not found",
taskId
);
}
@Override
protected void taskEnded(Long taskId)
{
FacesMessages.instance().addFromResourceBundleOrDefault(
FacesMessage.SEVERITY_WARN,
"org.jboss.seam.TaskEnded",
"Task #0 already ended",
taskId
);
}
@Override
protected void processEnded(Long processId)
{
FacesMessages.instance().addFromResourceBundleOrDefault(
FacesMessage.SEVERITY_WARN,
"org.jboss.seam.ProcessEnded",
"Process #0 already ended",
processId
);
}
@Override
protected void processNotFound(Long processId)
{
FacesMessages.instance().addFromResourceBundleOrDefault(
FacesMessage.SEVERITY_WARN,
"org.jboss.seam.ProcessNotFound",
"Process #0 not found",
processId
);
}
@Override
protected void processEnded(String key)
{
FacesMessages.instance().addFromResourceBundleOrDefault(
FacesMessage.SEVERITY_WARN,
"org.jboss.seam.ProcessEnded",
"Process #0 already ended",
key
);
}
@Override
protected void processNotFound(String key)
{
FacesMessages.instance().addFromResourceBundleOrDefault(
FacesMessage.SEVERITY_WARN,
"org.jboss.seam.ProcessNotFound",
"Process #0 not found",
key
);
}
}
1.1 date: 2007/06/19 19:12:44; author: gavin; state: Exp;jboss-seam/src/main/org/jboss/seam/faces/JsfExpressions.java
Index: JsfExpressions.java
===================================================================
//$Id: JsfExpressions.java,v 1.1 2007/06/19 19:12:44 gavin Exp $
package org.jboss.seam.faces;
import static org.jboss.seam.InterceptionType.NEVER;
import static org.jboss.seam.annotations.Install.FRAMEWORK;
import static org.jboss.seam.el.EL.EL_CONTEXT;
import javax.el.ELContext;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;
import org.hibernate.validator.InvalidValue;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Install;
import org.jboss.seam.annotations.Intercept;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.core.Expressions;
/**
* Factory for method and value bindings
*
* @author Gavin King
*/
@Scope(ScopeType.APPLICATION)
@Intercept(NEVER)
@Install(precedence=FRAMEWORK, classDependencies="javax.faces.context.FacesContext")
@Name("org.jboss.seam.core.expressions")
public class JsfExpressions extends Expressions
{
/**
* Get an appropriate ELContext. If there is an active JSF request,
* use JSF's ELContext. Otherwise, use one that we created.
*/
@Override
public ELContext getELContext()
{
FacesContext facesContext = FacesContext.getCurrentInstance();
return facesContext==null ? EL_CONTEXT : facesContext.getELContext();
}
/**
* Validate that a value can be assigned to the property
* identified by a value expression.
*
* @param propertyExpression a value expression
* @param value the value that is to be assigned
*
* @throws ValidatorException is validation fails
*/
public void validate(String propertyExpression, Object value)
{
InvalidValue[] ivs;
try
{
ivs = getInvalidValues(propertyExpression, value );
}
catch (Exception e)
{
throw new ValidatorException( new FacesMessage(FacesMessage.SEVERITY_ERROR, "model validation failed:" + e.getMessage(), null), e );
}
if ( ivs.length>0 )
{
throw new ValidatorException( FacesMessages.createFacesMessage( FacesMessage.SEVERITY_ERROR, ivs[0].getMessage() ) );
}
}
@Override
protected boolean isFacesContextActive()
{
return FacesContext.getCurrentInstance()==null;
}
public static JsfExpressions instance()
{
return (JsfExpressions) Expressions.instance();
}
}
1.1 date: 2007/06/19 19:12:44; author: gavin; state: Exp;jboss-seam/src/main/org/jboss/seam/faces/JsfManager.java
Index: JsfManager.java
===================================================================
/*
* JBoss, Home of Professional Open Source
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package org.jboss.seam.faces;
import static org.jboss.seam.InterceptionType.NEVER;
import static org.jboss.seam.annotations.Install.FRAMEWORK;
import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Install;
import org.jboss.seam.annotations.Intercept;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.contexts.Lifecycle;
import org.jboss.seam.core.Conversation;
import org.jboss.seam.core.Init;
import org.jboss.seam.core.Interpolator;
import org.jboss.seam.core.Manager;
import org.jboss.seam.log.LogProvider;
import org.jboss.seam.log.Logging;
import org.jboss.seam.navigation.ConversationIdParameter;
import org.jboss.seam.navigation.Pageflow;
import org.jboss.seam.navigation.Pages;
import org.jboss.seam.util.JSF;
/**
* The Seam conversation manager.
*
* @author Gavin King
* @author <a href="mailto:theute at jboss.org">Thomas Heute</a>
*/
@Scope(ScopeType.EVENT)
@Name("org.jboss.seam.core.manager")
@Install(precedence=FRAMEWORK, classDependencies="javax.faces.context.FacesContext")
@Intercept(NEVER)
public class JsfManager extends Manager
{
private static final LogProvider log = Logging.getLogProvider(JsfManager.class);
private boolean controllingRedirect;
/**
* Temporarily promote a temporary conversation to
* a long running conversation for the duration of
* a browser redirect. After the redirect, the
* conversation will be demoted back to a temporary
* conversation. Handle any changes to the conversation
* id, due to propagation via natural id.
*/
public void beforeRedirect(String viewId)
{
beforeRedirect();
FacesContext facesContext = FacesContext.getCurrentInstance();
String currentViewId = Pages.getViewId(facesContext);
if ( viewId!=null && currentViewId!=null )
{
ConversationIdParameter currentPage = Pages.instance().getPage(currentViewId).getConversationIdParameter();
ConversationIdParameter targetPage = Pages.instance().getPage(viewId).getConversationIdParameter();
if ( isDifferentConversationId(currentPage, targetPage) )
{
updateCurrentConversationId( targetPage.getConversationId() );
}
}
}
public void interpolateAndRedirect(String url)
{
Map<String, Object> parameters = new HashMap<String, Object>();
int loc = url.indexOf('?');
if (loc>0)
{
StringTokenizer tokens = new StringTokenizer( url.substring(loc), "?=&" );
while ( tokens.hasMoreTokens() )
{
String name = tokens.nextToken();
String value = Interpolator.instance().interpolate( tokens.nextToken() );
parameters.put(name, value);
}
url = url.substring(0, loc);
}
redirect(url, parameters, true);
}
/**
* Redirect to the given view id, encoding the conversation id
* into the request URL.
*
* @param viewId the JSF view id
*/
@Override
public void redirect(String viewId)
{
redirect(viewId, null, true);
}
@Override
protected void storeConversationToViewRootIfNecessary()
{
FacesContext facesContext = FacesContext.getCurrentInstance();
if ( facesContext!=null && Lifecycle.getPhaseId()==JSF.RENDER_RESPONSE )
{
FacesPage.instance().storeConversation();
}
}
@Override
protected String generateInitialConversationId()
{
FacesContext facesContext = FacesContext.getCurrentInstance();
String viewId = Pages.getViewId(facesContext);
if ( viewId!=null )
{
return Pages.instance().getPage(viewId)
.getConversationIdParameter()
.getInitialConversationId( facesContext.getExternalContext().getRequestParameterMap() );
}
else
{
return super.generateInitialConversationId();
}
}
/**
* Redirect to the given view id, after encoding parameters and conversation
* id into the request URL.
*
* @param viewId the JSF view id
* @param parameters request parameters to be encoded (possibly null)
* @param includeConversationId determines if the conversation id is to be encoded
*/
public void redirect(String viewId, Map<String, Object> parameters,
boolean includeConversationId)
{
/*if ( Lifecycle.getPhaseId()==PhaseId.RENDER_RESPONSE )
{
throw new IllegalStateException("attempted to redirect during RENDER_RESPONSE phase");
}*/
FacesContext context = FacesContext.getCurrentInstance();
String url = context.getApplication().getViewHandler().getActionURL(context, viewId);
if (parameters!=null)
{
url = encodeParameters(url, parameters);
}
url = Pages.instance().encodePageParameters(
FacesContext.getCurrentInstance(),
url,
viewId,
parameters==null ? Collections.EMPTY_SET : parameters.keySet()
);
if (includeConversationId)
{
beforeRedirect(viewId);
url = encodeConversationId(url, viewId);
}
redirect(viewId, context, url);
}
/**
* Redirect to the given view id, after encoding the given conversation
* id into the request URL.
*
* @param viewId the JSF view id
* @param conversationId an id of a long-running conversation
*/
@Override
public void redirect(String viewId, String conversationId)
{
FacesContext context = FacesContext.getCurrentInstance();
String url = context.getApplication().getViewHandler().getActionURL(context, viewId);
url = encodeConversationId(url, viewId, conversationId);
redirect(viewId, context, url);
}
private void redirect(String viewId, FacesContext context, String url)
{
url = Pages.instance().encodeScheme(viewId, context, url);
if ( log.isDebugEnabled() )
{
log.debug("redirecting to: " + url);
}
ExternalContext externalContext = context.getExternalContext();
controllingRedirect = true;
try
{
externalContext.redirect( externalContext.encodeActionURL(url) );
}
catch (IOException ioe)
{
throw new RedirectException(ioe);
}
finally
{
controllingRedirect = false;
}
context.responseComplete();
}
/**
* Called by the Seam Redirect Filter when a redirect is called.
* Appends the conversationId parameter if necessary.
*
* @param url the requested URL
* @return the resulting URL with the conversationId appended
*/
public String appendConversationIdFromRedirectFilter(String url, String viewId)
{
boolean appendConversationId = !controllingRedirect;
if (appendConversationId)
{
beforeRedirect(viewId);
url = encodeConversationId(url, viewId);
}
return url;
}
/**
* If a page description is defined, remember the description and
* view id for the current page, to support conversation switching.
* Called just before the render phase.
*/
public void prepareBackswitch(FacesContext facesContext)
{
Conversation conversation = Conversation.instance();
//stuff from jPDL takes precedence
org.jboss.seam.pageflow.Page pageflowPage =
Manager.instance().isLongRunningConversation() &&
Init.instance().isJbpmInstalled() &&
Pageflow.instance().isInProcess() ?
Pageflow.instance().getPage() : null;
if (pageflowPage==null)
{
//handle stuff defined in pages.xml
Pages pages = Pages.instance();
if (pages!=null) //for tests
{
String viewId = Pages.getViewId(facesContext);
org.jboss.seam.navigation.Page pageEntry = pages.getPage(viewId);
if ( pageEntry.isSwitchEnabled() )
{
conversation.setViewId(viewId);
}
if ( pageEntry.hasDescription() )
{
conversation.setDescription( pageEntry.renderDescription() );
}
conversation.setTimeout( pages.getTimeout(viewId) );
}
}
else
{
//use stuff from the pageflow definition
if ( pageflowPage.isSwitchEnabled() )
{
conversation.setViewId( Pageflow.instance().getPageViewId() );
}
if ( pageflowPage.hasDescription() )
{
conversation.setDescription( pageflowPage.getDescription() );
}
conversation.setTimeout( pageflowPage.getTimeout() );
}
flushConversationMetadata();
}
public static JsfManager instance()
{
return (JsfManager) Manager.instance();
}
}
1.1 date: 2007/06/19 19:12:44; author: gavin; state: Exp;jboss-seam/src/main/org/jboss/seam/faces/JsfParameters.java
Index: JsfParameters.java
===================================================================
package org.jboss.seam.faces;
import static org.jboss.seam.annotations.Install.FRAMEWORK;
import java.util.Map;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import org.jboss.seam.InterceptionType;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Install;
import org.jboss.seam.annotations.Intercept;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.web.Parameters;
@Name("org.jboss.seam.core.parameters")
@Intercept(InterceptionType.NEVER)
@Scope(ScopeType.STATELESS)
@Install(precedence=FRAMEWORK, classDependencies="javax.faces.context.FacesContext")
public class JsfParameters extends Parameters
{
@Override
protected Object convertRequestParameter(String requestParameter, Class type)
{
if ( String.class.equals(type) ) return requestParameter;
FacesContext facesContext = FacesContext.getCurrentInstance();
if (facesContext==null)
{
throw new IllegalStateException("No FacesContext associated with current thread, cannot convert request parameter type");
}
else
{
Converter converter = facesContext.getApplication().createConverter(type);
if (converter==null)
{
throw new IllegalArgumentException("no converter for type: " + type);
}
UIViewRoot viewRoot = facesContext.getViewRoot();
return converter.getAsObject(
facesContext,
viewRoot==null ? new UIViewRoot() : viewRoot, //have to pass something here, or get a totally useless NPE from JSF
requestParameter );
}
}
@Override
public Map<String, String[]> getRequestParameters()
{
FacesContext facesContext = FacesContext.getCurrentInstance();
if ( facesContext != null )
{
return facesContext.getExternalContext().getRequestParameterValuesMap();
}
return super.getRequestParameters();
}
}
1.1 date: 2007/06/19 19:12:44; author: gavin; state: Exp;jboss-seam/src/main/org/jboss/seam/faces/JsfProvider.java
Index: JsfProvider.java
===================================================================
package org.jboss.seam.faces;
import static org.jboss.seam.InterceptionType.NEVER;
import static org.jboss.seam.ScopeType.STATELESS;
import static org.jboss.seam.annotations.Install.BUILT_IN;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.faces.model.DataModel;
import org.jboss.seam.Component;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Install;
import org.jboss.seam.annotations.Intercept;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.framework.Query;
import org.jboss.seam.jsf.ArrayDataModel;
import org.jboss.seam.jsf.ListDataModel;
import org.jboss.seam.jsf.MapDataModel;
import org.jboss.seam.jsf.SetDataModel;
@Name("org.jboss.seam.jsf.jsfProvider")
@Install(precedence=BUILT_IN, classDependencies="javax.faces.context.FacesContext")
@Scope(STATELESS)
@Intercept(NEVER)
public class JsfProvider
{
public DataModel getDataModel(Object value)
{
if (value instanceof List)
{
return new ListDataModel( (List) value );
}
else if (value instanceof Object[])
{
return new ArrayDataModel( (Object[]) value );
}
else if (value instanceof Map)
{
return new MapDataModel( (Map) value );
}
else if (value instanceof Set)
{
return new SetDataModel( (Set) value );
}
else
{
throw new IllegalArgumentException("unknown collection type: " + value.getClass());
}
}
public DataModel getDataModel(Query query)
{
return getDataModel( query.getResultList() );
}
public static JsfProvider instance()
{
return (JsfProvider) Component.getInstance(JsfProvider.class, ScopeType.STATELESS);
}
}
1.1 date: 2007/06/19 19:12:44; author: gavin; state: Exp;jboss-seam/src/main/org/jboss/seam/faces/Navigator.java
Index: Navigator.java
===================================================================
package org.jboss.seam.faces;
import java.util.Map;
import javax.faces.application.FacesMessage.Severity;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;
import org.jboss.seam.contexts.Contexts;
import org.jboss.seam.log.LogProvider;
import org.jboss.seam.log.Logging;
import org.jboss.seam.navigation.Pages;
import org.jboss.seam.util.Strings;
public abstract class Navigator
{
private static final LogProvider log = Logging.getLogProvider(Navigator.class);
/**
* Send an error.
*/
protected void error(int code, String message)
{
if ( log.isDebugEnabled() ) log.debug("sending error: " + code);
org.jboss.seam.faces.HttpError httpError = org.jboss.seam.faces.HttpError.instance();
if (message==null)
{
httpError.send(code);
}
else
{
httpError.send(code, message);
}
}
/**
* Redirect to the view id.
*/
protected void redirect(String viewId, Map<String, Object> parameters)
{
if ( Strings.isEmpty(viewId) )
{
viewId = Pages.getCurrentViewId();
}
if ( log.isDebugEnabled() ) log.debug("redirecting to: " + viewId);
JsfManager.instance().redirect(viewId, parameters, true);
}
/**
* Render the view id.
*/
protected void render(String viewId)
{
FacesContext facesContext = FacesContext.getCurrentInstance();
if ( !Strings.isEmpty(viewId) )
{
UIViewRoot viewRoot = facesContext.getApplication().getViewHandler()
.createView(facesContext, viewId);
facesContext.setViewRoot(viewRoot);
}
else
{
viewId = Pages.getViewId(facesContext); //just for the log message
}
if ( log.isDebugEnabled() ) log.debug("rendering: " + viewId);
facesContext.renderResponse();
}
protected static String getDisplayMessage(Exception e, String message)
{
if ( Strings.isEmpty(message) && e.getMessage()!=null )
{
return e.getMessage();
}
else
{
return message;
}
}
protected static void addFacesMessage(String message, Severity severity, String control, Object... params)
{
if ( Contexts.isConversationContextActive() )
{
if ( !Strings.isEmpty(message) )
{
if ( Strings.isEmpty(control) )
{
FacesMessages.instance().add(severity, message, params);
}
else
{
FacesMessages.instance().addToControl(control, severity, message, params);
}
}
}
}
}
1.1 date: 2007/06/19 19:12:44; author: gavin; state: Exp;jboss-seam/src/main/org/jboss/seam/faces/Redirect.java
Index: Redirect.java
===================================================================
package org.jboss.seam.faces;
import static org.jboss.seam.annotations.Install.BUILT_IN;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import javax.faces.context.FacesContext;
import org.jboss.seam.Component;
import org.jboss.seam.InterceptionType;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Install;
import org.jboss.seam.annotations.Intercept;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.PerNestedConversation;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.contexts.Contexts;
import org.jboss.seam.core.AbstractMutable;
import org.jboss.seam.core.Conversation;
import org.jboss.seam.navigation.Pages;
/**
* Convenient API for performing browser redirects with
* parameters.
*
* @author Gavin King
*/
@Name("org.jboss.seam.core.redirect")
@Intercept(InterceptionType.NEVER)
@Scope(ScopeType.CONVERSATION)
@Install(precedence=BUILT_IN, classDependencies="javax.faces.context.FacesContext")
@PerNestedConversation
public class Redirect extends AbstractMutable implements Serializable
{
private static final long serialVersionUID = 6947384474861235210L;
private String viewId;
private Map<String, Object> parameters = new HashMap<String, Object>();
private boolean conversationPropagationEnabled = true;
private boolean conversationBegun;
/**
* Get the JSF view id to redirect to
*/
public String getViewId()
{
return viewId;
}
/**
* Set the JSF view id to redirect to
*
* @param viewId any JSF view id
*/
public void setViewId(String viewId)
{
setDirty(this.viewId, viewId);
this.viewId = viewId;
}
/**
* Get all the request parameters that have been set
*/
public Map<String, Object> getParameters()
{
return parameters;
}
/**
* Set a request parameter value (to set a multi-valued
* request parameter, pass an array or collection as
* the value)
*/
public void setParameter(String name, Object value)
{
Object old = parameters.put(name, value);
setDirty(old, value);
}
/**
* Capture the view id and request parameters from the
* current request and squirrel them away so we can
* return here later in the conversation.
*
* @deprecated use captureCurrentView()
*/
public void captureCurrentRequest()
{
parameters.clear();
FacesContext context = FacesContext.getCurrentInstance();
parameters.putAll( context.getExternalContext().getRequestParameterMap() );
viewId = Pages.getViewId(context);
setDirty();
}
/**
* Capture the view id and page parameters from the
* current request and squirrel them away so we can
* return here later in the conversation. If no
* conversation is active, begin a conversation.
*
* @see Redirect#returnToCapturedView()
*/
public void captureCurrentView()
{
FacesContext context = FacesContext.getCurrentInstance();
parameters = Pages.instance().getViewRootValues(context);
viewId = Pages.getViewId(context);
conversationBegun = Conversation.instance().begin(true, false);
setDirty();
//if the request ends with an exception,
//the conversation context never gets
//flushed....
Contexts.getConversationContext().flush();
}
/**
* Should the conversation be propagated across the redirect?
* @return true by default
*/
public boolean isConversationPropagationEnabled()
{
return conversationPropagationEnabled;
}
/**
* Note that conversations are propagated by default
*/
public void setConversationPropagationEnabled(boolean conversationPropagationEnabled)
{
this.conversationPropagationEnabled = conversationPropagationEnabled;
}
/**
* Perform the redirect
*/
public void execute()
{
JsfManager.instance().redirect(viewId, parameters, conversationPropagationEnabled);
}
/**
* Redirect to the captured view, and end any conversation
* that began in captureCurrentView().
*
*@see Redirect#captureCurrentView()
*/
public boolean returnToCapturedView()
{
if (viewId!=null)
{
if (conversationBegun)
{
Conversation.instance().end();
}
execute();
return true;
}
else
{
return false;
}
}
//TODO: replacement for Conversation.endAndRedirect()
/*public boolean returnToParentView()
{
Manager manager = Manager.instance();
String viewId = manager.getParentConversationViewId();
if (viewId==null)
{
return false;
}
else
{
manager.redirect(viewId);
return true;
}
}*/
public static Redirect instance()
{
if ( !Contexts.isConversationContextActive() )
{
throw new IllegalStateException("No active conversation context");
}
return (Redirect) Component.getInstance(Redirect.class, ScopeType.CONVERSATION);
}
}
1.1 date: 2007/06/19 19:12:44; author: gavin; state: Exp;jboss-seam/src/main/org/jboss/seam/faces/RedirectException.java
Index: RedirectException.java
===================================================================
package org.jboss.seam.faces;
import java.io.IOException;
public class RedirectException extends RuntimeException
{
public RedirectException(IOException ioe)
{
super(ioe);
}
}
1.1 date: 2007/06/19 19:12:44; author: gavin; state: Exp;jboss-seam/src/main/org/jboss/seam/faces/Selector.java
Index: Selector.java
===================================================================
package org.jboss.seam.faces;
import java.io.Serializable;
import javax.faces.context.FacesContext;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import org.jboss.seam.core.AbstractMutable;
/**
* Support for selector objects which remember their selection as a cookie
*
* @author Gavin King
*/
public abstract class Selector extends AbstractMutable implements Serializable
{
private boolean cookieEnabled;
private int cookieMaxAge = 31536000; //1 year
/**
* Is the cookie enabled?
* @return false by default
*/
public boolean isCookieEnabled()
{
return cookieEnabled;
}
public void setCookieEnabled(boolean cookieEnabled)
{
setDirty(this.cookieEnabled, cookieEnabled);
this.cookieEnabled = cookieEnabled;
}
/**
* The max age of the cookie
* @return 1 year by default
*/
public int getCookieMaxAge()
{
return cookieMaxAge;
}
public void setCookieMaxAge(int cookieMaxAge)
{
this.cookieMaxAge = cookieMaxAge;
}
/**
* Override to define the cookie name
*/
protected abstract String getCookieName();
/**
* Get the value of the cookie
*/
protected String getCookieValueIfEnabled()
{
return isCookieEnabled() ?
getCookieValue() : null;
}
protected Cookie getCookie()
{
FacesContext ctx = FacesContext.getCurrentInstance();
if (ctx != null)
{
return (Cookie) ctx.getExternalContext().getRequestCookieMap()
.get( getCookieName() );
}
else
{
return null;
}
}
protected String getCookieValue()
{
Cookie cookie = getCookie();
return cookie==null ? null : cookie.getValue();
}
protected void clearCookieValue()
{
Cookie cookie = getCookie();
if ( cookie!=null )
{
HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
cookie.setValue(null);
cookie.setMaxAge(0);
response.addCookie(cookie);
}
}
/**
* Set the cookie
*/
protected void setCookieValueIfEnabled(String value)
{
FacesContext ctx = FacesContext.getCurrentInstance();
if ( isCookieEnabled() && ctx != null)
{
HttpServletResponse response = (HttpServletResponse) ctx.getExternalContext().getResponse();
Cookie cookie = new Cookie( getCookieName(), value );
cookie.setMaxAge( getCookieMaxAge() );
response.addCookie(cookie);
}
}
}
1.1 date: 2007/06/19 19:12:44; author: gavin; state: Exp;jboss-seam/src/main/org/jboss/seam/faces/Switcher.java
Index: Switcher.java
===================================================================
package org.jboss.seam.faces;
import static org.jboss.seam.InterceptionType.NEVER;
import static org.jboss.seam.annotations.Install.BUILT_IN;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import javax.faces.model.SelectItem;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Create;
import org.jboss.seam.annotations.Install;
import org.jboss.seam.annotations.Intercept;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.core.ConversationEntries;
import org.jboss.seam.core.ConversationEntry;
import org.jboss.seam.core.Manager;
import org.jboss.seam.core.ServletSession;
/**
* Support for the conversation switcher drop-down menu.
*
* @author Gavin King
*/
@Scope(ScopeType.PAGE)
@Name("org.jboss.seam.core.switcher")
@Install(precedence=BUILT_IN, classDependencies="javax.faces.context.FacesContext")
@Intercept(NEVER)
public class Switcher implements Serializable
{
private static final long serialVersionUID = -6403911073853051938L;
private List<SelectItem> selectItems;
private String conversationIdOrOutcome;
private String resultingConversationIdOrOutcome;
@Create
public void createSelectItems()
{
ConversationEntries conversationEntries = ConversationEntries.getInstance();
if (conversationEntries==null)
{
selectItems = Collections.EMPTY_LIST;
}
else
{
Set<ConversationEntry> orderedEntries = new TreeSet<ConversationEntry>();
orderedEntries.addAll( conversationEntries.getConversationEntries() );
selectItems = new ArrayList<SelectItem>( conversationEntries.size() );
for ( ConversationEntry entry: orderedEntries )
{
if ( entry.isDisplayable() && !ServletSession.instance().isInvalid() )
{
selectItems.add( new SelectItem( entry.getId(), entry.getDescription() ) );
}
}
}
}
public List<SelectItem> getSelectItems()
{
return selectItems;
}
private String getLongRunningConversationId()
{
Manager manager = Manager.instance();
if ( manager.isLongRunningConversation() )
{
return manager.getCurrentConversationId();
}
else if ( manager.isNestedConversation() )
{
return manager.getParentConversationId();
}
else
{
//TODO: is there any way to set it to the current outcome, instead of null?
return null;
}
}
public String getConversationIdOrOutcome()
{
return resultingConversationIdOrOutcome==null ?
getLongRunningConversationId() :
resultingConversationIdOrOutcome;
}
public void setConversationIdOrOutcome(String selectedId)
{
this.conversationIdOrOutcome = selectedId;
}
public String select()
{
boolean isOutcome = conversationIdOrOutcome==null || !Character.isDigit( conversationIdOrOutcome.charAt(0) );
String actualOutcome;
if (isOutcome)
{
resultingConversationIdOrOutcome = conversationIdOrOutcome;
actualOutcome = conversationIdOrOutcome;
}
else
{
ConversationEntry ce = ConversationEntries.instance().getConversationEntry(conversationIdOrOutcome);
if (ce!=null)
{
resultingConversationIdOrOutcome = ce.getId();
ce.redirect();
}
actualOutcome = null;
}
return actualOutcome;
}
}
1.1 date: 2007/06/19 19:12:44; author: gavin; state: Exp;jboss-seam/src/main/org/jboss/seam/faces/UiComponent.java
Index: UiComponent.java
===================================================================
package org.jboss.seam.faces;
import static org.jboss.seam.InterceptionType.NEVER;
import static org.jboss.seam.ScopeType.STATELESS;
import static org.jboss.seam.annotations.Install.BUILT_IN;
import java.util.AbstractMap;
import java.util.Map;
import java.util.Set;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import org.jboss.seam.annotations.Install;
import org.jboss.seam.annotations.Intercept;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.Unwrap;
@Name("org.jboss.seam.core.uiComponent")
@Intercept(NEVER)
@Scope(STATELESS)
@Install(precedence=BUILT_IN, classDependencies="javax.faces.context.FacesContext")
public class UiComponent
{
@Unwrap
public Map<String, UIComponent> getViewComponents()
{
return new AbstractMap<String, UIComponent>()
{
@Override
public Set<Map.Entry<String, UIComponent>> entrySet()
{
throw new UnsupportedOperationException();
}
@Override
public UIComponent get(Object key)
{
if ( !(key instanceof String) ) return null;
return FacesContext.getCurrentInstance().getViewRoot().findComponent( (String) key );
}
};
}
}
1.1 date: 2007/06/19 19:12:44; author: gavin; state: Exp;jboss-seam/src/main/org/jboss/seam/faces/UserPrincipal.java
Index: UserPrincipal.java
===================================================================
package org.jboss.seam.faces;
import static org.jboss.seam.InterceptionType.NEVER;
import static org.jboss.seam.annotations.Install.BUILT_IN;
import java.security.Principal;
import javax.faces.context.FacesContext;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import org.jboss.seam.Component;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Install;
import org.jboss.seam.annotations.Intercept;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.Unwrap;
import org.jboss.seam.contexts.Contexts;
import org.jboss.seam.web.ServletContexts;
/**
* Manager component for the current user Principal
* exposed via the JSF ExternalContext.
*
* @author Gavin King
*/
@Scope(ScopeType.APPLICATION)
@Intercept(NEVER)
@Name("org.jboss.seam.core.userPrincipal")
@Install(precedence=BUILT_IN, classDependencies="javax.faces.context.FacesContext")
public class UserPrincipal
{
@Unwrap
public Principal getUserPrincipal()
{
FacesContext facesContext = FacesContext.getCurrentInstance();
if ( facesContext != null )
{
return facesContext.getExternalContext().getUserPrincipal();
}
ServletRequest servletRequest = ServletContexts.instance().getRequest();
if ( servletRequest != null )
{
return ( (HttpServletRequest) servletRequest ).getUserPrincipal();
}
return null;
}
public static Principal instance()
{
if ( !Contexts.isApplicationContextActive() )
{
throw new IllegalStateException("No active application scope");
}
return (Principal) Component.getInstance(UserPrincipal.class, ScopeType.APPLICATION);
}
}
1.1 date: 2007/06/19 19:12:44; author: gavin; state: Exp;jboss-seam/src/main/org/jboss/seam/faces/Validation.java
Index: Validation.java
===================================================================
package org.jboss.seam.faces;
import static org.jboss.seam.annotations.Install.BUILT_IN;
import javax.faces.context.FacesContext;
import org.jboss.seam.Component;
import org.jboss.seam.InterceptionType;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Install;
import org.jboss.seam.annotations.Intercept;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.contexts.Contexts;
import org.jboss.seam.core.Events;
/**
* Allows the application to determine whether the JSF validation
* phase completed successfully, or if a validation failure
* occurred.
*
* @author Gavin king
*
*/
@Name("org.jboss.seam.core.validation")
@Intercept(InterceptionType.NEVER)
@Install(precedence=BUILT_IN, classDependencies="javax.faces.context.FacesContext")
public class Validation
{
private boolean succeeded;
private boolean failed;
public static Validation instance()
{
if ( !Contexts.isEventContextActive() )
{
throw new IllegalStateException("No active event scope");
}
return (Validation) Component.getInstance(Validation.class, ScopeType.EVENT);
}
public void afterProcessValidations(FacesContext facesContext)
{
failed = facesContext.getRenderResponse();
if (failed)
{
Events.instance().raiseEvent("org.jboss.seam.validationFailed");
}
succeeded = !failed;
}
public boolean isSucceeded()
{
return succeeded;
}
public boolean isFailed()
{
return failed;
}
public void fail()
{
failed = true;
succeeded = false;
}
}
More information about the jboss-cvs-commits
mailing list