title: PrimeFaces 3.0 - Exception in <p:tree> node selection when tree is in a <p:dialog>
body: <p><em>This question is mainly directed at the PrimeFaces dev team but maybe someone else knows a workaround. I can't upload screenshots on the PrimeFaces support forums but I can link to my question here.</em></p>
  
  <p><em>Reported in PrimeFaces support forums:</em> <a href="http://primefaces.prime.com.tr/forum/viewtopic.php?f=3&amp;t=14022" rel="nofollow noreferrer">http://primefaces.prime.com.tr/forum/viewtopic.php?f=3&amp;t=14022</a></p>
  
  <p>I have a <code>&lt;p:tree&gt;</code> in my webapp that has <code>selection="single"</code> mode set. Node selection is working normally when the <code>&lt;p:tree&gt;</code> is not inside a <code>&lt;p:dialog&gt;</code> as shown here:</p>
  
  <p><img src="https://i.stack.imgur.com/Kgeaa.png" alt="Works OK when not inside a dialog"></p>
  
  <p>However, when the <code>&lt;p:tree&gt;</code> is inside a dialog an exception is thrown on the server side each time a node is clicked in the browser. The selection is never registered on the backing bean:</p>
  
  <p><img src="https://i.stack.imgur.com/FC9Vi.png" alt="Fails to set selection when inside a dialog"></p>
  
  <p>The following stacktrace appears in my server logs once for each time a tree node is clicked by a user in the browser:</p>
  
  <pre><code>    27-Jul-2011 3:21:52 PM com.sun.faces.context.PartialViewContextImpl processPartial
  INFO: java.lang.NullPointerException
  java.lang.NullPointerException
      at org.primefaces.component.tree.TreeRenderer.decode(TreeRenderer.java:53)
      at javax.faces.component.UIComponentBase.decode(UIComponentBase.java:787)
      at javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1181)
      at com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:506)
      at com.sun.faces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:183)
      at javax.faces.component.UIComponent.visitTree(UIComponent.java:1589)
      at javax.faces.component.UIComponent.visitTree(UIComponent.java:1600)
      at javax.faces.component.UIComponent.visitTree(UIComponent.java:1600)
      at javax.faces.component.UIForm.visitTree(UIForm.java:344)
      at javax.faces.component.UIComponent.visitTree(UIComponent.java:1600)
      at javax.faces.component.UIComponent.visitTree(UIComponent.java:1600)
      at javax.faces.component.UIComponent.visitTree(UIComponent.java:1600)
      at javax.faces.component.UIComponent.visitTree(UIComponent.java:1600)
      at javax.faces.component.UIComponent.visitTree(UIComponent.java:1600)
      at com.sun.faces.context.PartialViewContextImpl.processComponents(PartialViewContextImpl.java:376)
      at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:252)
      at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:183)
      at javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:931)
      at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:78)
      at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
      at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
      at javax.faces.webapp.FacesServlet.service(FacesServlet.java:409)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
      at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
      at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
      at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
      at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
      at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
      at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563)
      at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
      at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:399)
      at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:317)
      at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:204)
      at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:311)
      at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
      at java.lang.Thread.run(Thread.java:662)
  </code></pre>
  
  <p>Here is the offending PrimeFaces method:</p>
  
  <pre><code>@Override
  public void decode(FacesContext context, UIComponent component) {
      Tree tree = (Tree) component;
      Map&lt;String,String&gt; params = context.getExternalContext().getRequestParameterMap();
      String clientId = tree.getClientId(context);
      TreeModel model = new TreeModel((TreeNode) tree.getValue());
  
      if(tree.getSelectionMode() != null) {
          String selection = params.get(clientId + "_selection");
  
          String instantUnselection = params.get(clientId + "_instantUnselection");
          boolean isSingle = tree.getSelectionMode().equalsIgnoreCase("single");
  
          if(selection.equals("")) {
              if(isSingle)
                  tree.setSelection(null);
              else
                  tree.setSelection(new TreeNode[0]);
          }
          else {
              String[] selectedRowKeys = selection.split(",");
  
              if(isSingle) {
                  TreeNode selectedNode = treeExplorer.findTreeNode(selectedRowKeys[0], model);
                  tree.setSelection(selectedNode);
              }
              else {
                  TreeNode[] selectedNodes = new TreeNode[selectedRowKeys.length];
  
                  for(int i = 0 ; i &lt; selectedRowKeys.length; i++) {
                      selectedNodes[i] = treeExplorer.findTreeNode(selectedRowKeys[i], model);
                      model.setRowIndex(-1);  //reset
                  }
  
                  tree.setSelection(selectedNodes);
              }
          }
      }
  
      decodeBehaviors(context, component);
  }
  </code></pre>
  
  <p>The line that causes the exception is this one:</p>
  
  <pre><code>        if(selection.equals("")) {
  </code></pre>
  
  <p>In the case where the <code>&lt;p:tree&gt;</code> is located inside a <code>&lt;p:dialog&gt;</code> the value of <code>selection</code> is always <code>null</code>.</p>
  
  <p><strong>Any idea how to work around this issue?</strong></p>
  
  <p>I am using today's nightly build of PF 3.0-M3-SNAPSHOT. Same thing happens with PF 3.0-M2. Exhibits the same behavior in both IE 7 and Firefox 4.0.1.</p>