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.shared_orchestra.renderkit.html;
20  
21  import java.io.IOException;
22  import java.util.List;
23  
24  import javax.faces.application.ViewHandler;
25  import javax.faces.component.UIComponent;
26  import javax.faces.component.UIViewRoot;
27  import javax.faces.context.FacesContext;
28  import javax.faces.render.Renderer;
29  
30  import org.apache.myfaces.shared_orchestra.renderkit.JSFAttr;
31  
32  
33  /**
34   * @author Manfred Geiler (latest modification by $Author: grantsmith $)
35   * @version $Revision: 472618 $ $Date: 2006-11-08 15:06:54 -0500 (Wed, 08 Nov 2006) $
36   */
37  public abstract class HtmlRenderer
38          extends Renderer
39  {
40      /**
41       * Return the list of children of the specified component.
42       * <p>
43       * This default implementation simply returns component.getChildren().
44       * However this method should always be used in order to allow
45       * renderer subclasses to override it and provide filtered or
46       * reordered views of the component children to rendering
47       * methods defined in their ancestor classes.
48       * <p>
49       * Any method that overrides this to "hide" child components
50       * should also override the getChildCount method.
51       * 
52       * @return a list of UIComponent objects.
53       */
54      public List getChildren(UIComponent component) 
55      {
56          return component.getChildren();
57      }
58  
59      /**
60       * Return the number of children of the specified component.
61       * <p>
62       * See {@link #getChildren(UIComponent)} for more information.
63       */
64      public int getChildCount(UIComponent component) 
65      {
66          return component.getChildCount();
67      }
68      
69      /**
70       * @param facesContext
71       * @return String A String representing the action URL
72       */
73      protected String getActionUrl(FacesContext facesContext)
74      {
75          ViewHandler viewHandler = facesContext.getApplication().getViewHandler();
76          String viewId = facesContext.getViewRoot().getViewId();
77          return viewHandler.getActionURL(facesContext, viewId);
78      }
79      
80      /**
81       * Renders the client ID as an "id".
82       */
83      protected void renderId(
84        FacesContext context,
85        UIComponent  component) throws IOException
86      {
87        if (shouldRenderId(context, component))
88        {
89          String clientId = getClientId(context, component);
90          context.getResponseWriter().writeAttribute(HTML.ID_ATTR, clientId, JSFAttr.ID_ATTR);
91        }
92      }
93  
94      /**
95       * Returns the client ID that should be used for rendering (if
96       * {@link #shouldRenderId} returns true).
97       */
98      protected String getClientId(
99        FacesContext context,
100       UIComponent  component)
101     {
102       return component.getClientId(context);
103     }
104 
105     /**
106      * Returns true if the component should render an ID.  Components
107      * that deliver events should always return "true".
108      * @todo Is this a bottleneck?  If so, optimize!
109      */
110     protected boolean shouldRenderId(
111       FacesContext context,
112       UIComponent  component)
113     {
114       String id = component.getId();
115 
116       // Otherwise, if ID isn't set, don't bother
117       if (id == null)
118         return false;
119       
120       // ... or if the ID was generated, don't bother
121       if (id.startsWith(UIViewRoot.UNIQUE_ID_PREFIX))
122         return false;
123 
124       return true;
125     }
126     
127     /**
128      * Coerces an object into a URI, accounting for JSF rules
129      * with initial slashes.
130      */
131     static public String toUri(Object o)
132     {
133       if (o == null)
134         return null;
135       
136       String uri = o.toString();
137       if (uri.startsWith("/"))
138       {
139         // Treat two slashes as server-relative
140         if (uri.startsWith("//"))
141         {
142           uri = uri.substring(1);
143         }
144         else
145         {
146           FacesContext fContext = FacesContext.getCurrentInstance();
147           uri = fContext.getExternalContext().getRequestContextPath() + uri;
148         }
149       }
150 
151       return uri;
152     }
153 }