Details
-
Type: Improvement
-
Status: Closed
-
Priority: Major
-
Resolution: Won't Fix
-
Affects Version/s: 4.1, EE-3.3.0.GA_P04
-
Fix Version/s: 4.3
-
Component/s: ACE-Components
-
Labels:None
-
Environment:ICEfaces4 trunk r46245/ EE-3.3.0-maintenance branch r46245
Browsers: all
Server: Tomcat7
-
Assignee Priority:P2
Description
Trying to re-order nodes on the test using the lazy data model (/ICE-10723-lazy.jsf) results in either an UnsupportedOperationException, or an IndexOutOfBoundException, depending on the node being dragged.
QA test app for ace:tree: http://dev.icesoft.com/svn/repo/qa/trunk/Regression-Icefaces4/Sparkle/Nightly/tree
Test page: /ICE-10723-lazy.jsf
Nov 19, 2015 2:35:05 PM com.sun.faces.context.AjaxExceptionHandlerImpl handlePartialResponseError
SEVERE: java.lang.UnsupportedOperationException
at org.icefaces.ace.model.tree.NodeDataModel.insert(NodeDataModel.java:77)
at org.icefaces.ace.component.tree.Tree.insertNode(Tree.java:98)
at org.icefaces.ace.component.tree.TreeDecoder.decodeReordering(TreeDecoder.java:86)
at org.icefaces.ace.component.tree.TreeDecoder.decode(TreeDecoder.java:66)
at org.icefaces.ace.component.tree.TreeRenderer$1.<init>(TreeRenderer.java:64)
at org.icefaces.ace.component.tree.TreeRenderer.decode(TreeRenderer.java:63)
at javax.faces.component.UIComponentBase.decode(UIComponentBase.java:832)
at org.icefaces.ace.component.tree.Tree.processDecodes(Tree.java:299)
at com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:573)
at com.sun.faces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:183)
at org.icefaces.ace.component.tree.Tree.visitTree(Tree.java:392)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
at javax.faces.component.UIForm.visitTree(UIForm.java:371)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
at com.sun.faces.context.PartialViewContextImpl.processComponents(PartialViewContextImpl.java:403)
at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:266)
at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:219)
at org.icefaces.impl.context.DOMPartialViewContext.processPartial(DOMPartialViewContext.java:322)
at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:219)
at javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:927)
at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:78)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
Nov 19, 2015 2:34:38 PM com.sun.faces.context.AjaxExceptionHandlerImpl handlePartialResponseError
SEVERE: java.lang.IndexOutOfBoundsException: Index: 0
at java.util.Collections$EmptyList.get(Collections.java:3212)
at org.icefaces.ace.model.tree.LazyNodeDataModel.navToChild(LazyNodeDataModel.java:100)
at org.icefaces.ace.model.tree.LazyNodeDataModel.navToKey(LazyNodeDataModel.java:72)
at org.icefaces.ace.component.tree.Tree.setNodeToKey(Tree.java:157)
at org.icefaces.ace.component.tree.Tree.setKey(Tree.java:125)
at org.icefaces.ace.component.tree.TreeDecoder.decodeReordering(TreeDecoder.java:84)
at org.icefaces.ace.component.tree.TreeDecoder.decode(TreeDecoder.java:66)
at org.icefaces.ace.component.tree.TreeRenderer$1.<init>(TreeRenderer.java:64)
at org.icefaces.ace.component.tree.TreeRenderer.decode(TreeRenderer.java:63)
at javax.faces.component.UIComponentBase.decode(UIComponentBase.java:832)
at org.icefaces.ace.component.tree.Tree.processDecodes(Tree.java:299)
at com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:573)
at com.sun.faces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:183)
at org.icefaces.ace.component.tree.Tree.visitTree(Tree.java:392)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
at javax.faces.component.UIForm.visitTree(UIForm.java:371)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
at com.sun.faces.context.PartialViewContextImpl.processComponents(PartialViewContextImpl.java:403)
at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:266)
at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:219)
at org.icefaces.impl.context.DOMPartialViewContext.processPartial(DOMPartialViewContext.java:322)
at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:219)
at javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:927)
QA test app for ace:tree: http://dev.icesoft.com/svn/repo/qa/trunk/Regression-Icefaces4/Sparkle/Nightly/tree
Test page: /
Nov 19, 2015 2:35:05 PM com.sun.faces.context.AjaxExceptionHandlerImpl handlePartialResponseError
SEVERE: java.lang.UnsupportedOperationException
at org.icefaces.ace.model.tree.NodeDataModel.insert(NodeDataModel.java:77)
at org.icefaces.ace.component.tree.Tree.insertNode(Tree.java:98)
at org.icefaces.ace.component.tree.TreeDecoder.decodeReordering(TreeDecoder.java:86)
at org.icefaces.ace.component.tree.TreeDecoder.decode(TreeDecoder.java:66)
at org.icefaces.ace.component.tree.TreeRenderer$1.<init>(TreeRenderer.java:64)
at org.icefaces.ace.component.tree.TreeRenderer.decode(TreeRenderer.java:63)
at javax.faces.component.UIComponentBase.decode(UIComponentBase.java:832)
at org.icefaces.ace.component.tree.Tree.processDecodes(Tree.java:299)
at com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:573)
at com.sun.faces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:183)
at org.icefaces.ace.component.tree.Tree.visitTree(Tree.java:392)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
at javax.faces.component.UIForm.visitTree(UIForm.java:371)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
at com.sun.faces.context.PartialViewContextImpl.processComponents(PartialViewContextImpl.java:403)
at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:266)
at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:219)
at org.icefaces.impl.context.DOMPartialViewContext.processPartial(DOMPartialViewContext.java:322)
at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:219)
at javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:927)
at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:78)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
Nov 19, 2015 2:34:38 PM com.sun.faces.context.AjaxExceptionHandlerImpl handlePartialResponseError
SEVERE: java.lang.IndexOutOfBoundsException: Index: 0
at java.util.Collections$EmptyList.get(Collections.java:3212)
at org.icefaces.ace.model.tree.LazyNodeDataModel.navToChild(LazyNodeDataModel.java:100)
at org.icefaces.ace.model.tree.LazyNodeDataModel.navToKey(LazyNodeDataModel.java:72)
at org.icefaces.ace.component.tree.Tree.setNodeToKey(Tree.java:157)
at org.icefaces.ace.component.tree.Tree.setKey(Tree.java:125)
at org.icefaces.ace.component.tree.TreeDecoder.decodeReordering(TreeDecoder.java:84)
at org.icefaces.ace.component.tree.TreeDecoder.decode(TreeDecoder.java:66)
at org.icefaces.ace.component.tree.TreeRenderer$1.<init>(TreeRenderer.java:64)
at org.icefaces.ace.component.tree.TreeRenderer.decode(TreeRenderer.java:63)
at javax.faces.component.UIComponentBase.decode(UIComponentBase.java:832)
at org.icefaces.ace.component.tree.Tree.processDecodes(Tree.java:299)
at com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:573)
at com.sun.faces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:183)
at org.icefaces.ace.component.tree.Tree.visitTree(Tree.java:392)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
at javax.faces.component.UIForm.visitTree(UIForm.java:371)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700)
at com.sun.faces.context.PartialViewContextImpl.processComponents(PartialViewContextImpl.java:403)
at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:266)
at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:219)
at org.icefaces.impl.context.DOMPartialViewContext.processPartial(DOMPartialViewContext.java:322)
at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:219)
at javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:927)
After trying several approaches, it was impossible to support reordering on a lazy tree. The problem lies mainly in the navToKey() and navToChild() methods, which usually produce an IndexOutOfBoundsException when trying to reorder nodes. Like ListNodeDataModel, LazyNodeDataModel would need to have access to the tree roots within the same class in order to perform this and other operations, because of the inherent predictability required for an operation of this nature. Since, the tree roots are in an external source on a lazy tree, it's impossible to support these operations.