[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