<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: java code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Fri, 25 Jul 2008 08:17:46 GMT</pubDate>
    <description>DZone Snippets: java code</description>
    <item>
      <title>avoid web caching</title>
      <link>http://snippets.dzone.com/posts/show/2708</link>
      <description>&lt;code&gt;&lt;br /&gt;// Set to expire far in the past.&lt;br /&gt;response.setHeader("Expires", "Sat, 6 May 1995 12:00:00 GMT");&lt;br /&gt;// Set standard HTTP/1.1 no-cache headers.&lt;br /&gt;response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");&lt;br /&gt;// Set IE extended HTTP/1.1 no-cache headers (use addHeader).&lt;br /&gt;response.addHeader("Cache-Control", "post-check=0, pre-check=0");&lt;br /&gt;// Set standard HTTP/1.0 no-cache header.&lt;br /&gt;response.setHeader("Pragma", "no-cache");&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Mon, 25 Sep 2006 00:28:46 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2708</guid>
      <author>remvee (Remco van 't Veer)</author>
    </item>
    <item>
      <title>time based cache</title>
      <link>http://snippets.dzone.com/posts/show/2360</link>
      <description>A simple time based cache build around a map store.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import java.util.Map;&lt;br /&gt;import java.util.WeakHashMap;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Simple time-based cache.&lt;br /&gt; */&lt;br /&gt;public class SimpleCache {&lt;br /&gt;	private long maxAge;&lt;br /&gt;	private Map store;&lt;br /&gt;&lt;br /&gt;	/**&lt;br /&gt;	 * Instanciate a cache with max age of 1 hour and a WeakHashMap as store.&lt;br /&gt;	 * @see java.util.WeakHashMap&lt;br /&gt;	 */&lt;br /&gt;	public SimpleCache() {&lt;br /&gt;		this.maxAge = 1000 * 60 * 60;&lt;br /&gt;		this.store = new WeakHashMap();&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	/**&lt;br /&gt;	 * @param maxAge maximum age of an entry in milliseconds&lt;br /&gt;	 * @param store map to hold entries&lt;br /&gt;	 */&lt;br /&gt;	public SimpleCache(long maxAge, Map store) {&lt;br /&gt;		this.maxAge = maxAge;&lt;br /&gt;		this.store = store;&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	/**&lt;br /&gt;	 * Cache an object.&lt;br /&gt;	 * @param key unique identifier to retrieve object&lt;br /&gt;	 * @param value object to cache&lt;br /&gt;	 */&lt;br /&gt;	public void put(Object key, Object value) {&lt;br /&gt;		store.put(key, new Item(value));&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	/**&lt;br /&gt;	 * Fetch an object.&lt;br /&gt;	 * @param key unique identifier to retrieve object&lt;br /&gt;	 * @return an object or null in case it isn't stored or it expired&lt;br /&gt;	 */&lt;br /&gt;	public Object get(Object key) {&lt;br /&gt;		Item item = getItem(key);&lt;br /&gt;		return item == null ? null : item.payload;&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	/**&lt;br /&gt;	 * Fetch an object or store and return output of callback.&lt;br /&gt;	 * @param key unique identifier to retrieve object&lt;br /&gt;	 * @param block code executed when object not in cache&lt;br /&gt;	 * @return an object&lt;br /&gt;	 */&lt;br /&gt;	public synchronized Object get(Object key, Callback block) {&lt;br /&gt;		Item item = getItem(key);&lt;br /&gt;		if (item == null) {&lt;br /&gt;			Object value = block.execute();&lt;br /&gt;			item = new Item(value);&lt;br /&gt;			store.put(key, item);&lt;br /&gt;		}&lt;br /&gt;		return item.payload;&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	/**&lt;br /&gt;	 * Remove an object from cache.&lt;br /&gt;	 * @param key unique identifier to retrieve object&lt;br /&gt;	 */&lt;br /&gt;	public void remove(Object key) {&lt;br /&gt;		store.remove(key);&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	/**&lt;br /&gt;	 * Get an item, if it expired remove it from cache and return null.&lt;br /&gt;	 * @param key unique identifier to retrieve object&lt;br /&gt;	 * @return an item or null&lt;br /&gt;	 */&lt;br /&gt;	private Item getItem(Object key) {&lt;br /&gt;		Item item = (Item) store.get(key);&lt;br /&gt;		if (item == null) {&lt;br /&gt;			return null;&lt;br /&gt;		}&lt;br /&gt;		if (System.currentTimeMillis() - item.birth &gt; maxAge) {&lt;br /&gt;			store.remove(key);&lt;br /&gt;			return null;&lt;br /&gt;		}&lt;br /&gt;		return item;		&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	/**&lt;br /&gt;	 * Value container.&lt;br /&gt;	 */&lt;br /&gt;	private static class Item {&lt;br /&gt;		long birth;&lt;br /&gt;		Object payload;&lt;br /&gt;		Item(Object payload) {&lt;br /&gt;			this.birth = System.currentTimeMillis();&lt;br /&gt;			this.payload = payload;&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	/**&lt;br /&gt;	 * A visitor interface.&lt;br /&gt;	 */&lt;br /&gt;	public static interface Callback {&lt;br /&gt;		Object execute();&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;And a couple of junit tests:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import java.util.HashMap;&lt;br /&gt;&lt;br /&gt;import junit.framework.TestCase;&lt;br /&gt;&lt;br /&gt;public class SimpleCacheTest extends TestCase {&lt;br /&gt;	public void testPutGet () {&lt;br /&gt;		SimpleCache c = new SimpleCache(Long.MAX_VALUE, new HashMap());&lt;br /&gt;		c.put("key1", "value1");&lt;br /&gt;		assertEquals("value1", c.get("key1"));&lt;br /&gt;		c.put("key1", "value1.0");&lt;br /&gt;		assertEquals("value1.0", c.get("key1"));&lt;br /&gt;		c.put("key2", "value2");&lt;br /&gt;		assertEquals("value2", c.get("key2"));&lt;br /&gt;		assertEquals("value1.0", c.get("key1"));&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	public void testMaxAge () throws InterruptedException {&lt;br /&gt;		SimpleCache c = new SimpleCache(1000, new HashMap());&lt;br /&gt;		c.put("key1", "value1");&lt;br /&gt;		assertEquals("value1", c.get("key1"));&lt;br /&gt;		Thread.sleep(1500);&lt;br /&gt;		assertNull(c.get("key1"));&lt;br /&gt;		&lt;br /&gt;		c.put("key2", "value2");&lt;br /&gt;		Thread.sleep(750);&lt;br /&gt;		c.put("key3", "value3");&lt;br /&gt;		Thread.sleep(750);&lt;br /&gt;		assertNull(c.get("key2"));&lt;br /&gt;		assertNotNull(c.get("key3"));&lt;br /&gt;		Thread.sleep(750);&lt;br /&gt;		assertNull(c.get("key3"));&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	public void testRemove () {&lt;br /&gt;		SimpleCache c = new SimpleCache(Long.MAX_VALUE, new HashMap());&lt;br /&gt;		c.remove("key");&lt;br /&gt;		assertNull(c.get("key"));&lt;br /&gt;		c.put("key", "value");&lt;br /&gt;		assertNotNull(c.get("key"));&lt;br /&gt;		c.remove("key");&lt;br /&gt;		assertNull(c.get("key"));&lt;br /&gt;	}&lt;br /&gt;	&lt;br /&gt;	public void testCallBack () {&lt;br /&gt;		SimpleCache c = new SimpleCache(Long.MAX_VALUE, new HashMap());&lt;br /&gt;		assertEquals("value1", c.get("key1", new SimpleCache.Callback() {&lt;br /&gt;			public Object execute() {&lt;br /&gt;				return "value1";&lt;br /&gt;			}&lt;br /&gt;		}));&lt;br /&gt;		assertEquals("value1", c.get("key1"));&lt;br /&gt;		&lt;br /&gt;		// again with a new callback (value)&lt;br /&gt;		c.get("key1", new SimpleCache.Callback() {&lt;br /&gt;			public Object execute() {&lt;br /&gt;				return "value2";&lt;br /&gt;			}&lt;br /&gt;		});&lt;br /&gt;		assertEquals("value1", c.get("key1"));&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Thu, 03 Aug 2006 18:27:52 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/2360</guid>
      <author>remvee (Remco van 't Veer)</author>
    </item>
    <item>
      <title>Slurp InputStream to String</title>
      <link>http://snippets.dzone.com/posts/show/555</link>
      <description>&lt;code&gt;&lt;br /&gt;public static String slurp (InputStream in) throws IOException {&lt;br /&gt;    StringBuffer out = new StringBuffer();&lt;br /&gt;    byte[] b = new byte[4096];&lt;br /&gt;    for (int n; (n = in.read(b)) != -1;) {&lt;br /&gt;        out.append(new String(b, 0, n));&lt;br /&gt;    }&lt;br /&gt;    return out.toString();&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Fri, 05 Aug 2005 17:52:14 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/555</guid>
      <author>remvee (Remco van 't Veer)</author>
    </item>
    <item>
      <title>find files in zip, jar, war, ear and nested archives</title>
      <link>http://snippets.dzone.com/posts/show/356</link>
      <description>The following java class takes two arguments; a directory name and a regular expression.  The directory is searched for files matching the regexp.  Zip files (and zip-alikes) are also searched including nested zips.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import java.io.*;&lt;br /&gt;import java.util.*;&lt;br /&gt;import java.util.zip.*;&lt;br /&gt;&lt;br /&gt;public class Finder {&lt;br /&gt;	public static void main(String[] args) throws Exception {&lt;br /&gt;		String path = args[0];&lt;br /&gt;		final String expr = args[1];&lt;br /&gt;&lt;br /&gt;		List l = new ArrayList();&lt;br /&gt;		findFile(new File(path), new P() {&lt;br /&gt;			public boolean accept(String t) {&lt;br /&gt;				return t.matches(expr) || isZip(t);&lt;br /&gt;			}&lt;br /&gt;		}, l);&lt;br /&gt;&lt;br /&gt;		List r = new ArrayList();&lt;br /&gt;		for (Iterator it = l.iterator(); it.hasNext();) {&lt;br /&gt;			File f = (File) it.next();&lt;br /&gt;			String fn = f + "";&lt;br /&gt;			if (fn.matches(expr)) r.add(fn);&lt;br /&gt;			if (isZip(f.getName())) {&lt;br /&gt;				findZip(fn, new FileInputStream(f), new P() {&lt;br /&gt;					public boolean accept(String t) {&lt;br /&gt;						return t.matches(expr);&lt;br /&gt;					}&lt;br /&gt;				}, r);&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;&lt;br /&gt;		for (Iterator it = r.iterator(); it.hasNext();) {&lt;br /&gt;			System.out.println(it.next());&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	static void findFile(File f, P p, List r) {&lt;br /&gt;		if (f.isDirectory()) {&lt;br /&gt;			File[] files = f.listFiles();&lt;br /&gt;			for (int i = 0; i &lt; files.length; i++) findFile(files[i], p, r);&lt;br /&gt;		} else if (p.accept(f + "")) {&lt;br /&gt;			r.add(f);&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	static void findZip(String f, InputStream in, P p, List r) throws IOException {&lt;br /&gt;		ZipInputStream zin = new ZipInputStream(in);&lt;br /&gt;&lt;br /&gt;		ZipEntry en;&lt;br /&gt;		while ((en = zin.getNextEntry()) != null) {&lt;br /&gt;			if (p.accept(en.getName())) r.add(f + "!" + en);&lt;br /&gt;			if (isZip(en.getName())) findZip(f + "!" + en, zin, p, r);&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	static String[] ZIP_EXTENSIONS = { ".zip", ".jar", ".war", ".ear" };&lt;br /&gt;&lt;br /&gt;	static boolean isZip(String t) {&lt;br /&gt;		for (int i = 0; i &lt; ZIP_EXTENSIONS.length; i++) {&lt;br /&gt;			if (t.endsWith(ZIP_EXTENSIONS[i])) {&lt;br /&gt;				return true;&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;		return false;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	static interface P {&lt;br /&gt;		public boolean accept(String t);&lt;br /&gt;	}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Files are not properly closed!  Don't use this class in a long running application or properly close all streams.&lt;/em&gt;</description>
      <pubDate>Tue, 31 May 2005 22:47:40 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/356</guid>
      <author>remvee (Remco van 't Veer)</author>
    </item>
  </channel>
</rss>
