[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