001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one
003     * or more contributor license agreements.  See the NOTICE file
004     * distributed with this work for additional information
005     * regarding copyright ownership.  The ASF licenses this file
006     * to you under the Apache License, Version 2.0 (the
007     * "License"); you may not use this file except in compliance
008     * with the License.  You may obtain a copy of the License at
009     *
010     *   http://www.apache.org/licenses/LICENSE-2.0
011     *
012     * Unless required by applicable law or agreed to in writing,
013     * software distributed under the License is distributed on an
014     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015     * KIND, either express or implied.  See the License for the
016     * specific language governing permissions and limitations
017     * under the License.
018     */
019    
020    package org.apache.myfaces.tobago.context;
021    
022    import org.apache.myfaces.tobago.renderkit.html.CommandRendererHelper;
023    
024    import javax.faces.component.UIViewRoot;
025    import javax.faces.context.FacesContext;
026    import java.util.ArrayList;
027    import java.util.List;
028    import java.util.Locale;
029    
030    public class ResourceManagerUtil {
031    
032      private ResourceManagerUtil() {
033      }
034    
035      public static String getProperty(
036          FacesContext facesContext, String bundle, String key) {
037        return ResourceManagerFactory.getResourceManager(facesContext)
038            .getProperty(facesContext.getViewRoot(), bundle, key);
039      }
040    
041      public static String getPropertyNotNull(
042          FacesContext facesContext, String bundle, String key) {
043        UIViewRoot viewRoot = facesContext.getViewRoot();
044        String result = ResourceManagerFactory.getResourceManager(facesContext)
045            .getProperty(viewRoot, bundle, key);
046        if (result == null) {
047          return "???" + key + "???";
048        } else {
049          return result;
050        }
051      }
052    
053      /**
054       * Searchs for an image and return it with the context path
055       */
056      public static String getImageWithPath(
057          FacesContext facesContext, String name) {
058        return facesContext.getExternalContext().getRequestContextPath()
059            + ResourceManagerFactory.getResourceManager(facesContext)
060            .getImage(facesContext.getViewRoot(), name);
061      }
062    
063      /**
064       * Searchs for an image and return it with the context path
065       */
066      public static String getImageWithPath(
067          FacesContext facesContext, String name, boolean ignoreMissing) {
068        String image = ResourceManagerFactory.getResourceManager(facesContext)
069            .getImage(facesContext.getViewRoot(), name, ignoreMissing);
070        if (image == null) {
071          return null;
072        } else {
073          return facesContext.getExternalContext().getRequestContextPath() + image;
074        }
075      }
076    
077      public static List<String> getStyles(FacesContext facesContext, String name) {
078        UIViewRoot viewRoot = facesContext.getViewRoot();
079        String contextPath = facesContext.getExternalContext().getRequestContextPath();
080        String[] styles = ResourceManagerFactory.getResourceManager(facesContext).getStyles(viewRoot, name);
081        return addContextPath(styles, contextPath);
082      }
083    
084      private static List<String> addContextPath(String[] strings, String contextPath) {
085        List<String> withContext = new ArrayList<String>(strings.length);
086        for (String string : strings) {
087          withContext.add(contextPath + string);
088        }
089        return withContext;
090      }
091    
092      public static List<String> getScripts(FacesContext facesContext, String name) {
093        UIViewRoot viewRoot = facesContext.getViewRoot();
094        String contextPath = facesContext.getExternalContext().getRequestContextPath();
095        String[] scripts = ResourceManagerFactory.getResourceManager(facesContext)
096            .getScripts(viewRoot, name);
097        return addContextPath(scripts, contextPath);
098      }
099    
100      public static String getScriptsAsJSArray(FacesContext facesContext, String[] names) {
101        List<String> fileNames = new ArrayList<String>();
102        for (String name : names) {
103          fileNames.addAll(getScripts(facesContext, name));
104        }
105        return toJSArray(fileNames);
106      }
107    
108      public static String getStylesAsJSArray(FacesContext facesContext, String[] names) {
109        List<String> fileNames = new ArrayList<String>();
110        for (String name : names) {
111          fileNames.addAll(getStyles(facesContext, name));
112        }
113        return toJSArray(fileNames);
114      }
115    
116      public static String toJSArray(List<String> list) {
117        StringBuilder sb = new StringBuilder();
118        for (String name : list) {
119          if (sb.length() > 0) {
120            sb.append(", ");
121          }
122          sb.append('\'');
123          sb.append(name);
124          sb.append('\'');
125        }
126        return "[" + sb.toString() + "]";
127      }
128    
129      public static String getDisabledImageWithPath(FacesContext facesContext, String image) {
130        String filename = ResourceUtils.addPostfixToFilename(image, "Disabled");
131        return getImageWithPath(facesContext, filename, true);
132      }
133    
134      public static String getImageWithPath(FacesContext facesContext, String image, CommandRendererHelper helper) {
135        String imageWithPath = null;
136        if (helper.isDisabled()) {
137          imageWithPath = getDisabledImageWithPath(facesContext, image);
138        }
139        if (imageWithPath == null) {
140          imageWithPath = getImageWithPath(facesContext, image);
141        }
142        return imageWithPath;
143      }
144    
145      public static String getBlankPage(FacesContext facesContext) {
146        return facesContext.getExternalContext().getRequestContextPath()
147            + "/org/apache/myfaces/tobago/renderkit/html/standard/blank.html";
148      }
149    
150      public static String getPageWithoutContextPath(FacesContext facesContext, String name) {
151        return ResourceManagerFactory.getResourceManager(facesContext).getImage(facesContext.getViewRoot(), name);
152      }
153    
154      /**
155       * Detects if the value is an absolute resource or if the value has to be processed by the
156       * theme mechanism. A resource will be treated as absolute, if the value starts with HTTP:, HTTPS:, FTP: or a slash.
157       * The case will be ignored by this check. Null values will return true.
158       *
159       * @param value the given resource link.
160       * @return true if it is an external or absolute resource.
161       */
162      public static boolean isAbsoluteResource(String value) {
163        if (value == null) {
164          return true;
165        }
166        String upper = value.toUpperCase(Locale.ENGLISH);
167        return (upper.startsWith("/")
168            || upper.startsWith("HTTP:")
169            || upper.startsWith("HTTPS:")
170            || upper.startsWith("FTP:"));
171      }
172    }