package org.qrone.r7.handler; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URI; import java.net.URISyntaxException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.qrone.r7.resolver.URIResolver; import org.qrone.util.MimeTypeParser; import org.qrone.util.QrONEUtils; import org.qrone.util.Stream; import org.qrone.util.Token; public class ResolverHandler implements URIHandler{ private MimeTypeParser parser; private URIResolver resolver; private Map<String, String> cacheMap = new HashMap<String, String>(); public ResolverHandler(URIResolver resolver) { this.resolver = resolver; resolver.addUpdateListener(new URIResolver.Listener() { @Override public void update(URI uri) { cacheMap.remove(uri.toString()); } }); } @Override public boolean handle(HttpServletRequest request, HttpServletResponse response, String uri, String path, String leftpath, List<String> arg){ InputStream in = null; try{ URI urio = new URI(uri); String etag = cacheMap.get(uri); if(etag != null && etag.equals(request.getHeader("If-None-Match"))){ response.setStatus(304); return true; } if(resolver.exist(uri)){ if(etag == null){ etag = UUID.randomUUID().toString(); cacheMap.put(uri, etag); } URI mimetype = new URI("/system/resource/mime.types"); if(parser == null){ MimeTypeParser p = new MimeTypeParser(); p.parse(resolver.getInputStream(mimetype)); parser = p; } int eidx = uri.lastIndexOf('.'); if(eidx >= 0){ String mime = parser.getMimeType(uri.substring(eidx+1)); if(mime != null){ response.setHeader("Content-Type", mime); } } response.setHeader("ETag", etag); in = resolver.getInputStream(urio); OutputStream out = response.getOutputStream(); Stream.copy(in, out); out.flush(); out.close(); return true; } }catch (IOException e) { e.printStackTrace(); }catch (URISyntaxException e) { e.printStackTrace(); }finally{ if(in != null){ try { in.close(); } catch (IOException e) { } } } return false; } }