0

I'm trying to conditionally render a commandlink. However I discovered when debugging the bean function stocksView.hasPortfolios is never called. Is this the correct way to user render or should I be doing this in another way?

<h:form id="form">
        <p:dataGrid id="prices" var="orderBooks" value="#{stocksView.latestPricesResults}" columns="3" rows="12">
                <f:facet name="header">
                    WST 100
                </f:facet>
                <p:column>
                <p:panel header="#{orderBooks.bidOrderId.member.memberId}">
            <h:panelGrid columns="1">
            <h:outputText value="#{orderBooks.price}" />
            <h:outputText value="#{orderBooks.bidOrderId.member.party}" />
            <h:outputText value="#{orderBooks.lastUpdate}" />
            <p:commandLink update=":form:buyDetail" oncomplete="PF('buyDialog').show()" title="View Detail">
                <h:outputText value="Buy"/>
                <f:setPropertyActionListener value="#{orderBooks}" target="#{stocksView.selectedStock}" />
            </p:commandLink>
            <p:commandLink update=":form:sellDetail" oncomplete="PF('sellDialog').show()" title="View Detail" rendered="#{stocksView.hasPortfolios[orderBooks.bidOrderId.member.memberId]}">
                <h:outputText value="Sell"/>
                <f:setPropertyActionListener value="#{orderBooks}" target="#{stocksView.selectedStock}" />
            </p:commandLink>
            </h:panelGrid>
            </p:panel>
            </p:column>
            </p:dataGrid>
 </h:form>

This is the hasPortfolios method in StocksView (which is a ViewScoped Bean). The hasPortfolios variable is private Map hasPortfolios;

public void hasPortfolios(){

     hasPortfolios = new HashMap<Boolean,String>();
      Collection<Portfolio> portfolios = user.getTrader().getPortfolios();
        Iterator<Portfolio> iter = portfolios.iterator();
        while(iter.hasNext()){
            Portfolio p = iter.next();
            if(p.getBalance() == 0){
                hasPortfolios.put(false, p.getMember().toString());
                logger.log(Level.INFO, "hasPortfolios false");
            }
            else
            {
                hasPortfolios.put(true,p.getMember().toString());
                logger.log(Level.INFO, "hasPortfolios true");
            }
        }
}
zobbo
  • 117
  • 2
  • 13

2 Answers2

0

To my eyes you should call the function like this instead of using square brackets:

rendered="#{stocksView.hasPortfolios(orderBooks.bidOrderId.member.memberId)}

Also make sure its public and there is not overloaded version of it.

Maciej Kowalski
  • 25,605
  • 12
  • 54
  • 63
0

As usual I was doing a few things wrong. Firstly my map returns a Boolean object in the rendered attribute, and this has to be a boolean primitive. So to get around that I call booleanValue()

rendered="#{stocksView.hasPortfolios[orderBooks.bidOrderId.member.memberId].booleanValue()}"

Also I had my map key/value in the wrong order so the Boolean was actually the key instead of the Member ID.

And finally, I was calling getMember().toString() which returns the Member object as a String, rather than the actual Member ID string which is returned by calling getMember().getMemberId(). So hasPortfolios should actually look like this:

public void hasPortfolios(){

    logger.log(Level.INFO, "hasPortfolios start");

     hasPortfolios = new HashMap<String,Boolean>();
      Collection<Portfolio> portfolios = user.getTrader().getPortfolios();
        Iterator<Portfolio> iter = portfolios.iterator();
        while(iter.hasNext()){
            Portfolio p = iter.next();
            if(p.getBalance() == 0){
                hasPortfolios.put(p.getMember().getMemberId(),new Boolean(false));
                logger.log(Level.INFO, "hasPortfolios false");
            }
            else
            {
                hasPortfolios.put(p.getMember().getMemberId(),new Boolean(true));
                logger.log(Level.INFO, "hasPortfolios true");
            }
        }
} 

The Sell commandlink is now rendered when there is a portfolio for the user.

Thanks for your help everyone, it pointed me in the right direction.

zobbo
  • 117
  • 2
  • 13