[jboss-user] [JBoss Seam] - Re: Anybody made s:upload work in Seam+ICEfaces app?
tony.herstell@gmail.com
do-not-reply at jboss.com
Sun Feb 25 23:12:21 EST 2007
Yes I did.
There is a bug (in JIRA) with IceFaces upload when it tries to talk to the progress bar so don't use a progress bar).
I can get images uploaded but cant get it working with seam @End annotations yet.. there are a few things to finish on IceFaces...
I do callbacks to "parental" stateful session beans to pass them an updated child.
A "bit" of this was cribbed from the seamspace app.
Ignore the "Done" button below
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
| <html xmlns="http://www.w3.org/1999/xhtml"
| xmlns:h="http://java.sun.com/jsf/html"
| xmlns:ui="http://java.sun.com/jsf/facelets"
| xmlns:f="http://java.sun.com/jsf/core"
| xmlns:s="http://jboss.com/products/seam/taglib"
| xmlns:ice="http://www.icesoft.com/icefaces/component">
| <head>
| <meta http-equiv="Content-Type"
| content="text/html; charset=iso-8859-1" />
| <link rel="stylesheet" type="text/css" href="./css/risingstars.css" />
| <link rel="stylesheet" type="text/css" href="./xmlhttp/css/xp/xp.css" />
| <title>Upload</title>
| </head>
| <body>
|
| <ui:composition xmlns="http://www.w3.org/1999/xhtml"
| xmlns:ui="http://java.sun.com/jsf/facelets"
| xmlns:h="http://java.sun.com/jsf/html"
| xmlns:f="http://java.sun.com/jsf/core"
| xmlns:s="http://jboss.com/products/seam/taglib"
| xmlns:ice="http://www.icesoft.com/icefaces/component"
| template="/WEB-INF/pages/template.xhtml">
|
| <!-- content -->
| <ui:define name="title">
| <ice:outputText value="#{messages.form_upload}" />
| </ui:define>
| <ui:define name="content">
|
| <ice:form>
| <ice:panelGrid columns="1">
| <fieldset>
| <legend>
| <ice:outputText value="#{messages.fieldset_upload}" />
| </legend>
| <!-- Messages -->
| <ice:panelGrid columns="1">
| <ice:messages infoClass="error" globalOnly="true" />
| </ice:panelGrid>
|
| <ice:panelGrid columns="1">
| <fieldset>
| <legend>
| <ice:outputText value="#{messages.fieldset_upload}"/>
| </legend>
|
| <ice:panelGrid columns="1">
| <ice:inputFile style="border:none; width:400px; height:70px;"
| actionListener="#{uploadController.action}"/> <!-- progressListener="#{uploadController.progress}" -->
| <ice:outputProgress id="progress" value="#{uploadController.percent}"/>
| </ice:panelGrid>
|
| <ice:panelGrid columns="1" width="100%">
| <div align="right">
| <ice:commandButton action="#{uploadController.cancel}"
| value="#{messages.button_cancel}" immediate="true"
| type="submit" />
| <ice:commandButton id="done" type="submit"
| value="#{messages.button_done}" immediate="true"
| action="#{uploadController.done}" />
| </div>
| </ice:panelGrid>
|
| </fieldset>
| </ice:panelGrid>
|
| </fieldset>
| </ice:panelGrid>
| </ice:form>
|
| </ui:define>
| <!-- content -->
| </ui:composition>
|
| </body>
|
| </html>
|
notice the hack to "jump out" of a conversation below (nasty hack) but have to do this to get to see the images... and it causes real problems later...
| package nz.co.risingstars.actions.upload;
|
| import javax.faces.event.ActionEvent;
| import java.util.EventObject;
|
| /**
| * @author Tony Herstell
| * @version $Revision: 1.3 $ $Date: 2007-02-12 22:28:39 $
| */
| public interface UploadController {
|
| public String startUpload(Object selectedObject);
|
| public void setPercent(int percent);
|
| public int getPercent();
|
| public void action(ActionEvent event);
|
| public void progress(EventObject event);
|
| public String done();
|
| public String cancel();
|
| public void destroy();
| }
|
|
|
| package nz.co.risingstars.actions.upload;
|
| import static javax.persistence.PersistenceContextType.EXTENDED;
|
| import com.icesoft.faces.component.inputfile.InputFile;
| import com.icesoft.faces.webapp.xmlhttp.PersistentFacesState;
| import com.icesoft.faces.webapp.xmlhttp.RenderingException;
|
| import javax.ejb.Remove;
| import javax.ejb.Stateful;
| import javax.ejb.TransactionAttribute;
| import javax.ejb.TransactionAttributeType;
| import javax.faces.event.ActionEvent;
| import javax.imageio.ImageIO;
| import javax.persistence.EntityManager;
| import javax.persistence.PersistenceContext;
| import javax.swing.ImageIcon;
|
| import nz.co.risingstars.actions.organisation.FindOrganisationController;
| import nz.co.risingstars.actions.user.FindUserController;
| import nz.co.risingstars.entities.Image;
| import nz.co.risingstars.entities.Organisation;
| import nz.co.risingstars.entities.User;
|
| import org.jboss.seam.Component;
| import org.jboss.seam.annotations.Begin;
| import org.jboss.seam.annotations.Conversational;
| import org.jboss.seam.annotations.Destroy;
| import org.jboss.seam.annotations.End;
| import org.jboss.seam.annotations.In;
| import org.jboss.seam.annotations.Logger;
| import org.jboss.seam.annotations.Name;
| import org.jboss.seam.core.Conversation;
| import org.jboss.seam.core.FacesMessages;
| import org.jboss.seam.log.Log;
|
| import java.awt.Graphics2D;
| import java.awt.RenderingHints;
| import java.awt.image.BufferedImage;
| import java.io.BufferedInputStream;
| import java.io.BufferedOutputStream;
| import java.io.ByteArrayOutputStream;
| import java.io.File;
| import java.io.FileInputStream;
| import java.io.IOException;
| import java.io.InputStream;
| import java.io.OutputStream;
| import java.util.EventObject;
|
| /**
| * @author Tony Herstell
| * @version $Revision: 1.4 $ $Date: 2007-02-13 04:46:40 $
| */
| @Stateful
| @Name("uploadController")
| @Conversational
| public class UploadControllerImpl implements UploadController {
|
| /**
| * The maximum width allowed for image rescaling
| */
| private static final int MAX_IMAGE_WIDTH = 1024;
|
| @PersistenceContext(type = EXTENDED)
| private EntityManager em;
|
| @Logger
| private Log log;
|
| @In(required = false)
| private Conversation conversation;
|
| @In(create = true)
| private transient FacesMessages facesMessages;
|
| private enum ParentObjectKind {ORGANISATION, USER};
| private ParentObjectKind parentObjectKind = null;
| private long primaryKey;
|
| private int percent = -1;
| private PersistentFacesState state = null;
|
| private Image image = null;
|
| @Begin
| @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
| public String startUpload(Object selectedObject) {
| log.info("> startUpload");
| String theValueToBeReturned = null;
| state = PersistentFacesState.getInstance();
| if (selectedObject instanceof Organisation) {
| parentObjectKind = ParentObjectKind.ORGANISATION;
| primaryKey = ((Organisation)selectedObject).getId();
| log.info("Organisation Id was =>" + primaryKey);
| theValueToBeReturned = "upload";
| } else if (selectedObject instanceof User) {
| parentObjectKind = ParentObjectKind.USER;
| primaryKey = ((User)selectedObject).getId();
| log.info("User Id was =>" + primaryKey);
| theValueToBeReturned = "upload";
| } else {
| log.error("upload called with object type not supported.");
| }
| logConversation("Upload");
| log.info("< startUpload");
| return theValueToBeReturned;
| }
|
| @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
| public void setPercent(int percent) {
| log.info("> setPercent");
| this.percent = percent;
| log.info("< setPercent");
| }
|
| @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
| public int getPercent() {
| log.info("> getPercent");
| log.info("< getPercent");
| return percent;
| }
|
| //@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
| @TransactionAttribute(TransactionAttributeType.REQUIRED)
| public void action(ActionEvent event) {
| log.info("> action");
| InputFile inputFile = (InputFile) event.getSource();
| if (inputFile.getStatus() == InputFile.SAVED) {
| String fileName = inputFile.getFileInfo().getFileName();
| String contentType = inputFile.getFileInfo().getContentType();
|
| File file = inputFile.getFile();
| byte[] inputFileAsBytes = getFileAsBytes(file);
|
| // Check if the image needs to be rescaled
| int width = Math.min(MAX_IMAGE_WIDTH, 70);
| ImageIcon icon = new ImageIcon(inputFileAsBytes);
| boolean rescale = false;
| if (width > 0 && width != icon.getIconWidth()) {
| rescale = true;
| }
|
| byte[] inputFileAsThumbnailAsBytes = null;
| // Rescale the image if required
| if (rescale) {
| inputFileAsThumbnailAsBytes = getRescaledImageAsBytes(contentType, width, icon);
| } else {
| inputFileAsThumbnailAsBytes = inputFileAsBytes;
| }
| Image image = (Image)Component.getInstance("image", true);
| image.setName(fileName);
| image.setType(contentType);
| image.setThumbnail(inputFileAsThumbnailAsBytes);
| image.setImage(inputFileAsBytes);
| image.setVersion(0);
| this.image = image;
|
| } else if (inputFile.getStatus() == InputFile.INVALID) {
| inputFile.getFileInfo().getException().printStackTrace();
| } else if (inputFile.getStatus() == InputFile.SIZE_LIMIT_EXCEEDED) {
| inputFile.getFileInfo().getException().printStackTrace();
| } else if (inputFile.getStatus() == InputFile.UNKNOWN_SIZE) {
| inputFile.getFileInfo().getException().printStackTrace();
| }
| done(); // HACK!
| log.info("< action");
| }
|
| @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
| private byte[] getFileAsBytes(File file) {
| byte[] valueToReturn = null;
| log.info("> getAsBytes");
| InputStream in = null;
| OutputStream out = null;
| try {
| in = new BufferedInputStream(new FileInputStream(file));
| ByteArrayOutputStream baos = new ByteArrayOutputStream();
| out = new BufferedOutputStream(baos);
|
| final int toRead = 1024;
| byte[] buffy = new byte[toRead];
| int read;
|
| while ((read = in.read(buffy)) != -1) {
| out.write(buffy, 0, read);
| out.flush();
| }
|
| valueToReturn = baos.toByteArray();
|
| } catch (IOException e) {
| throw new IllegalStateException(e.getMessage());
| } finally { // Try to release any resources.
|
| try {
| if (in != null) {
| in.close();
| }
| } catch (IOException ignored) {}
|
| try {
| if (out != null) {
| out.close();
| }
| } catch (IOException ignored) {}
| }
| log.info("< getAsBytes");
| return valueToReturn;
| }
|
| @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
| private byte[] getRescaledImageAsBytes(String contentType , int width, ImageIcon icon) {
| double ratio = (double) width / icon.getIconWidth();
| int height = (int) (icon.getIconHeight() * ratio);
|
| int imageType = "image/png".equals(contentType) ? BufferedImage.TYPE_INT_ARGB
| : BufferedImage.TYPE_INT_RGB;
| BufferedImage bImg = new BufferedImage(width, height, imageType);
| Graphics2D g2d = bImg.createGraphics();
| g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
| RenderingHints.VALUE_INTERPOLATION_BICUBIC);
| g2d.drawImage(icon.getImage(), 0, 0, width, height, null);
| g2d.dispose();
|
| String formatName = "";
| if ("image/png".equalsIgnoreCase(contentType))
| formatName = "png";
| else if ("image/jpeg".equalsIgnoreCase(contentType))
| formatName = "jpeg";
| else if ("image/jpg".equalsIgnoreCase(contentType))
| formatName = "jpg";
| else if ("image/gif".equalsIgnoreCase(contentType))
| formatName = "gif";
|
| ByteArrayOutputStream baos = null;
| OutputStream out = null;
| try {
| baos = new ByteArrayOutputStream();
| out = new BufferedOutputStream(baos);
| try {
| ImageIO.write(bImg, formatName, out);
| } catch (IOException e) {
| e.printStackTrace();
| }
| } finally { // Try to release any resources.
| try {
| if (baos != null) {
| baos.close();
| }
| } catch (IOException ignored) {}
| try {
| if (out != null) {
| out.close();
| }
| } catch (IOException ignored) {}
| }
| return baos.toByteArray();
| }
|
| @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
| public void progress(EventObject event) {
| log.info("> progress");
| InputFile file = (InputFile) event.getSource();
| this.percent = file.getFileInfo().getPercent();
| try {
| if (state != null) {
| state.render();
| } else {
| System.out.println("state is null");
| }
| } catch (RenderingException ee) {
| System.out.println(ee.getMessage());
| }
| log.info("< progress");
| }
|
| //@End
| //@TransactionAttribute(TransactionAttributeType.REQUIRED)
| public String done() {
| log.info("> done");
| String valueToReturn = null;
|
| em.persist(image);
| if (parentObjectKind == ParentObjectKind.ORGANISATION) {
| Organisation organisationToBeUploadedTo = em.find(Organisation.class, primaryKey);
| if (organisationToBeUploadedTo == null) {
| log.warn("Organisation to be Uploaded to is not found." + primaryKey);
| } else {
| organisationToBeUploadedTo.setPicture(image);
| em.persist(organisationToBeUploadedTo);
| em.flush();
| FindOrganisationController findOrganisationController = (FindOrganisationController)Component.getInstance("findOrganisationController", false);
| if (findOrganisationController != null) {
| // We have to inform the Stateful findOrganisationController that one of its children has been updated.
| findOrganisationController.updateOrganisationInExistingList(organisationToBeUploadedTo);
| }
| facesMessages.addFromResourceBundle("organisation_picture_added");
| valueToReturn = "findOrganisation";
| }
| } else if (parentObjectKind == ParentObjectKind.USER) {
| User userToBeUploadedTo = em.find(User.class, primaryKey);
| if (userToBeUploadedTo == null) {
| log.warn("User to be Uploaded to is not found." + primaryKey);
| } else {
| userToBeUploadedTo.setPicture(image);
| em.persist(userToBeUploadedTo);
| em.flush();
| FindUserController findUserController = (FindUserController)Component.getInstance("findUserController", false);
| if (findUserController != null) {
| // We have to inform the Stateful findUserController that one of its children has been updated.
| findUserController.updateUserInExistingList(userToBeUploadedTo);
| }
| facesMessages.addFromResourceBundle("user_picture_added");
| valueToReturn = "findUser";
| }
| } else {
| log.error("done called with object type not supported.");
| }
|
| log.info("< done");
| return valueToReturn;
| }
|
| @End
| @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
| public String cancel() {
| log.info("> cancel");
| String valueToReturn = null;
| if (parentObjectKind == ParentObjectKind.ORGANISATION) {
| valueToReturn = "findOrganisation";
| } else if (parentObjectKind == ParentObjectKind.USER) {
| valueToReturn = "findUser";
| } else {
| log.error("cancel called with object type not supported.");
| }
| log.info("< cancel");
| return valueToReturn;
| }
|
| @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
| private void logConversation(String name) {
| log.info("Starting " + name + " conversation.");
| if (conversation != null) {
| log.info("Conversation. (" + conversation.getId() + ")");
| }
| }
|
| @Remove
| @Destroy
| @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
| public void destroy() {
| log.info("> destroy");
| log.info("< destroy");
| }
|
| }
|
|
|
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4022207#4022207
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4022207
More information about the jboss-user
mailing list