You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@myfaces.apache.org by Pier Paolo Bortone <pi...@noema.it> on 2005/07/15 21:41:24 UTC

Extending Tree2 - Problems with IExplore.

Hi all,
 
We have tried to extend x:tree2 to:
- insert x:tree2 in a tiles layout of Struts (using struts-faces)
- invoke Struts action
- hold focus on the node selected
- select a specified node on re-init (commented)
- manage dynamic model (add/remove node) (commented)
 
We don't understand why all runs very well with Mozilla Firefox and
NOT with MS-IExplore.
 
We obtain or a java.lang.IllegalArgumentException: Node with id 0:6.
Failed to parse 0:6
or a NullPointerException on UITreeData.setNodeId.
 
Thanks in advance!
 
Pier Paolo.
 
Here is the code implemented:
 
  <x:tree2 value="#{presentationData.treeData}" id="server-tree"
var="node"
           varNodeToggler="t" clientSideToggle="false"
showRootNode="false">
    <f:facet name="base">
      <h:panelGroup>
        <h:outputText value="#{node.description}"/>
      </h:panelGroup>
    </f:facet>
    <f:facet name="root">
      <h:panelGroup>
        <h:commandLink action="#{treeController.selectNode}"
immediate="true" actionListener="#{t.setNodeSelected}">
          <h:graphicImage value="/images/root.gif" border="0"/>
          <h:outputText value="#{node.description}"
styleClass="#{t.nodeSelected ? 'nodeFolderSelected':''}"/>
        </h:commandLink>
      </h:panelGroup>
    </f:facet>
    <f:facet name="folder">
      <h:panelGroup>
        <h:commandLink action="#{treeController.selectNode}"
immediate="true" actionListener="#{t.setNodeSelected}">
          <h:graphicImage value="/images/folder-open.gif"
rendered="#{t.nodeExpanded}" border="0"/>
          <h:graphicImage value="/images/folder-closed.gif"
rendered="#{!t.nodeExpanded}" border="0"/>
          <h:outputText value="#{node.description}"
styleClass="#{t.nodeSelected ? 'nodeFolderSelected':''}"/>
        </h:commandLink>
      </h:panelGroup>
    </f:facet>
  </x:tree2>
------------------------------------------------------------------------
--------
 
package it.noema.faces.custom.tree2;
 
import it.noema.faces.bean.PresentationDTO;
import it.noema.faces.controller.TreeController;
import it.noema.faces.util.PresentationUtil;
import it.noema.ged.model.Composite;
 
import java.io.IOException;
import java.util.Map;
 
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.http.HttpServletRequest;
 
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
 
public class HtmlTree extends org.apache.myfaces.custom.tree2.HtmlTree {
 
 private static final Log logger = LogFactory.getLog(HtmlTree.class);
 
 private static final String NODE_SELECTED_KEY =
"org.apache.myfaces.tree.NODE_SELECTED_KEY";
 
 //
 // public static final String REINIT_KEY =
"org.apache.myfaces.tree.REINIT_KEY";
 // private static final String NODE_STATE_KEY =
"org.apache.myfaces.tree.NODE_STATE_KEY";
 //
 
 
 private String _selectedNodeId;
 private TreeController treeController = null;
 
 public HtmlTree() {
  super();
  treeController = new TreeController();
 }
 
 public void restoreState(FacesContext context, Object state) {
 
  Object[] values = (Object[]) state;
  if (logger.isDebugEnabled()) {
   logger.debug("[restoreState] Selected ID: " + values[3]);
  }
  super.restoreState(context, state);
  _selectedNodeId = (String) values[3];
 }
 
 public Object saveState(FacesContext context) {
  Object values[] = (Object[]) super.saveState(context);
  values[3] = _selectedNodeId;
  if (logger.isDebugEnabled()) {
   logger.debug("[saveState] Selected ID: " + values[3]);
  }
  return values;
 }
 
 public void setNodeSelected(ActionEvent event) {
  if (logger.isDebugEnabled()) {
   logger.debug("[setNodeSelected] ID: " + getNodeId());
  }
  _selectedNodeId = getNodeId();
  ExternalContext externalContext =
getFacesContext().getExternalContext();
  externalContext.getSessionMap().put(NODE_SELECTED_KEY + ":" + getId(),
_selectedNodeId);
 
  /* *********************************** */
  /* TEMPORARY SOLUTION                  */
  /* *********************************** */
  // TODO: FIND BETTER SOLUTION TO ABSTRACTION
  GeDocTreeNode node = (GeDocTreeNode) getNode();
  if (logger.isDebugEnabled()) {
   logger.debug("[setNodeSelected] Nodo selezionato: " +
node.getDescription());
  }
  PresentationDTO presentationDTO =
PresentationUtil.getPresentationData((HttpServletRequest)
externalContext
    .getRequest());
  presentationDTO.setModelNodeSelected((Composite) node.getModelNode());
  presentationDTO.setSelectedRow(null);
 }
 
