1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
32
33
34
35 public class ExternalContextResourceLoader extends ResourceLoader
36 {
37
38
39
40
41
42 protected static final Pattern VERSION_CHECKER = Pattern.compile("/\\p{Digit}+(_\\p{Digit}*)*/");
43
44
45
46
47
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
74
75
76
77
78
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
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
118
119
120
121
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
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 }