Conversation propagation issues
lightguard Jun 4, 2008 8:08 PMNot sure what's going on, but it's driving me crazy. We have one page where we start the conversation in the page.xml, then when we click an ice:commandLink the conversation stops and we get the @In must not be null exception. We've tried lots different things and I'll post the current sections. If someone could tell me what we're doing wrong I would really appreciate it.
first component
@Name("nomineeSearch")
@Scope(ScopeType.CONVERSATION)
public class NomineeSearch
{
@In
private EntityManager entityManager;
@Logger
private Log log;
private Employee employee = new Employee();
@DataModel(scope = ScopeType.PAGE)
private List<Employee> results;
@DataModelSelection
private Employee employeeForDetails = new Employee();
@Out(required = false)
private Employee nominee;
private boolean popupVisible = false;
public void searchNominee()
{
this.log.trace("Firstname: #{firstname}");
this.log.trace("Lastname: #{lastname}");
this.results = entityManager.createQuery("select employee from Employee employee where lower(employee.firstname) like #{firstname} and lower(employee.lastname) like #{lastname}").getResultList();
this.log.trace("return size: " + this.results.size());
}
@Factory(value = "firstname", scope = ScopeType.EVENT)
public String getFirstNamePattern()
{
return this.employee.getFirstname() == null ? "%" : this.employee.getFirstname().toLowerCase().replace('*', '%') + '%';
}
@Factory(value = "lastname", scope = ScopeType.EVENT)
public String getLastNamePattern()
{
return this.employee.getLastname() == null ? "%" : this.employee.getLastname().toLowerCase().replace('*', '%') + '%';
}
public void closePopup(ActionEvent event)
{
this.setPopupVisible(false);
}
public void showPopup(ActionEvent event)
{
this.setPopupVisible(true);
}
public void rowSelection(RowSelectorEvent e)
{
int itemRow = e.getRow();
this.log.debug("Item index: " + itemRow);
if (this.results.get(itemRow).getSelected())
{
this.employeeForDetails = this.results.get(itemRow);
return;
}
}
public void selectNominee(Employee pNominee)
{
this.nominee = pNominee;
log.debug("set this.nominee with " + this.nominee.getFirstname());
}
public Employee getEmployee()
{
return this.employee;
}
public void setEmployee(Employee pEmployee)
{
this.employee = pEmployee;
}
public boolean isPopupVisible()
{
return this.popupVisible;
}
public void setPopupVisible(boolean pPopupVisible)
{
this.popupVisible = pPopupVisible;
}
public Employee getEmployeeForDetails()
{
return this.employeeForDetails;
}
public void setEmployeeForDetails(Employee pEmployeeForDetails)
{
this.employeeForDetails = pEmployeeForDetails;
}
public Employee getNominee()
{
return nominee;
}
public void setNominee(Employee nominee)
{
this.nominee = nominee;
}
}page.xml for first page
<?xml version="1.0" encoding="UTF-8"?>
<page xmlns="http://jboss.com/products/seam/pages"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jboss.com/products/seam/pages http://jboss.com/products/seam/pages-2.0.xsd">
<begin-conversation join="true"/>
<description>
Create Nomination
Finds a nominee
</description>
<navigation from-action="#{nomineeSearch.selectNominee(_employee)}">
<redirect view-id="/CreateNomination.xhtml" />
</navigation>
</page>view for first page:
<!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:ice="http://www.icesoft.com/icefaces/component"
template="layout/emptytemplate.xhtml">
<ui:define name="body">
<h:messages globalOnly="true" styleClass="message" id="globalMessages" />
<ice:form id="listemployeeFormId" styleClass="edit">
<ice:panelPopup id="popupDiv"
rendered="#{nomineeSearch.popupVisible}"
visible="#{nomineeSearch.popupVisible}"
modal="false"
draggable="true"
autoCenter="true"
style="text-align:left; width: 250px; height: 100px; position:absolute; z-index:1001;">
<f:facet name="header">
<ice:panelGrid width="100%" cellpadding="0" cellspacing="0" columns="2" style="text-align: center;">
<ice:outputText style="color: #FFFFFF;" value="Employee Information"/>
<ice:commandButton type="button" image="img/close.gif" actionListener="#{nomineeSearch.closePopup}" title="Close this draggable popup"/>
</ice:panelGrid>
</f:facet>
<f:facet name="body">
<ice:panelGrid width="100%" columns="2" style="text-align: center">
<ice:outputText value="First Name" />
<ice:outputText value="#{nomineeSearch.employeeForDetails.firstname}" />
<ice:outputText value="Last Name" />
<ice:outputText value="#{nomineeSearch.employeeForDetails.lastname}" />
<ice:outputText value="Employee Id" />
<ice:outputText value="#{nomineeSearch.employeeForDetails.employeeid}" />
<ice:outputText value="Email" />
<ice:outputText value="#{nomineeSearch.employeeForDetails.email}" />
</ice:panelGrid>
</f:facet>
</ice:panelPopup>
<ice:panelGroup id="searchGroup" styleClass="formBorderHighlight">
<ice:panelGroup id="listPanelGroupEmployeeId" styleClass="edit">
<s:decorate id="firstnamedecId" template="layout/display.xhtml">
<ui:define name="label">First Name</ui:define>
<ice:inputText id="listfirstnameTextId"
value="#{nomineeSearch.employee.firstname}" />
</s:decorate>
<s:decorate id="lastnamedecId" template="layout/display.xhtml">
<ui:define name="label">Last Name</ui:define>
<ice:inputText id="listlastnameTextId"
value="#{nomineeSearch.employee.lastname}" />
</s:decorate>
</ice:panelGroup>
<div class="actionButtons">
<ice:commandButton
id="listSearchButtonId" value="Search"
action="#{nomineeSearch.searchNominee}" />
</div>
</ice:panelGroup>
<ice:panelGroup styleClass="formBorderHighlight"
rendered="#{not empty results}">
<h3>Nominees</h3>
<div class="searchResults" id="listemployeeResults">
<ice:dataTable
id="nomineeSearchTableId" var="_employee"
value="#{results}" columnClasses="allCols"
rendered="#{not empty results}">
<ice:column id="listfirstnameId#{_employee.id}">
<ice:rowSelector id="selected"
value="#{_employee.selected}"
multiple="false"
selectionListener="#{nomineeSearch.rowSelection}"/>
<f:facet name="header">Employee Name</f:facet>
<ice:commandLink action="#{nomineeSearch.selectNominee(_employee)}"
id="listemployeeId#{_employee.id}">
#{_employee.firstname} #{_employee.lastname}
<s:conversationId />
</ice:commandLink>
</ice:column>
<ice:column id="listemployeeidId#{_employee.id}">
<f:facet name="header">Employee Id</f:facet>
#{_employee.employeeid}&nbsp;
</ice:column>
<ice:column id="listColumnEmployeeId#{_employee.id}">
<f:facet name="header">View Details</f:facet>
<ice:commandButton id="details#{_employee.id}"
value="View Details"
actionListener="#{nomineeSearch.showPopup}"/>
</ice:column>
</ice:dataTable>
</div>
</ice:panelGroup>
</ice:form>
</ui:define>
</ui:composition>second page view:
<!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:ice="http://www.icesoft.com/icefaces/component"
template="layout/emptytemplate.xhtml">
<ui:define name="body">
<h:messages globalOnly="true"
styleClass="message"
id="globalMessages"/>
<ice:form id="createNominationForm">
<ice:panelGroup>
<h2>Create Nomination</h2>
<ice:panelGroup id="createNominationPanel"
styleClass="edit">
<ice:panelCollapsible id="detailPanel"
expanded="true" >
<f:facet name="header">
<ice:outputText id="detailHeader"
value="Employee Details"/>
</f:facet>
<ice:panelGrid id="detailGrid"
columns="2"
cellpadding="4"
cellspacing="4"
width="100%">
<!-- detail-->
<ice:outputLabel for="detailName"
value="Employee Name"/>
<ice:outputText id="detailName"
value="#{nominee.lastname}, #{nominee.firstname}" />
<ice:outputLabel for="detailEmployeeId"
value="Employee Id"/>
<ice:outputText id="detailEmployeeId"
value="#{nominee.employeeid}" />
</ice:panelGrid>
</ice:panelCollapsible>
<ice:panelCollapsible id="awardLevelPanel"
expanded="true" >
<f:facet name="header">
<ice:outputText id="awardLevelHeader"
value="Award Level"/>
</f:facet>
<ice:panelGrid id="awardLevelGrid"
columns="2"
cellpadding="4"
cellspacing="4"
width="100%">
<!-- award level-->
<ice:outputLabel for="awardLevelSelect"
value="Award Level"/>
<h:selectOneMenu id="awardLevelSelect"
value="#{nominationAction.nomination.awardlevel}"
required="true">
<s:selectItems value="#{nominationAction.awardLevels}" var="level"
label="#{level.name}"
noSelectionLabel="Please Select..."/>
<s:convertEntity />
</h:selectOneMenu>
</ice:panelGrid>
</ice:panelCollapsible>
<ice:panelCollapsible id="achievementPanel"
expanded="false" >
<f:facet name="header">
<ice:outputText id="achieveHeader"
value="Achievement"/>
</f:facet>
<ice:panelGrid id="achievementGrid"
columns="2"
cellpadding="4"
cellspacing="4"
width="100%">
<!-- achievement-->
<ice:outputLabel for="achievementInput"
value="Achievement"/>
<h:inputTextarea id="achievementInput"
value="#{nominationAction.nomination.achievement}"
required="true"/>
</ice:panelGrid>
</ice:panelCollapsible>
<ice:panelCollapsible id="notesPanel"
expanded="false" >
<f:facet name="header">
<ice:outputText id="notesHeader"
value="Notes"/>
</f:facet>
<ice:panelGrid id="notesGrid"
columns="2"
cellpadding="4"
cellspacing="4"
width="100%">
<!-- notes-->
<ice:outputLabel for="notesInput"
value="Notes"/>
<h:inputTextarea id="notesInput"
value="#{nominationAction.nomination.notes}"
required="false"/>
</ice:panelGrid>
</ice:panelCollapsible>
<ice:panelCollapsible id="approversPanel"
expanded="false" >
<f:facet name="header">
<ice:outputText id="approversHeader"
value="Approvers"/>
</f:facet>
<ice:panelGrid id="approversGrid"
columns="2"
cellpadding="4"
cellspacing="4"
width="100%">
<!-- approvers-->
<ice:outputLabel for="approversInput"
value="Last Name Starts With"/>
<ice:selectInputText id="approversInput"
rows="6"
width="300"
listVar="approver"
valueChangeListener="#{approverService.updateApproverList}"
listValue="#{approverService.approverList}">
<f:facet name="selectInputText">
<ice:panelGrid id="approverAutoCompleteGrid"
columns="2">
<ice:outputText value="#{approver.lastname}, "/>
<ice:outputText value="#{approver.firstname}"/>
</ice:panelGrid>
</f:facet>
</ice:selectInputText>
<ice:outputLabel for="selectedApproversList"
value="Selected Approvers"/>
<ice:panelGroup style="margin-top:10px;">
<ice:panelPositioned id="selectedApproversList"
var="approver"
value="#{approverService.selectedApproverList}"
styleClass="positionPanelContainer"
listener="#{approverService.positionApprovers}"
constraint="vertical">
<ice:panelGroup style="cursor:move;" styleClass="container">
<ice:panelGroup styleClass="moveLabel"
style="border: 4px red">
<ice:outputText id="approverName"
value="#{approver.formattedName}"/>
</ice:panelGroup>
</ice:panelGroup>
</ice:panelPositioned>
</ice:panelGroup>
</ice:panelGrid>
</ice:panelCollapsible>
</ice:panelGroup>
<div class="actionButtons">
<ice:commandButton id="createNominationButton" value="Submit" action="#{nominationAction.createNomination}"/>
</div>
</ice:panelGroup>
</ice:form>
</ui:define>
</ui:composition>second page.xml:
<?xml version="1.0" encoding="UTF-8"?>
<page xmlns="http://jboss.com/products/seam/pages"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jboss.com/products/seam/pages http://jboss.com/products/seam/pages-2.0.xsd"
no-conversation-view-id="/SearchNominee.xhtml">
<description>
Create Nomination for #{nominee.firstname} #{nominee.lastname}
Walks the user through the process of creating a nomination
</description>
</page>Second component:
@Name("nominationAction")
@Scope(ScopeType.CONVERSATION)
public class NominationAction
{
@In
private EntityManager entityManager;
@In (required = false)
private List<Employee> selectedApproverList;
@In
private Employee nominee;
@Logger
private Log log;
private Nomination nomination = new Nomination();
@Factory (value = "awardLevels")
public List<Awardlevel> getAwardLevels()
{
return this.entityManager.createQuery("from Awardlevel").getResultList();
}
public Nomination getNomination()
{
return this.nomination;
}
public void setNomination(Nomination pNomination)
{
this.nomination = pNomination;
}
@End
public void createNomination()
{
Employee nominator = new Employee();
nominator.setId(1l);
this.nomination.setEmployeeByNominatorid(nominator);
this.nomination.setNominationdate(new Date());
this.nomination.setEmployeeByNomineeid(this.nominee);
entityManager.persist(this.nomination);
this.setApprovals();
entityManager.persist(this.nomination);
entityManager.flush();
}
private void setApprovals()
{
if (this.selectedApproverList != null && this.selectedApproverList.size() > 0)
{
ApprovalId id;
Approval approval;
for (Employee approver : this.selectedApproverList)
{
approval = new Approval();
id = new ApprovalId();
approval.setId(id);
id.setEmployeeid(approver.getId());
id.setNominationid(this.nomination.getId());
approval.setNomination(this.nomination);
approval.setEmployee(approver);
this.nomination.getApprovals().add(approval);
}
}
}
public Employee getNominee()
{
return this.nominee;
}
public void setNominee(Employee pNominee)
{
this.nominee = pNominee;
}
}