 public boolean isNodeSelected() {
  boolean b = getNodeId().equals(_selectedNodeId);
 
  if (logger.isDebugEnabled()) {
   logger.debug("[isNodeSelected] ID[" + getNodeId() + "] selected[" + b
+ "]");
  }
  return b;
 }
 
 public void encodeBegin(FacesContext context) throws IOException {
 
  Map sessionMap = context.getExternalContext().getSessionMap();
  
  /* **************************** */
  /* IS NOT BETTER SOLUTION       */
  /* **************************** */
  //ReinitTree reinitTree = (ReinitTree) sessionMap.get(REINIT_KEY);
 

  //
  //if (reinitTree != null && reinitTree.isReinit()) {
  // if (logger.isDebugEnabled()) {
  //  logger.debug("[encodeBegin] Eseguo il reinit: " + reinitTree);
  // }
        //
  // _selectedNodeId = reinitTree.getSelectedNodeId();
  // sessionMap.put(NODE_SELECTED_KEY + ":" + getId(), _selectedNodeId);
  // sessionMap.put(NODE_STATE_KEY + ":" + getId(),
reinitTree.getOpenedNodeIds());
  // sessionMap.remove(REINIT_KEY);
  //} else {
  //
   String nodeSelected = (String) sessionMap.get(NODE_SELECTED_KEY + ":"
+ getId());
 
   if (nodeSelected != null && _selectedNodeId == null) {
    _selectedNodeId = nodeSelected;
    if (logger.isDebugEnabled()) {
     logger.debug("[encodeBegin] ID: " + _selectedNodeId);
    }
   }
  //
  //}
  //
 
  super.encodeBegin(context);
 }
 
 public String toggleExpanded() {
  super.toggleExpanded();
  treeController.selectNode();
  return null;
 }
}
 

------------------------------------------------------------------------
--------
package it.noema.faces.custom.tree2;
 
import it.noema.ged.model.Model;
 
import org.apache.myfaces.custom.tree2.TreeNodeBase;
 
public class GeDocTreeNode extends TreeNodeBase {
 
 private Model modelNode;
 
 public GeDocTreeNode() {
  super();
 }
 
 public GeDocTreeNode(String type, String description, boolean leaf) {
  super(type, description, leaf);
 }
 
 public GeDocTreeNode(String type, String description, String
identifier, boolean leaf) {
  super(type, description, identifier, leaf);
 }
 
 public GeDocTreeNode(String type, String description, String
identifier, Model modelNode, boolean leaf) {
  super(type, description, identifier, leaf);
  this.modelNode = modelNode;
 }
 
 public Model getModelNode() {
  return modelNode;
 }
 
 public void setModelNode(Model modelNode) {
  this.modelNode = modelNode;
 }
}
------------------------------------------------------------------------
--------
 
package it.noema.faces.controller;
 
import it.noema.faces.util.NavigationUtil;
 
import javax.faces.context.FacesContext;
 
public class TreeController {
 
 public String selectNode() {
  FacesContext context = FacesContext.getCurrentInstance();
  StringBuffer url = new StringBuffer();
  url.append("/geDocSelectNode.do");
  NavigationUtil.forward(context, url.toString());
  return null;
 }
}
 
------------------------------------------------------------------------
--------
 
package it.noema.faces.util;
 
import java.io.IOException;
 
import javax.faces.FacesException;
import javax.faces.context.FacesContext;
 
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
 
public class NavigationUtil {
 private static final Log logger =
LogFactory.getLog(NavigationUtil.class);
 
 public static void forward(FacesContext context, String url) {
 
  if (logger.isInfoEnabled()) {
   logger.info("[forward] Forward to [" + url + "]");
  }
  try {
   context.getExternalContext().dispatch(url);
  } catch (IOException e) {
   throw new FacesException(e);
  } finally {
   context.responseComplete();
  }
 
 }
}
 
------------------------------------------------------------------------
--------

Re: Extending Tree2 - Problems with IExplore.

Posted by Sean Schofield <se...@gmail.com>.
I don't have any experience using tree2 with Struts.  I would suggest
simplifiying your code to try and determine the cause of the problem. 
Try using a managed bean instead of a Struts action to populate your
tree.  If that still doesn't work try using a regular page instead of
Tiles.

sean

