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();
> }
>
> }
> }
>
> --------------------------------------------------------------------------------