1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.myfaces.view.facelets.impl;
20
21 import java.io.IOException;
22 import java.net.URL;
23 import java.net.URLConnection;
24 import java.util.HashMap;
25 import java.util.Map;
26
27 import javax.faces.view.facelets.FaceletCache;
28 import javax.faces.view.facelets.FaceletException;
29
30 import org.apache.myfaces.shared.resource.ResourceLoaderUtils;
31 import org.apache.myfaces.view.facelets.util.ParameterCheck;
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 class FaceletCacheImpl extends FaceletCache<DefaultFacelet>
51 {
52
53 private static final long INFINITE_DELAY = -1;
54 private static final long NO_CACHE_DELAY = 0;
55
56 private Map<String, DefaultFacelet> _facelets;
57
58 private Map<String, DefaultFacelet> _viewMetadataFacelets;
59
60 private long _refreshPeriod;
61
62 FaceletCacheImpl(long refreshPeriod)
63 {
64 _refreshPeriod = refreshPeriod < 0 ? INFINITE_DELAY : refreshPeriod * 1000;
65
66 _facelets = new HashMap<String, DefaultFacelet>();
67
68 _viewMetadataFacelets = new HashMap<String, DefaultFacelet>();
69 }
70
71 @Override
72 public DefaultFacelet getFacelet(URL url) throws IOException
73 {
74 ParameterCheck.notNull("url", url);
75
76 String key = url.toString();
77
78 DefaultFacelet f = _facelets.get(key);
79
80 if (f == null || this.needsToBeRefreshed(f))
81 {
82
83 f = getMemberFactory().newInstance(url);
84 if (_refreshPeriod != NO_CACHE_DELAY)
85 {
86 Map<String, DefaultFacelet> newLoc = new HashMap<String, DefaultFacelet>(_facelets);
87 newLoc.put(key, f);
88 _facelets = newLoc;
89 }
90 }
91
92 return f;
93 }
94
95 @Override
96 public boolean isFaceletCached(URL url)
97 {
98 return _facelets.containsKey(url);
99 }
100
101 @Override
102 public DefaultFacelet getViewMetadataFacelet(URL url) throws IOException
103 {
104 ParameterCheck.notNull("url", url);
105
106 String key = url.toString();
107
108 DefaultFacelet f = _viewMetadataFacelets.get(key);
109
110 if (f == null || this.needsToBeRefreshed(f))
111 {
112
113 f = getMetadataMemberFactory().newInstance(url);
114 if (_refreshPeriod != NO_CACHE_DELAY)
115 {
116 Map<String, DefaultFacelet> newLoc = new HashMap<String, DefaultFacelet>(_viewMetadataFacelets);
117 newLoc.put(key, f);
118 _viewMetadataFacelets = newLoc;
119 }
120 }
121
122 return f;
123 }
124
125 @Override
126 public boolean isViewMetadataFaceletCached(URL url)
127 {
128 return _viewMetadataFacelets.containsKey(url);
129 }
130
131
132
133
134
135
136
137
138 protected boolean needsToBeRefreshed(DefaultFacelet facelet)
139 {
140
141 if (_refreshPeriod == NO_CACHE_DELAY)
142 {
143 return true;
144 }
145
146
147 if (_refreshPeriod == INFINITE_DELAY)
148 {
149 return false;
150 }
151
152 long target = facelet.getCreateTime() + _refreshPeriod;
153 if (System.currentTimeMillis() > target)
154 {
155
156
157 try
158 {
159 URLConnection conn = facelet.getSource().openConnection();
160 long lastModified = ResourceLoaderUtils.getResourceLastModified(conn);
161
162 return lastModified == 0 || lastModified > target;
163 }
164 catch (IOException e)
165 {
166 throw new FaceletException("Error Checking Last Modified for " + facelet.getAlias(), e);
167 }
168 }
169
170 return false;
171 }
172 }