1 package net.trajano.twiff.internal.servlet; 2 3 import java.beans.BeanInfo; 4 import java.beans.Introspector; 5 import java.beans.PropertyDescriptor; 6 import java.io.IOException; 7 import java.io.OutputStream; 8 import javax.servlet.ServletException; 9 import javax.servlet.http.HttpServlet; 10 import javax.servlet.http.HttpServletRequest; 11 import javax.servlet.http.HttpServletResponse; 12 import net.trajano.twiff.AttachmentPageLookup; 13 import net.trajano.twiff.ViewServletConfiguration; 14 15 /*** 16 * Displays byte data stored in the page beans. If there is a token specified as 17 * a parameter, it will use the data in the token. 18 * 19 * @author Archimedes Trajano 20 */ 21 public class AttachmentServlet extends HttpServlet { 22 /*** 23 * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, 24 * javax.servlet.http.HttpServletResponse) 25 */ 26 protected void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException { 27 ViewServletRequestAdapter requestAdapter = new ViewServletRequestAdapter(request, configuration.getTokenFieldName()); 28 try { 29 final Class pageBeanClass = pageLookup.getPageBeanClass(request); 30 requestAdapter.registerComponentImplementation(pageBeanClass); 31 BeanInfo beanInfo = Introspector.getBeanInfo(pageBeanClass); 32 for (PropertyDescriptor descriptor : beanInfo.getPropertyDescriptors()) { 33 if (pageLookup.getPropertyName(request).equals(descriptor.getName())) { 34 byte[] data = (byte[]) descriptor.getReadMethod().invoke(requestAdapter.getContainer().getComponentInstanceOfType(pageBeanClass)); 35 response.setContentLength(data.length); 36 final OutputStream outputStream = response.getOutputStream(); 37 outputStream.write(data); 38 break; 39 } 40 } 41 } catch (ServletException e) { 42 throw e; 43 } catch (IOException e) { 44 throw e; 45 } catch (Exception e) { 46 throw new ServletException(e); 47 } 48 } 49 50 /*** 51 * @param configuration 52 * servlet configuration. 53 * @param pageLookup 54 * logic that performs page lookups. 55 */ 56 public AttachmentServlet(final ViewServletConfiguration configuration, final AttachmentPageLookup pageLookup) { 57 this.configuration = configuration; 58 this.pageLookup = pageLookup; 59 } 60 61 /*** 62 * Object that performs page lookups. 63 */ 64 private final AttachmentPageLookup pageLookup; 65 66 /*** 67 * ViewServletConfiguration file. 68 */ 69 private final ViewServletConfiguration configuration; 70 }