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.tomahawk.util;
20  
21  import java.util.HashMap;
22  import java.util.Map;
23  
24  import javax.faces.application.Resource;
25  import javax.faces.application.ResourceHandler;
26  import javax.faces.component.UIOutput;
27  import javax.faces.context.FacesContext;
28  
29  import org.apache.myfaces.shared_tomahawk.renderkit.JSFAttr;
30  import org.apache.myfaces.shared_tomahawk.renderkit.html.HTML;
31  import org.apache.myfaces.shared_tomahawk.renderkit.html.util.ResourceUtils;
32  
33  /**
34   * Utility class for add resources using JSF 2.0 Resource API. It is expected
35   * this methods be called from a listener for PreRenderViewAddResourceEvent.
36   * 
37   * @author Leonardo Uribe
38   * @since 1.1.10
39   *
40   */
41  public class TomahawkResourceUtils
42  {
43      public static final String HEAD_LOCATION = "head";
44      public static final String BODY_LOCATION = HTML.BODY_ELEM;
45      public static final String FORM_LOCATION = HTML.FORM_ELEM;
46      public static final String ADDED_RESOURCES_SET = "org.apache.myfaces.ADDED_RESOURCES_SET";
47      
48      /**
49       * Return a set of already rendered resources by this renderer on the current
50       * request. 
51       * 
52       * @param facesContext
53       * @return
54       */
55      @SuppressWarnings("unchecked")
56      private static Map<String, Boolean> getAddedResources(FacesContext facesContext)
57      {
58          Map<String, Boolean> map = (Map<String, Boolean>) facesContext.getAttributes().get(ADDED_RESOURCES_SET);
59          if (map == null)
60          {
61              map = new HashMap<String, Boolean>();
62              facesContext.getAttributes().put(ADDED_RESOURCES_SET,map);
63          }
64          return map;
65      }
66      
67      public static void resetAddedResources(FacesContext facesContext)
68      {
69          facesContext.getAttributes().remove(ADDED_RESOURCES_SET);
70      }
71      
72      public static void markResourceAsAdded(FacesContext facesContext, String libraryName, String resourceName)
73      {
74          getAddedResources(facesContext).put(libraryName != null ? libraryName+'/'+resourceName : resourceName, Boolean.TRUE);
75      }
76      
77      public static boolean isAddedResource(FacesContext facesContext, String libraryName, String resourceName)
78      {
79          return getAddedResources(facesContext).containsKey(libraryName != null ? libraryName+'/'+resourceName : resourceName);
80      }
81  
82      /**
83       * Add the script on PreRenderViewAddResourceEvent. The expected component resource instance
84       * has "transient" property as true.
85       * 
86       * @param facesContext
87       * @param libraryName
88       * @param resourceName
89       */
90      public static void addOutputScriptResource(final FacesContext facesContext, final String libraryName, final String resourceName)
91      {
92          if (isAddedResource(facesContext, libraryName, resourceName))
93          {
94              return;
95          }
96          
97          UIOutput outputScript = (UIOutput) facesContext.getApplication().
98              createComponent(facesContext, ResourceUtils.JAVAX_FACES_OUTPUT_COMPONENT_TYPE, ResourceUtils.DEFAULT_SCRIPT_RENDERER_TYPE);
99          outputScript.getAttributes().put(JSFAttr.LIBRARY_ATTR, libraryName);
100         outputScript.getAttributes().put(JSFAttr.NAME_ATTR, resourceName);
101         outputScript.setTransient(true);
102         outputScript.setId(facesContext.getViewRoot().createUniqueId());
103         facesContext.getViewRoot().addComponentResource(facesContext, outputScript);
104         
105         markResourceAsAdded(facesContext, libraryName, resourceName);
106     }
107     
108     public static void addOutputScriptResource(final FacesContext facesContext, final String libraryName, final String resourceName, final String target)
109     {
110         if (isAddedResource(facesContext, libraryName, resourceName))
111         {
112             return;
113         }
114         
115         UIOutput outputScript = (UIOutput) facesContext.getApplication().
116             createComponent(facesContext, ResourceUtils.JAVAX_FACES_OUTPUT_COMPONENT_TYPE, ResourceUtils.DEFAULT_SCRIPT_RENDERER_TYPE);
117         outputScript.getAttributes().put(JSFAttr.LIBRARY_ATTR, libraryName);
118         outputScript.getAttributes().put(JSFAttr.NAME_ATTR, resourceName);
119         outputScript.setTransient(true);
120         outputScript.setId(facesContext.getViewRoot().createUniqueId());
121         facesContext.getViewRoot().addComponentResource(facesContext, outputScript);
122         
123         markResourceAsAdded(facesContext, libraryName, resourceName);
124     }
125     
126     public static void addOutputStylesheetResource(final FacesContext facesContext, final String libraryName, final String resourceName)
127     {
128         if (isAddedResource(facesContext, libraryName, resourceName))
129         {
130             return;
131         }
132 
133         UIOutput outputStylesheet = (UIOutput) facesContext.getApplication().
134             createComponent(facesContext, ResourceUtils.JAVAX_FACES_OUTPUT_COMPONENT_TYPE, ResourceUtils.DEFAULT_STYLESHEET_RENDERER_TYPE);
135         outputStylesheet.getAttributes().put(JSFAttr.LIBRARY_ATTR, libraryName);
136         outputStylesheet.getAttributes().put(JSFAttr.NAME_ATTR, resourceName);
137         outputStylesheet.setTransient(true);
138         outputStylesheet.setId(facesContext.getViewRoot().createUniqueId());
139         facesContext.getViewRoot().addComponentResource(facesContext, outputStylesheet);
140         
141         markResourceAsAdded(facesContext, libraryName, resourceName);
142     }
143     
144     public static void addInlineOutputStylesheetResource(final FacesContext facesContext, Object value)
145     {
146         UIOutput stylesheet = (UIOutput) facesContext.getApplication().createComponent(facesContext, 
147                 ResourceUtils.JAVAX_FACES_OUTPUT_COMPONENT_TYPE, ResourceUtils.JAVAX_FACES_TEXT_RENDERER_TYPE);
148         UIOutput outputStylesheet = (UIOutput) facesContext.getApplication().
149             createComponent(facesContext, ResourceUtils.JAVAX_FACES_OUTPUT_COMPONENT_TYPE, ResourceUtils.DEFAULT_STYLESHEET_RENDERER_TYPE);
150         stylesheet.setValue( value);
151         stylesheet.setTransient(true);
152         stylesheet.setId(facesContext.getViewRoot().createUniqueId());
153         outputStylesheet.getChildren().add(stylesheet);
154         outputStylesheet.setTransient(true);
155         outputStylesheet.setId(facesContext.getViewRoot().createUniqueId());
156         facesContext.getViewRoot().addComponentResource(facesContext, outputStylesheet);
157     }
158     
159     public static void addInlineOutputScriptResource(final FacesContext facesContext, String target, Object value)
160     {
161         UIOutput script = (UIOutput) facesContext.getApplication().createComponent(facesContext, 
162                 ResourceUtils.JAVAX_FACES_OUTPUT_COMPONENT_TYPE, ResourceUtils.JAVAX_FACES_TEXT_RENDERER_TYPE);
163         UIOutput outputScript = (UIOutput) facesContext.getApplication().
164             createComponent(facesContext, ResourceUtils.JAVAX_FACES_OUTPUT_COMPONENT_TYPE, ResourceUtils.DEFAULT_SCRIPT_RENDERER_TYPE);
165         if (target != null)
166         {
167             script.getAttributes().put(JSFAttr.TARGET_ATTR, target);
168         }
169         script.setValue( value);
170         script.setTransient(true);
171         script.setId(facesContext.getViewRoot().createUniqueId());
172         outputScript.getChildren().add(script);
173         outputScript.setTransient(true);
174         outputScript.setId(facesContext.getViewRoot().createUniqueId());
175         facesContext.getViewRoot().addComponentResource(facesContext, outputScript);
176     }
177     
178     public static String getIconSrc(final FacesContext facesContext, final String libraryName, final String resourceName)
179     {
180         final ResourceHandler resourceHandler = facesContext.getApplication().getResourceHandler();
181         final Resource resource;
182         
183         if ((libraryName != null) && (libraryName.length() > 0))
184         {
185             resource = resourceHandler.createResource(resourceName, libraryName);
186         }
187         else
188         {
189             resource = resourceHandler.createResource(resourceName);    
190         }
191         
192         if (resource == null)
193         {
194             return "RES_NOT_FOUND";
195         }
196         else
197         {
198             return resource.getRequestPath();
199         }
200     }
201 }