Newbie: Problem with Image loading and rendering
rmbittmann May 22, 2010 11:09 AMHi All,
I am new to Seam and have a problem when trying to implement a profile
page. I am using Seam 2.2.0.GA.
My strategy is to have two entities, for the User and for his or her photo with a One to One connection with Lazy fetching.
The Profile bean has a Conversation scope and a Manual Flush mode.
In the page I am using the Seam graphic Image to display the image if exists, or a default icon if not, and the seam File Upload to load the image file. I am using Richfaces support tag to check for a change in the File Upload and re-render the Image , surrounded by an output panel, if changed.
I have save and cancel buttons at the bottom of the page, where the save flushes the entity and the cancel clears it.
What actually happens is that when I load a new image it is displayed as non-existent (default icon) but after saving and re-entering the page the correct picture appears. If I cancel the picture is removed (i.e. the older picture is removed and there is no picture, not the old one and not the newly loaded one).
Since I am a Newbie, I am probably doing something wrong, but I have a hard time to figure it out. Any help will be much appreciated!
The relevant code:
@Stateful
@Scope(ScopeType.CONVERSATION)
@Name("profile")
public class ProfileBean implements Profile
{
@Logger private Log log;
@In private EntityManager entityManager;
@In private Identity identity;
@In StatusMessages statusMessages;
..........
private User currentUser;
..........
@SuppressWarnings("unchecked")
@Create
@Begin(join=true, flushMode=FlushModeType.MANUAL)
public void start()
{
...........
currentUser = (User)entityManager.createQuery("SELECT o FROM User o WHERE o.username = :username")
.setParameter("username", identity.getCredentials().getUsername())
.getSingleResult();
if (currentUser != null)
{
if (currentUser.getPhoto() == null)
{
currentUser.setPhoto(new Photo());
currentUser.getPhoto().setIdUser(currentUser.getIdUser());
currentUser.getPhoto().setSize(0);
log.info("profile.start() initialized photo for #{profile.currentUser.username}");
}
.............
}
@End
public void save()
{
if (currentUser != null)
{
if (currentUser.getPhoto() == null ||
currentUser.getPhoto().getSize() == null ||
currentUser.getPhoto().getSize() == 0)
{
currentUser.setPhoto(null);
entityManager.createQuery("DELETE FROM Photo WHERE idUser = :idUser")
.setParameter("idUser", currentUser.getIdUser())
.executeUpdate();
}
..............
entityManager.flush();
log.info("profile.save() save profile for user: #{profile.currentUser.username}");
statusMessages.add(Severity.INFO,"Profile #{profile.currentUser.username} updated");
}
}
@End
public void cancel()
{
entityManager.clear();
log.info("profile.cancel() cancelled changes to profile of user: #{profile.currentUser.username}");
statusMessages.add(Severity.WARN, "Profile #{profile.currentUser.username} not updated");
}
...........
}
@Entity
@Table(name = "user")
public class User implements java.io.Serializable {
.........
@OneToOne(fetch = FetchType.LAZY,
cascade=CascadeType.ALL)
@PrimaryKeyJoinColumn
public Photo getPhoto() { return photo; }
public void setPhoto(Photo photo) { this.photo = photo; }
}
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:s="http://jboss.com/products/seam/taglib"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:rich="http://richfaces.org/rich"
xmlns:a="http://richfaces.org/a4j" template="layout/template.xhtml">
<ui:define name="body">
<h:form id="profileForm" enctype="multipart/form-data">
...........
<s:decorate id="photoField" template="layout/edit.xhtml">
<h:panelGrid columns="2">
<h:panelGroup>
<a:outputPanel id="imagePanel">
<s:graphicImage id="currentImage"
value="#{profile.currentUser.photo.data}"
rendered="#{profile.currentUser.photo.data != null}">
<s:transformImageSize width="50" maintainRatio="true"/>
</s:graphicImage>
<s:graphicImage id="defaultImage"
value="/img/defaultPhoto.png"
rendered="#{profile.currentUser.photo.data == null}"/>
</a:outputPanel>
</h:panelGroup>
<a:region id="photoRegion">
<s:fileUpload id="uploadImage"
data="#{profile.currentUser.photo.data}"
contentType="#{profile.currentUser.photo.contentType}"
fileName="#{profile.currentUser.photo.name}"
fileSize="#{profile.currentUser.photo.size}">
<a:support event="onchange" reRender="imagePanel"/>
</s:fileUpload>
</a:region>
</h:panelGrid>
</s:decorate>
........
<div class="actionButtons"><h:commandButton id="save"
value="Save" action="#{profile.save}" /></div>
<div class="actionButtons"><h:commandButton id="cancel"
immediate="true" value="Cancel" action="#{profile.cancel}" /></div>
</h:form>
</ui:define>
</ui:composition>