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