[jboss-cvs] jboss-seam/src/ui/org/jboss/seam/ui/graphicImage ...

Peter Muir peter at bleepbleep.org.uk
Mon Mar 5 15:59:06 EST 2007


  User: pmuir   
  Date: 07/03/05 15:59:06

  Added:       src/ui/org/jboss/seam/ui/graphicImage    
                        UIGraphicImage.java DynamicImageStore.java
                        UIImageTransform.java DynamicImageResource.java
  Log:
  Support s:imageTransform
  
  Revision  Changes    Path
  1.1      date: 2007/03/05 20:59:06;  author: pmuir;  state: Exp;jboss-seam/src/ui/org/jboss/seam/ui/graphicImage/UIGraphicImage.java
  
  Index: UIGraphicImage.java
  ===================================================================
  package org.jboss.seam.ui.graphicImage;
  
  import java.io.IOException;
  import java.util.HashMap;
  import java.util.List;
  import java.util.Map;
  
  import javax.faces.component.UIComponent;
  import javax.faces.component.UIParameter;
  import javax.faces.component.html.HtmlGraphicImage;
  import javax.faces.context.FacesContext;
  import javax.faces.context.ResponseWriter;
  import javax.faces.el.ValueBinding;
  import javax.faces.render.Renderer;
  
  import org.jboss.seam.core.Image;
  import org.jboss.seam.ui.HTML;
  import org.jboss.seam.ui.JSF;
  import org.jboss.seam.ui.graphicImage.DynamicImageStore.ImageWrapper;
  
  public class UIGraphicImage extends HtmlGraphicImage
  {
  
     public static final String FAMILY = "org.jboss.seam.ui.UIGraphicImage";
  
     private String fileName;
  
     @Override
     public String getFamily()
     {
        return FAMILY;
     }
  
     @Override
     public Object saveState(FacesContext context)
     {
        Object[] values = new Object[2];
        values[0] = super.saveState(context);
        values[1] = fileName;
        return values;
     }
  
     @Override
     public void restoreState(FacesContext context, Object state)
     {
        Object values[] = (Object[]) state;
        super.restoreState(context, values[0]);
        fileName = (String) values[1];
     }
  
     @Override
     public void encodeBegin(FacesContext context) throws IOException
     {
        ResponseWriter writer = context.getResponseWriter();
        String key = getFileName();
        String extension = null;
  
        Image image = Image.instance();
        image.set(getValue());
        
        // Do transforms
        
        for (UIComponent cmp : (List<UIComponent>) this.getChildren()) 
        {
           if (cmp instanceof UIImageTransform)
           {
              UIImageTransform imageTransform = (UIImageTransform) cmp;
              Map<String, String> parameters = getParameters(imageTransform);
              if (UIImageTransform.SCALE.equals(imageTransform.getType()))
              {
                 scale(imageTransform, image, parameters);
              } else if (UIImageTransform.TYPE.equals(imageTransform.getType()))
              {
                 contentType(imageTransform, image, parameters);
              }
              
           }
        }
  
        key = DynamicImageStore.instance().put(new ImageWrapper(image.get(), image.getContentType()),
                 key);
        extension = image.getContentType().getExtension();
  
        writer.startElement(HTML.IMG_ELEM, this);
        String url = context.getExternalContext().getRequestContextPath()
                 + DynamicImageResource.DYNAMIC_IMAGE_RESOURCE_PATH + "/" + key + extension;
        writer.writeAttribute(HTML.SRC_ATTR, url, HTML.SRC_ATTR);
        HTML.renderHTMLAttributes(writer, this, HTML.IMG_PASSTHROUGH_ATTRIBUTES);
        writer.endElement(HTML.IMG_ELEM);
     }
  
     private void scale(UIImageTransform imageTransform, Image image, Map<String, String> parameters) throws NumberFormatException, IOException
     {
  //    TODO reduce number of decimal places
        if ("true".equals(parameters.get("maintainRatio")))
        {
           if (parameters.containsKey("width") && parameters.containsKey("height"))
           {
              throw new UnsupportedOperationException("Cannot maintain ratio and specify height and width");
           }
           else if (parameters.containsKey("width"))
           {
              setHeight(((Double) (Double.valueOf(parameters.get("width")) / image.getRatio())).toString());
              setWidth(parameters.get("width"));
           }
           else if (parameters.containsKey("height"))
           {
              setWidth(((Double) (Double.valueOf(getHeight()) / image.getRatio())).toString());
              setHeight(parameters.get("height"));
           }
        }
     }
     
     private void contentType(UIImageTransform imageTransform, Image image, Map<String, String> parameters) {
        if (parameters.containsKey("output")) 
        {
          Image.Type type = Image.Type.getTypeByMimeType(parameters.get("output"));
          if (type != null)
          {
             image.setContentType(type);
          }
        }
        
     }
     
     private Map<String, String> getParameters(UIImageTransform imageTransform)
     {
        Map<String, String> parameters = new HashMap<String, String>();
        for (UIComponent cmp : (List<UIComponent>) imageTransform.getChildren())
        {
           if (cmp instanceof UIParameter)
           {
              UIParameter parameter = (UIParameter) cmp;
              parameters.put(parameter.getName(), parameter.getValue() == null ? null : parameter.getValue().toString());
           }
        }
        return parameters;
     }
  
     public String getFileName()
     {
        if (fileName != null)
        {
           return fileName;
        }
        else
        {
           ValueBinding vb = getValueBinding("fileName");
           return vb == null ? null : JSF.getStringValue(getFacesContext(), vb);
        }
  
     }
  
     public void setFileName(String fileName)
     {
        this.fileName = fileName;
     }
  
     @Override
     protected Renderer getRenderer(FacesContext context)
     {
        return null;
     }
     
     @Override
     public boolean getRendersChildren()
     {
        return true;
     }
  }
  
  
  
  1.1      date: 2007/03/05 20:59:06;  author: pmuir;  state: Exp;jboss-seam/src/ui/org/jboss/seam/ui/graphicImage/DynamicImageStore.java
  
  Index: DynamicImageStore.java
  ===================================================================
  package org.jboss.seam.ui.graphicImage;
  
  import java.io.Serializable;
  import java.util.HashMap;
  import java.util.Map;
  
  import org.jboss.seam.Component;
  import org.jboss.seam.InterceptionType;
  import org.jboss.seam.ScopeType;
  import org.jboss.seam.annotations.Install;
  import org.jboss.seam.annotations.Intercept;
  import org.jboss.seam.annotations.Name;
  import org.jboss.seam.annotations.Scope;
  import org.jboss.seam.core.Image;
  import org.jboss.seam.log.Log;
  import org.jboss.seam.log.Logging;
  
  @Name("dynamicImageStore")
  @Scope(ScopeType.SESSION)
  @Install(precedence = Install.BUILT_IN)
  @Intercept(InterceptionType.NEVER)
  public class DynamicImageStore implements Serializable
  {
     
     private Log log = Logging.getLog(DynamicImageStore.class);
  
     public static class ImageWrapper implements Serializable
     {
        
        private byte[] image;
  
        private Image.Type contentType;
  
        public ImageWrapper(byte[] image, Image.Type contentType)
        {
           this.image = image;
           this.contentType = contentType;
        }
  
        public Image.Type getContentType()
        {
           return contentType;
        }
  
        public byte[] getImage()
        {
           return image;
        }
     }
  
     private Map<String, ImageWrapper> store = new HashMap<String, ImageWrapper>();
  
     private int index = 0;
  
     /**
      * Put a image into the store
      * @param image
      * @return the key of the image
      */
     public String put(ImageWrapper image)
     {
        return put(image, null);
     }
     
     /**
      * Put an image into the store.
      * @param image
      * @param key The key to use, if null, a key will be generated
      * @return The key of the image
      */
     public String put(ImageWrapper image, String key) 
     {
        if (key == null)
        {
           key = "org.jboss.seam.ui.DynamicImageStore." + index;
           index++;
        }
        store.put(key, image);
        log.debug("Put image into to session with key #0", key);
        return key;
     }
  
     public ImageWrapper get(String key)
     {
        log.debug("Get image into to session with key #0", key);
        ImageWrapper image = store.get(key);
        return image;
     }
     
     public ImageWrapper remove(String key)
     {
        log.debug("Get image from session with key #0", key);
        return store.remove(key);
     }
     
     public boolean contains(String key) 
     {
        return store.containsKey(key);
     }
  
     public static DynamicImageStore instance()
     {
        return (DynamicImageStore) Component.getInstance(DynamicImageStore.class, true);
     }
  
  }
  
  
  1.1      date: 2007/03/05 20:59:06;  author: pmuir;  state: Exp;jboss-seam/src/ui/org/jboss/seam/ui/graphicImage/UIImageTransform.java
  
  Index: UIImageTransform.java
  ===================================================================
  package org.jboss.seam.ui.graphicImage;
  
  import javax.faces.component.UIComponentBase;
  import javax.faces.el.ValueBinding;
  
  import org.jboss.seam.ui.JSF;
  
  public class UIImageTransform extends UIComponentBase
  {
   
     public static final String SCALE = "scale";
     
     public static final String TYPE = "contentType";
     
     private String type; 
     
     public static final String FAMILY = "org.jboss.seam.ui.UIGraphicImage";
  
     @Override
     public String getFamily()
     {
        return FAMILY;
     }
     
     public void setType(String type)
     {
        this.type = type;
     }
     
     public String getType()
     {
        if (type != null) 
        {
           return type;
        }
        else 
        {
           ValueBinding vb = getValueBinding("type");
           return vb == null ? null : JSF.getStringValue(getFacesContext(), vb);
        }
     }
  
  }
  
  
  
  1.1      date: 2007/03/05 20:59:06;  author: pmuir;  state: Exp;jboss-seam/src/ui/org/jboss/seam/ui/graphicImage/DynamicImageResource.java
  
  Index: DynamicImageResource.java
  ===================================================================
  package org.jboss.seam.ui.graphicImage;
  
  import static org.jboss.seam.InterceptionType.NEVER;
  import static org.jboss.seam.ScopeType.APPLICATION;
  import static org.jboss.seam.annotations.Install.BUILT_IN;
  
  import java.io.IOException;
  
  import javax.servlet.ServletOutputStream;
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  
  import org.jboss.seam.annotations.Install;
  import org.jboss.seam.annotations.Intercept;
  import org.jboss.seam.annotations.Name;
  import org.jboss.seam.annotations.Scope;
  import org.jboss.seam.annotations.Startup;
  import org.jboss.seam.servlet.AbstractResource;
  import org.jboss.seam.ui.graphicImage.DynamicImageStore.ImageWrapper;
  
  @Startup
  @Scope(APPLICATION)
  @Name("org.jboss.seam.ui.resource.dynamicImageResource")
  @Install(precedence = BUILT_IN)
  @Intercept(NEVER)
  public class DynamicImageResource extends AbstractResource
  {
  
   public static final String DYNAMIC_IMAGE_RESOURCE_PATH = "/seam/resource/dynamicImage";
     
     private static final String RESOURCE_PATH = "/dynamicImage";
     
     @Override
     protected String getResourcePath()
     {
        return RESOURCE_PATH;
     }
     
     @Override
     public void getResource(HttpServletRequest request, HttpServletResponse response)
        throws IOException
     {
        String pathInfo = request.getPathInfo().substring(getResourcePath().length() + 1, request.getPathInfo().lastIndexOf(".")); 
        
       ImageWrapper image = DynamicImageStore.instance().remove(pathInfo);
        if (image != null)
        {
           response.setContentType(image.getContentType().getMimeType());
           response.setStatus(HttpServletResponse.SC_OK);
           response.setContentLength(image.getImage().length);
           ServletOutputStream os = response.getOutputStream();
           os.write(image.getImage());
           os.flush();
        }
        else
        {
           response.sendError(HttpServletResponse.SC_NOT_FOUND);
        }
     }
  
  }
  
  
  



More information about the jboss-cvs-commits mailing list