[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