On 7/15/05, Pier Paolo Bortone <pi...@noema.it> wrote:
>  
> Hi all, 
>   
> We have tried to extend x:tree2 to:
> - insert x:tree2 in a tiles layout of Struts (using struts-faces)
> - invoke Struts action
> - hold focus on the node selected
> - select a specified node on re-init (commented)
> - manage dynamic model (add/remove node) (commented) 
>   
> We don't understand why all runs very well with Mozilla Firefox and
> NOT with MS-IExplore. 
>   
> We obtain or a java.lang.IllegalArgumentException: Node
> with id 0:6. Failed to parse 0:6
> or a NullPointerException on UITreeData.setNodeId. 
>   
> Thanks in advance! 
>   
> Pier Paolo. 
>   
> Here is the code implemented: 
>   
>   <x:tree2 value="#{presentationData.treeData}" id="server-tree" var="node"
>            varNodeToggler="t" clientSideToggle="false" showRootNode="false">
>     <f:facet name="base">
>       <h:panelGroup>
>         <h:outputText value="#{node.description}"/>
>       </h:panelGroup>
>     </f:facet>
>     <f:facet name="root">
>       <h:panelGroup>
>         <h:commandLink action="#{treeController.selectNode}"
> immediate="true" actionListener="#{t.setNodeSelected}">
>           <h:graphicImage value="/images/root.gif" border="0"/>
>           <h:outputText value="#{node.description}"
> styleClass="#{t.nodeSelected ? 'nodeFolderSelected':''}"/>
>         </h:commandLink>
>       </h:panelGroup>
>     </f:facet>
>     <f:facet name="folder">
>       <h:panelGroup>
>         <h:commandLink action="#{treeController.selectNode}"
> immediate="true" actionListener="#{t.setNodeSelected}">
>           <h:graphicImage value="/images/folder-open.gif"
> rendered="#{t.nodeExpanded}" border="0"/>
>           <h:graphicImage value="/images/folder-closed.gif"
> rendered="#{!t.nodeExpanded}" border="0"/>
>           <h:outputText value="#{node.description}"
> styleClass="#{t.nodeSelected ? 'nodeFolderSelected':''}"/>
>         </h:commandLink>
>       </h:panelGroup>
>     </f:facet>
>   </x:tree2>
> --------------------------------------------------------------------------------
>   
> package it.noema.faces.custom.tree2; 
>   
> import it.noema.faces.bean.PresentationDTO;
> import it.noema.faces.controller.TreeController;
> import it.noema.faces.util.PresentationUtil;
> import it.noema.ged.model.Composite; 
>   
> import java.io.IOException;
> import java.util.Map; 
>   
> import javax.faces.context.ExternalContext;
> import javax.faces.context.FacesContext;
> import javax.faces.event.ActionEvent;
> import javax.servlet.http.HttpServletRequest; 
>   
> import org.apache.commons.logging.Log;
> import org.apache.commons.logging.LogFactory; 
>   
> public class HtmlTree extends
> org.apache.myfaces.custom.tree2.HtmlTree { 
>   
>  private static final Log logger = LogFactory.getLog(HtmlTree.class);
>  
>  private static final String NODE_SELECTED_KEY =
> "org.apache.myfaces.tree.NODE_SELECTED_KEY";
>  
>  //
>  // public static final String REINIT_KEY =
> "org.apache.myfaces.tree.REINIT_KEY";
>  // private static final String NODE_STATE_KEY =
> "org.apache.myfaces.tree.NODE_STATE_KEY";
>  //
>   
>   
>  private String _selectedNodeId;
>  private TreeController treeController = null; 
>   
>  public HtmlTree() {
>   super();
>   treeController = new TreeController();
>  } 
>   
>  public void restoreState(FacesContext context, Object state) { 
>   
>   Object[] values = (Object[]) state;
>   if (logger.isDebugEnabled()) {
>    logger.debug("[restoreState] Selected ID: " + values[3]);
>   }
>   super.restoreState(context, state);
>   _selectedNodeId = (String) values[3];
>  } 
>   
>  public Object saveState(FacesContext context) {
>   Object values[] = (Object[]) super.saveState(context);
>   values[3] = _selectedNodeId;
>   if (logger.isDebugEnabled()) {
>    logger.debug("[saveState] Selected ID: " + values[3]);
>   }
>   return values;
>  } 
>   
>  public void setNodeSelected(ActionEvent event) {
>   if (logger.isDebugEnabled()) {
>    logger.debug("[setNodeSelected] ID: " + getNodeId());
>   }
>   _selectedNodeId = getNodeId();
>   ExternalContext externalContext =
> getFacesContext().getExternalContext();
>   externalContext.getSessionMap().put(NODE_SELECTED_KEY + ":" + getId(),
> _selectedNodeId); 
>   
>   /* *********************************** */
>   /* TEMPORARY SOLUTION                  */
>   /* *********************************** */
>   // TODO: FIND BETTER SOLUTION TO ABSTRACTION
>   GeDocTreeNode node = (GeDocTreeNode) getNode();
>   if (logger.isDebugEnabled()) {
>    logger.debug("[setNodeSelected] Nodo selezionato: " +
> node.getDescription());
>   }
>   PresentationDTO presentationDTO =
> PresentationUtil.getPresentationData((HttpServletRequest)
> externalContext
>     .getRequest());
>   presentationDTO.setModelNodeSelected((Composite)
> node.getModelNode());
>   presentationDTO.setSelectedRow(null);
>  } 
>   
>  public boolean isNodeSelected() {
>   boolean b = getNodeId().equals(_selectedNodeId); 
>   
>   if (logger.isDebugEnabled()) {
>    logger.debug("[isNodeSelected] ID[" + getNodeId() + "] selected[" + b +
> "]");
>   }
>   return b;
>  } 
>   
>  public void encodeBegin(FacesContext context) throws IOException { 
>   
>   Map sessionMap = context.getExternalContext().getSessionMap();
>   
>   /* **************************** */
>   /* IS NOT BETTER SOLUTION       */
>   /* **************************** */
>   //ReinitTree reinitTree = (ReinitTree) sessionMap.get(REINIT_KEY); 
>   
> 
>   //
>   //if (reinitTree != null && reinitTree.isReinit()) {
>   // if (logger.isDebugEnabled()) {
>   //  logger.debug("[encodeBegin] Eseguo il reinit: " + reinitTree);
>   // }
>         //
>   // _selectedNodeId = reinitTree.getSelectedNodeId();
>   // sessionMap.put(NODE_SELECTED_KEY + ":" + getId(), _selectedNodeId);
>   // sessionMap.put(NODE_STATE_KEY + ":" + getId(),
> reinitTree.getOpenedNodeIds());
>   // sessionMap.remove(REINIT_KEY);
>   //} else {
>   //
>    String nodeSelected = (String) sessionMap.get(NODE_SELECTED_KEY + ":" +
> getId()); 
>   
>    if (nodeSelected != null && _selectedNodeId == null) {
>     _selectedNodeId = nodeSelected;
>     if (logger.isDebugEnabled()) {
>      logger.debug("[encodeBegin] ID: " + _selectedNodeId);
>     }
>    }
>   //
>   //}
>   // 
>   
>   super.encodeBegin(context);
>  } 
>   
>  public String toggleExpanded() {
>   super.toggleExpanded();
>   treeController.selectNode();
>   return null;
>  }
> } 
>   
> 
> --------------------------------------------------------------------------------
> package it.noema.faces.custom.tree2; 
>   
> import it.noema.ged.model.Model; 
>   
> import org.apache.myfaces.custom.tree2.TreeNodeBase; 
>   
> public class GeDocTreeNode extends TreeNodeBase { 
>   
>  private Model modelNode; 
>   
>  public GeDocTreeNode() {
>   super();
>  } 
>   
>  public GeDocTreeNode(String type, String description, boolean leaf) {
>   super(type, description, leaf);
>  } 
>   
>  public GeDocTreeNode(String type, String description, String identifier,
> boolean leaf) {
>   super(type, description, identifier, leaf);
>  } 
>   
>  public GeDocTreeNode(String type, String description, String identifier,
> Model modelNode, boolean leaf) {
>   super(type, description, identifier, leaf);
>   this.modelNode = modelNode;
>  } 
>   
>  public Model getModelNode() {
>   return modelNode;
>  } 
>   
>  public void setModelNode(Model modelNode) {
>   this.modelNode = modelNode;
>  }
> }
> --------------------------------------------------------------------------------
>   
> package it.noema.faces.controller; 
>   
> import it.noema.faces.util.NavigationUtil; 
>   
> import javax.faces.context.FacesContext; 
>   
> public class TreeController { 
>   
>  public String selectNode() {
>   FacesContext context = FacesContext.getCurrentInstance();
>   StringBuffer url = new StringBuffer();
>   url.append("/geDocSelectNode.do");
>   NavigationUtil.forward(context, url.toString());
>   return null;
>  }
> } 
>   
> --------------------------------------------------------------------------------
>   
> package it.noema.faces.util; 
>   
> import java.io.IOException; 
>   
> import javax.faces.FacesException;
> import javax.faces.context.FacesContext; 
>   
> import org.apache.commons.logging.Log;
> import org.apache.commons.logging.LogFactory; 
>   
> public class NavigationUtil {
>  private static final Log logger = LogFactory.getLog(NavigationUtil.class); 
>   
>  public static void forward(FacesContext context, String url) { 
>   
>   if (logger.isInfoEnabled()) {
>    logger.info("[forward] Forward to [" + url + "]");
>   }
>   try {
>    context.getExternalContext().dispatch(url);
>   } catch (IOException e) {
>    throw new FacesException(e);
>   } finally {
>    context.responseComplete();
>   } 
>   
>  }
> } 
>   
> --------------------------------------------------------------------------------