1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package net.sf.tapfx.components.cache;
17
18 import org.apache.commons.logging.Log;
19 import org.apache.commons.logging.LogFactory;
20
21 import java.io.IOException;
22 import java.io.PrintWriter;
23 import java.io.Serializable;
24 import java.io.StringWriter;
25
26 import net.sf.ehcache.CacheException;
27 import net.sf.ehcache.CacheManager;
28 import net.sf.ehcache.Element;
29
30 import org.apache.tapestry.AbstractComponent;
31 import org.apache.tapestry.IMarkupWriter;
32 import org.apache.tapestry.IRequestCycle;
33 import org.apache.tapestry.util.ContentType;
34
35 /***
36 * A Tapestry component that caches web content.<BR>
37 * Surround the html content that should be cached with this component,
38 * and specify the cache name and (an optional) cache key.
39 * Ehcache is used to implement the caching, and so
40 * each cache's properties are configured in the ehcache.xml file.
41 * This class also contains static utility methods for interacting
42 * with a cache from code, such as: get, put, remove, clear.
43 * @author andyhot
44 * @version $Id: Cache.java,v 1.2 2005/11/04 23:32:15 andyhot Exp $
45 */
46 public abstract class Cache extends AbstractComponent
47 {
48 private static final Log log = LogFactory.getLog(Cache.class);
49
50 public abstract String getName();
51 public abstract Object getKey();
52
53 protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle)
54 {
55 if (cycle.isRewinding())
56 {
57 return;
58 }
59 net.sf.ehcache.Cache cache = getCache(getName());
60 if (cache == null)
61 {
62 log.info("Cache not found: " + getName());
63 }
64 else
65 {
66 log.debug("HitCount: " + cache.getHitCount()
67 + " Size: " + cache.getMemoryStoreSize());
68
69 String cachedHtml = (String) Cache.get( cache, getKey());
70 if (cachedHtml != null)
71 {
72 writer.printRaw(cachedHtml);
73 writer.comment("Cache hit");
74 return;
75 }
76
77 }
78 if (log.isDebugEnabled())
79 {
80 log.debug("Generating cache content for cache: " + getName() + " and key: " + getKey());
81 }
82
83
84
85
86
87 StringWriter sWriter = new StringWriter();
88 IMarkupWriter nested = cycle.getInfrastructure().getMarkupWriterSource().newMarkupWriter(new PrintWriter(sWriter),
89 new ContentType(writer.getContentType()));
90 renderBody(nested, cycle);
91 nested.close();
92
93
94 String bodyHtml = sWriter.toString();
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113 writer.printRaw(bodyHtml);
114 put(cache, getKey(), bodyHtml);
115 }
116
117 private static net.sf.ehcache.Cache getCache(String name)
118 {
119 net.sf.ehcache.Cache cache = null;
120 try
121 {
122 CacheManager manager = CacheManager.getInstance();
123 cache = manager.getCache(name);
124 if (cache == null)
125 {
126 log.warn("Could not find configuration for " + name
127 + ". Configuring using the defaultCache settings.");
128 manager.addCache(name);
129 cache = manager.getCache(name);
130 }
131 }
132 catch (net.sf.ehcache.CacheException e)
133 {
134 }
135 return cache;
136 }
137
138 public static Object get(String cacheName, Object key)
139 {
140 net.sf.ehcache.Cache cache = getCache(cacheName);
141 return get(cache, key);
142 }
143
144 public static void put(String cacheName, Object key, Object value)
145 {
146 net.sf.ehcache.Cache cache = getCache(cacheName);
147 put(cache, key, value);
148 }
149
150 public static void remove(String cacheName, Object key)
151 {
152 net.sf.ehcache.Cache cache = getCache(cacheName);
153 if (cache != null)
154 {
155 cache.remove((Serializable) key);
156 }
157 }
158
159 public static void clear(String cacheName)
160 {
161 net.sf.ehcache.Cache cache = getCache(cacheName);
162 if (cache != null)
163 {
164 try
165 {
166 cache.removeAll();
167 }
168 catch (IOException ignore)
169 {
170 }
171 }
172 }
173
174 private static void put(net.sf.ehcache.Cache cache, Object key, Object value)
175 {
176 if (cache != null)
177 {
178 Element element = new Element((Serializable) key, (Serializable) value);
179 cache.put(element);
180 }
181 }
182
183 private static Object get(net.sf.ehcache.Cache cache, Object key)
184 {
185 Object obj = null;
186 if (cache != null)
187 {
188 try
189 {
190 Element element = cache.get((Serializable) key);
191 if (element !=null)
192 {
193 obj = element.getValue();
194 }
195 }
196 catch (CacheException ignore)
197 {
198 }
199 }
200 return obj;
201 }
202 }