Form wizard and conversation scope issue
shavo26 Jun 15, 2010 7:45 PMEnvironment: Seam 2.2.0.GA JDK 1.6 JBOSS 5.1.0.GA Hibernate 3.3.0.GA 
Im having an issue setting up a simple form wizard.
Steps are:
* Screen #1: submit inquiry form detail * Screen #2: add attachment(s) * Screen #3: confirm attachment list
Im on screen 2 and when i add attachment to inquiry, they are not been stored. I am using a stateful session bean, which default scope is conversation for my action class.
I have a radio button on screen one adding inqiry, isAddAttachments. If true then i go to screen two and upload as many attachments as i want before submitting. I outject newInquiry to conversation scope so i take its stored there until i end the conversation. problem is every time i add an attachment the size of the list is one. 
Why is that? Is it a problem around seam component newAttachment or the way im storing my newInquiry context variable? 
Snippet Code for action class is:
@Stateful
@Name(value="inquiry")
public class InquiryAction implements Inquiry {
    
    @org.jboss.seam.annotations.In
    @Out
    private inquiry.model.Inquiry newInquiry;
    
    @In(required=false)
    Attachment newAttachment;
    
    @Logger private Log log;
    @In
    private Renderer renderer;
    @In
    private EntityManager entityManager;
    
    @org.jboss.seam.annotations.In
    private org.jboss.seam.faces.FacesMessages facesMessages;
    
    @Begin
    public String addInquiry(){
        if(newInquiry.getEmail().trim().equals(newInquiry.getConfirmEmail().trim())){
                //store pdf in document
                byte[] pdf = this.createPDF();
                newInquiry.setPdfDocument(pdf);
                if(!newInquiry.isAddAttachments()){
                    entityManager.persist(newInquiry);
                    this.sendEmail();
                    facesMessages.add("Successfully submitted web inquiry form");
                }
                return "success";
        }else{
            facesMessages.add("Email addresses do not match");
            return null;
        }
    }
    
    @End
    public void save(){
        entityManager.persist(newInquiry);
        this.sendEmail();
        facesMessages.add("Successfully submitted web inquiry form");
    }
    
    public void addAttachment(){
        newInquiry.getAttachments().add(newAttachment);
        facesMessages.add("Added attachment to inquiry form {0}",newAttachment.getFileName());
    }
    
    @End
    public String cancel(){
        return "/home.xhtml";
    }Inquiry entity is:
@Entity
@Name(value = "newInquiry")
public class Inquiry  implements Serializable{
    
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private long id;
    private String question;
    private String entityNumber;
    private String entityName;
    private Title title;
    private String givenName;
    private String familyName;
    private String telephoneNumber;
    private String email;
    private QuestionType questionType;
    private String timeToCall;
    private String confirmEmail;
    private boolean addAttachments;
    private byte[] pdfDocument;
    private Set<Attachment> attachments = new HashSet<Attachment>(0);
    @Embedded
    @AttributeOverrides( {
            @AttributeOverride(name="countryCode", column = @Column(name="countryCode")) } )
    private Address address = new Address();
    
    public Inquiry(){
    }
    
    @Id
    @GeneratedValue
    public long getId() {
        return id;
    }
    
    
    public void setId(long id){
        this.id = id;
    }
    
    @Column(name = "pdfDoc")
    @Basic(fetch = FetchType.LAZY)
    public byte[] getPdfDocument() {
        return pdfDocument;
    }
    
    public void setPdfDocument(byte[] pdfDocument) {
        this.pdfDocument = pdfDocument;
    }
    
    @Transient
    public boolean isAddAttachments() {
        return addAttachments;
    }
    
    public void setAddAttachments(boolean addAttachments) {
        this.addAttachments = addAttachments;
    }
    
    @NotNull
    @Column(nullable = false)
    public String getTimeToCall() {
        return timeToCall;
    }
    
    public void setTimeToCall(String timeToCall) {
        this.timeToCall = timeToCall;
    }
    
    @Enumerated(EnumType.STRING)
    public QuestionType getQuestionType() {
        return questionType;
    }
    
    public void setQuestionType(QuestionType questionType) {
        this.questionType = questionType;
    }
    
    
    @Column(length = 5000)
    public String getQuestion() {
        return question;
    }
    public void setQuestion(String question) {
        this.question = question;
    }
    @Column(length = 9, nullable = false)
    @NotNull
    public String getEntityNumber() {
        return entityNumber;
    }
    public void setEntityNumber(String entityNumber) {
        this.entityNumber = entityNumber;
    }
    public String getEntityName() {
        return entityName;
    }
    public void setEntityName(String entityName) {
        this.entityName = entityName;
    }
    @Enumerated(EnumType.STRING)
    public Title getTitle() {
        return title;
    }
    public void setTitle(Title title) {
        this.title = title;
    }
    @NotNull
    public String getGivenName() {
        return givenName;
    }
    public void setGivenName(String givenName) {
        this.givenName = givenName;
    }
    @NotNull
    public String getFamilyName() {
        return familyName;
    }
    public void setFamilyName(String familyName) {
        this.familyName = familyName;
    }
    @NotNull
    @Column(name = "phoneNo")
    public String getTelephoneNumber() {
        return telephoneNumber;
    }
    public void setTelephoneNumber(String telephoneNumber) {
        this.telephoneNumber = telephoneNumber;
    }
    @Email()
    @NotNull
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    
    @Transient
    public String getConfirmEmail(){
        return this.confirmEmail;
    }
    
    public void setConfirmEmail(String email) {
        this.confirmEmail = email;
    }
    
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "inquiry")
    public Set<Attachment> getAttachments() {
        return attachments;
    }
    public void setAttachments(Set<Attachment> attachments) {
        this.attachments = attachments;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }Attachment screen snippet is:
 <h:form enctype="multipart/form-data" id="attachmentForm" styleClass="edit">
    <rich:panel>
            <f:facet name="header">General Inquiry form - Attachments</f:facet>
            
            <s:decorate id="descField" template="layout/edit.xhtml">
                <ui:define name="label">Description of Document</ui:define>
                <h:inputText id="description"
                              value="#{newAttachment.description}"/>
            </s:decorate>
            <s:decorate id="fileUploadDecoration" template="layout/edit.xhtml">
                         <ui:define name="label">Pathname</ui:define>
                         <s:fileUpload id="file" 
                                    data="#{newAttachment.doc}"
                                    contentType="#{newAttachment.fileContentType}"
                                    fileName="#{newAttachment.fileName}"
                                    fileSize="#{newAttachment.fileSize}" />
                    </s:decorate>
                    
                     <div style="clear:both">
                <span class="required">*</span>
                required fields
            </div>
            
            </rich:panel>
            
            <div class="actionButtons">
                    <h:commandButton value="Upload" 
                               action="#{inquiry.addAttachment}"/>
                    <h:commandButton value="Next" 
                               action="#{inquiry.save}"/>
               </div>
               
               <s:link view="/attachmentList.xhtml" value="Attachment Summary"/>
            
            </h:form>Thanks,
Shane. 
        
    
