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.resource;
20  
21  import java.io.InputStream;
22  import java.net.MalformedURLException;
23  import java.net.URL;
24  import java.util.Iterator;
25  import java.util.Set;
26  import java.util.regex.Pattern;
27  
28  import javax.faces.context.FacesContext;
29  
30  /**
31   * A resource loader implementation which loads resources from the webapp root. It uses the methods on ExternalContext
32   * for handle resources.
33   * 
34   */
35  public class ExternalContextResourceLoader extends ResourceLoader
36  {
37      /**
38       * It checks version like this: /1/, /1_0/, /1_0_0/, /100_100/
39       * 
40       * Used on getLibraryVersion to filter resource directories
41       **/
42      protected static final Pattern VERSION_CHECKER = Pattern.compile("/\\p{Digit}+(_\\p{Digit}*)*/");
43  
44      /**
45       * It checks version like this: /1.js, /1_0.js, /1_0_0.js, /100_100.js
46       * 
47       * Used on getResourceVersion to filter resources
48       **/
49      protected static final Pattern RESOURCE_VERSION_CHECKER = Pattern.compile("/\\p{Digit}+(_\\p{Digit}*)*\\..*");
50  
51      public ExternalContextResourceLoader(String prefix)
52      {
53          super(prefix);
54      }
55  
56      protected Set<String> getResourcePaths(String path)
57      {
58          return FacesContext.getCurrentInstance().getExternalContext().getResourcePaths(getPrefix() + '/' + path);
59      }
60  
61      @Override
62      public String getResourceVersion(String path)
63      {
64          String resourceVersion = null;
65          Set<String> resourcePaths = this.getResourcePaths(path);
66          if (getPrefix() != null)
67          {
68              path = getPrefix() + '/' + path;
69          }
70  
71          if (null != resourcePaths && !resourcePaths.isEmpty())
72          {
73              // resourceVersion = // execute the comment
74              // Look in the resourcePaths for versioned resources.
75              // If one or more versioned resources are found, take
76              // the one with the "highest" version number as the value
77              // of resourceVersion. If no versioned libraries
78              // are found, let resourceVersion remain null.
79              for (String resourcePath : resourcePaths)
80              {
81                  String version = "";
82                  if (path.length() < resourcePath.length()) 
83                  {
84                      version = resourcePath.substring(path.length());
85                  }
86  
87                  if (RESOURCE_VERSION_CHECKER.matcher(version).matches())
88                  {
89                      version = version.substring(1, version.lastIndexOf('.'));
90                      if (resourceVersion == null)
91                      {
92                          resourceVersion = version;
93                      }
94                      else if (getVersionComparator().compare(resourceVersion, version) < 0)
95                      {
96                          resourceVersion = version;
97                      }
98                  }
99              }
100             //Since it is a directory and no version was found, set as invalid
101             if (resourceVersion == null)
102             {
103                 resourceVersion = VERSION_INVALID;
104             }
105         }
106         return resourceVersion;
107     }
108 
109     @Override
110     public String getLibraryVersion(String path)
111     {
112         String libraryVersion = null;
113         Set<String> libraryPaths = this.getResourcePaths(path);
114         path = getPrefix() + '/' + path;
115         if (null != libraryPaths && !libraryPaths.isEmpty())
116         {
117             // Look in the libraryPaths for versioned libraries.
118             // If one or more versioned libraries are found, take
119             // the one with the "highest" version number as the value
120             // of libraryVersion. If no versioned libraries
121             // are found, let libraryVersion remain null.
122 
123             for (Iterator<String> it = libraryPaths.iterator(); it.hasNext();)
124             {
125                 String libraryPath = it.next();
126                 String version = "";
127                 if (path.length() < libraryPath.length())
128                 {
129                     version = libraryPath.substring(path.length());
130                 }
131 
132                 if (VERSION_CHECKER.matcher(version).matches())
133                 {
134                     version = version.substring(1, version.length() - 1);
135                     if (libraryVersion == null)
136                     {
137                         libraryVersion = version;
138                     }
139                     else if (getVersionComparator().compare(libraryVersion, version) < 0)
140                     {
141                         libraryVersion = version;
142                     }
143                 }
144             }
145         }
146         return libraryVersion;
147     }
148 
149     //@Override
150     public URL getResourceURL(String resourceId)
151     {
152         try
153         {
154             return FacesContext.getCurrentInstance().getExternalContext().getResource(
155                 getPrefix() + '/' + resourceId);
156         }
157         catch (MalformedURLException e)
158         {
159             return null;
160         }
161     }
162     
163     @Override
164     public URL getResourceURL(ResourceMeta resourceMeta)
165     {
166         return getResourceURL(resourceMeta.getResourceIdentifier());
167     }
168 
169     @Override
170     public InputStream getResourceInputStream(ResourceMeta resourceMeta)
171     {
172         return FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream(
173             getPrefix() + '/' + resourceMeta.getResourceIdentifier());
174     }
175 
176     @Override
177     public ResourceMeta createResourceMeta(String prefix, String libraryName, String libraryVersion,
178                                            String resourceName, String resourceVersion)
179     {
180         return new ResourceMetaImpl(prefix, libraryName, libraryVersion, resourceName, resourceVersion);
181     }
182 
183     @Override
184     public boolean libraryExists(String libraryName)
185     {
186         if (getPrefix() != null && !"".equals(getPrefix()))
187         {
188             try
189             {
190                 URL url =
191                     FacesContext.getCurrentInstance().getExternalContext().getResource(
192                         getPrefix() + '/' + libraryName);
193                 if (url != null)
194                 {
195                     return true;
196                 }
197             }
198             catch (MalformedURLException e)
199             {
200                 return false;
201             }
202         }
203         else
204         {
205             try
206             {
207 
208                 URL url = FacesContext.getCurrentInstance().getExternalContext().getResource(libraryName);
209 
210                 if (url != null)
211                 {
212                     return true;
213                 }
214             }
215             catch (MalformedURLException e)
216             {
217                 return false;
218             }
219         }
220         return false;
221     }
222 }