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 <[EMAIL PROTECTED]> 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();
>   } 
>   
>  }
> } 
>   
> --------------------------------------------------------------------------------

Reply via email to