1 15 package org.apache.tapestry.asset; 16 17 import java.io.BufferedInputStream ; 18 import java.io.IOException ; 19 import java.io.InputStream ; 20 import java.net.URL ; 21 import java.security.MessageDigest ; 22 import java.util.HashMap ; 23 import java.util.Map ; 24 25 import org.apache.commons.codec.binary.Hex; 26 import org.apache.hivemind.ApplicationRuntimeException; 27 import org.apache.hivemind.ClassResolver; 28 import org.apache.hivemind.util.IOUtils; 29 import org.apache.tapestry.event.ResetEventListener; 30 31 38 public class ResourceDigestSourceImpl implements ResourceDigestSource, ResetEventListener 39 { 40 private ClassResolver _classResolver; 41 42 private static final int BUFFER_SIZE = 5000; 43 44 47 48 private final Map _cache = new HashMap (); 49 50 public synchronized String getDigestForResource(String resourcePath) 51 { 52 String result = (String ) _cache.get(resourcePath); 53 54 if (result == null) 55 { 56 result = computeMD5(resourcePath); 57 _cache.put(resourcePath, result); 58 } 59 60 return result; 61 } 62 63 public synchronized void resetEventDidOccur() 64 { 65 _cache.clear(); 66 } 67 68 private String computeMD5(String resourcePath) 69 { 70 URL url = _classResolver.getResource(resourcePath); 71 72 if (url == null) 73 throw new ApplicationRuntimeException(AssetMessages.noSuchResource(resourcePath)); 74 75 InputStream stream = null; 76 77 try 78 { 79 MessageDigest digest = MessageDigest.getInstance("MD5"); 80 81 stream = new BufferedInputStream (url.openStream()); 82 83 digestStream(digest, stream); 84 85 stream.close(); 86 stream = null; 87 88 byte[] bytes = digest.digest(); 89 char[] encoded = Hex.encodeHex(bytes); 90 91 return new String (encoded); 92 } 93 catch (IOException ex) 94 { 95 throw new ApplicationRuntimeException(AssetMessages.unableToReadResource( 96 resourcePath, 97 ex)); 98 } 99 catch (Exception ex) 100 { 101 throw new ApplicationRuntimeException(ex); 102 } 103 finally 104 { 105 IOUtils.close(stream); 106 } 107 } 108 109 private void digestStream(MessageDigest digest, InputStream stream) throws IOException 110 { 111 byte[] buffer = new byte[BUFFER_SIZE]; 112 113 while (true) 114 { 115 int length = stream.read(buffer); 116 117 if (length < 0) 118 return; 119 120 digest.update(buffer, 0, length); 121 } 122 } 123 124 public void setClassResolver(ClassResolver classResolver) 125 { 126 _classResolver = classResolver; 127 } 128 } | Popular Tags |