View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.myfaces.component.visit;
20  
21  import java.util.Collection;
22  import java.util.Collections;
23  import java.util.EnumSet;
24  import java.util.Set;
25  
26  import javax.faces.component.NamingContainer;
27  import javax.faces.component.UIComponent;
28  import javax.faces.component.visit.VisitCallback;
29  import javax.faces.component.visit.VisitContext;
30  import javax.faces.component.visit.VisitHint;
31  import javax.faces.component.visit.VisitResult;
32  import javax.faces.context.FacesContext;
33  
34  /**
35   * <p>A VisitContext implementation that is
36   * used when performing a full component tree visit.</p>
37   * 
38   * @author Werner Punz, Blake Sullivan (latest modification by $Author$)
39   * @version $Rev$ $Date$
40   */
41  public class FullVisitContext extends VisitContext
42  {
43  
44    /**
45     * Creates a FullVisitorContext instance.
46     * @param facesContext the FacesContext for the current request
47     * @throws NullPointerException  if {@code facesContext}
48     *                               is {@code null}
49     */    
50    public FullVisitContext(FacesContext facesContext)
51    {
52      this(facesContext, null);
53    }
54  
55    /**
56     * Creates a FullVisitorContext instance with the specified
57     * hints.
58     *
59     * @param facesContext the FacesContext for the current request
60     * @param hints a the VisitHints for this visit
61     * @param phaseId PhaseId, if any that visit is ocurring under
62     * @throws NullPointerException  if {@code facesContext}
63     *                               is {@code null}
64     * @throws IllegalArgumentException if the phaseId is specified and
65     * hints does not contain VisitHint.EXECUTE_LIFECYCLE
66     */    
67    public FullVisitContext(
68      FacesContext facesContext,
69      Set<VisitHint> hints)
70    {
71      if (facesContext == null)
72      {
73          throw new NullPointerException();
74      }
75  
76      _facesContext = facesContext;
77  
78      // Copy and store hints - ensure unmodifiable and non-empty
79      EnumSet<VisitHint> hintsEnumSet = ((hints == null) || (hints.isEmpty()))
80                                            ? EnumSet.noneOf(VisitHint.class)
81                                            : EnumSet.copyOf(hints);
82  
83      _hints = Collections.unmodifiableSet(hintsEnumSet);
84    }
85  
86    /**
87     * @see VisitContext#getFacesContext VisitContext.getFacesContext()
88     */
89    @Override
90    public FacesContext getFacesContext()
91    {
92      return _facesContext;
93    }
94  
95    /**
96     * @see VisitContext#getIdsToVisit VisitContext.getIdsToVisit()
97     */
98    @Override
99    public Collection<String> getIdsToVisit()
100   {
101     // We always visits all ids
102     return ALL_IDS;
103   }
104 
105   /**
106    * @see VisitContext#getSubtreeIdsToVisit VisitContext.getSubtreeIdsToVisit()
107    */
108   @Override
109   public Collection<String> getSubtreeIdsToVisit(UIComponent component)
110   {
111     // Make sure component is a NamingContainer
112     if (!(component instanceof NamingContainer))
113     {
114       throw new IllegalArgumentException("Component is not a NamingContainer: " + component);
115     }
116 
117     // We always visits all ids
118     return ALL_IDS;
119   }
120 
121   /**
122    * @see VisitContext#getHints VisitContext.getHints
123    */
124   @Override
125   public Set<VisitHint> getHints()
126   {
127     return _hints;
128   }
129 
130   /**
131    * @see VisitContext#invokeVisitCallback VisitContext.invokeVisitCallback()
132    */
133   @Override
134   public VisitResult invokeVisitCallback(
135     UIComponent component, 
136     VisitCallback callback)
137   {
138     // Nothing interesting here - just invoke the callback.
139     // (PartialVisitContext.invokeVisitCallback() does all of the 
140     // interesting work.)
141     return callback.visit(this, component);
142   }
143 
144   // The FacesContext for this request
145   private final FacesContext _facesContext;
146 
147   // Our visit hints
148   private final Set<VisitHint> _hints;
149 }