Skip to content

Commit

Permalink
ZK-5535: TrackerImplEx#removeAllReference accesses map value by itera…
Browse files Browse the repository at this point in the history
…tion instead of key, lowers performance
  • Loading branch information
jumperchen committed Dec 4, 2023
1 parent 56f1b15 commit 8bab816
Show file tree
Hide file tree
Showing 13 changed files with 658 additions and 1 deletion.
1 change: 1 addition & 0 deletions zkdoc/release-note
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ ZK 10.0.0
ZK-5579: Listbox always renders the same set of items under ROD enabled
ZK-5582: Listbox only renders 50 items with client mvvm
ZK-5476: client mvvm failed for a tree
ZK-5535: TrackerImplEx#removeAllReference accesses map value by iteration instead of key, lowers performance

* Upgrade Notes

Expand Down
3 changes: 3 additions & 0 deletions zktest/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,9 @@ test {
testLogging {
events("standardOut", "started", "passed", "skipped", "failed")
}

maxHeapSize = "1024m"
jvmArgs '-XX:MaxPermSize=1024m'
}

task clearNoA11Y(type: Delete) {
Expand Down
112 changes: 112 additions & 0 deletions zktest/src/main/java/org/zkoss/zktest/test2/B100_ZK_5535/Bug.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
package org.zkoss.zktest.test2.B100_ZK_5535;

import org.zkoss.bind.BindUtils;
import org.zkoss.bind.annotation.Command;
public class Bug {
private BugOasiListBoxLayoutModel gridTree=new BugOasiListBoxLayoutModel();
public BugOasiListBoxLayoutModel getGridTree() {
return gridTree;
}
public void setGridTree(BugOasiListBoxLayoutModel gridTree) {
this.gridTree = gridTree;
}
public Bug()
{
}
public void loadDati()
{
BugOasiTreeNode<BugFormModel> nodeParent=this.loadDati(null);
for (int i=0;i<2000;i++)
nodeParent=this.loadDati(nodeParent);
this.gridTree.setLeafNodes();
}
public BugOasiTreeNode<BugFormModel> loadDati(
BugOasiTreeNode<BugFormModel> parent)
{
BugFormModel row=null;
/* --------------------------------------- */
/* Popolo grid tree */
/* --------------------------------------- */
BugOasiTreeNode<BugFormModel> nodeParent;
BugOasiTreeNode<BugFormModel> node;
/* ------------------------- */
/* Creo nodo di root */
/* ------------------------- */
nodeParent=gridTree.addTreeNode(parent,true);
row=nodeParent.getData();
row.get("coarfo").setStringVal("1");
row.get("descri").setStringVal("Nodo root");
nodeParent=gridTree.addTreeNode(true);
row=nodeParent.getData();
row.get("coarfo").setStringVal("1");
row.get("descri").setStringVal("Nodo root2");
nodeParent=gridTree.addTreeNode(true);
row=nodeParent.getData();
row.get("coarfo").setStringVal("1");
row.get("descri").setStringVal("Nodo root3");
nodeParent=gridTree.addTreeNode(true);
row=nodeParent.getData();
row.get("coarfo").setStringVal("1");
row.get("descri").setStringVal("Nodo root4");
nodeParent=gridTree.addTreeNode(true);
row=nodeParent.getData();
row.get("coarfo").setStringVal("1");
row.get("descri").setStringVal("Nodo root5");
nodeParent=gridTree.addTreeNode(true);
row=nodeParent.getData();
row.get("coarfo").setStringVal("1");
row.get("descri").setStringVal("Nodo root6");
/* ---------------------------------- */
/* Creo primo nodo figlio senza figli */
/* ---------------------------------- */
node=gridTree.addTreeNode(nodeParent);
node.setLeaf(true);
row=node.getData();
row.get("coarfo").setStringVal("2");
row.get("descri").setStringVal("nodo figlio 1");
/* ---------------------------------- */
/* Creo secondo nodo figlio con figli */
/* ---------------------------------- */
node=gridTree.addTreeNode(nodeParent,false);
row=node.getData();
row.get("coarfo").setStringVal("3");
row.get("descri").setStringVal("nodo figlio 2");
/* ---------------------------------- */
/* Creo figli secondo nodo figlio */
/* ---------------------------------- */
nodeParent=node;
node=gridTree.addTreeNode(nodeParent,true);
row=node.getData();
row.get("coarfo").setStringVal("4");
row.get("descri").setStringVal("primo figlio del cocondo figlio");
/* ---------------------------------- */
/* Creo secondo nodo figlio con figli */
/* ---------------------------------- */
node=gridTree.addTreeNode(nodeParent,true);
row=node.getData();
row.get("coarfo").setStringVal("6");
row.get("descri").setStringVal("secondo figlio del cocondo figlio");
/* ---------------------------------- */
/* Creo figlio in mezzo */
/* ---------------------------------- */
node=gridTree.addTreeNode(nodeParent,true,1);
row=node.getData();
row.get("coarfo").setStringVal("5");
row.get("descri").setStringVal("creato figlio in mezzo");

return nodeParent;
}
@Command
public void showData()
{
this.loadDati();
BindUtils.postNotifyChange(null, null, this, "gridTree");
}
@Command
public void clearTree()
{
this.gridTree.clearTree();
BindUtils.postNotifyChange(null, null, this, "gridTree");
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.zkoss.zktest.test2.B100_ZK_5535;

public class BugFieldLayout {
private String stringVal;

public String getStringVal() {
return stringVal;
}

public void setStringVal(String stringVal) {
this.stringVal = stringVal;
}
public void detach()
{
this.stringVal=null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package org.zkoss.zktest.test2.B100_ZK_5535;

import java.util.LinkedHashMap;
import java.util.Map.Entry;
public class BugFormModel {
public LinkedHashMap<String, BugFieldLayout> fields = new LinkedHashMap<String, BugFieldLayout>();
private BugOasiTreeNode<BugFormModel> node=null;

/**
* <LI>BugFormModel</LI>
* <PRE>
* Nel caso di un Tree restituisce il nodo associato
* </PRE>
*
* @author m.spuri
*/
public BugOasiTreeNode<BugFormModel> getNode() {
return node;
}
/**
* <LI>BugFormModel</LI>
* <PRE>
* Nel caso di un Tree restituisce il nodo associato
* </PRE>
*
* @author m.spuri
*/
public void setNode(BugOasiTreeNode<BugFormModel> node) {
this.node = node;
}
public LinkedHashMap<String, BugFieldLayout> getFields() {
return fields;
}
public void setFields(LinkedHashMap<String, BugFieldLayout> fields) {
this.fields = fields;
}
public BugFieldLayout get(String name)
{
return fields.get(name);
}
public BugFormModel()
{
fields.put("coarfo",new BugFieldLayout());
fields.put("descri",new BugFieldLayout());
}
public void detach()
{
if ( this.fields!=null )
{
for(Entry<String, BugFieldLayout> obj: this.fields.entrySet())
obj.getValue().detach();
this.fields.clear();
this.fields=null;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
package org.zkoss.zktest.test2.B100_ZK_5535;

import java.util.LinkedList;

import org.zkoss.zul.DefaultTreeModel;
import org.zkoss.zul.TreeModel;
import org.zkoss.zul.TreeNode;
public class BugOasiListBoxLayoutModel {
private BugOasiTreeNode<BugFormModel> treeRoot = null;
private TreeModel<TreeNode<BugFormModel>> treeNodes = null;
private boolean enableMultiSelection = false;
public boolean isEnableMultiSelection() {
return enableMultiSelection;
}

public void setEnableMultiSelection(boolean enableMultiSelection) {
this.enableMultiSelection = enableMultiSelection;
}

public BugOasiTreeNode<BugFormModel> getTreeRoot() {
return treeRoot;
}

public void setTreeRoot(BugOasiTreeNode<BugFormModel> treeRoot) {
this.treeRoot = treeRoot;
}
public TreeModel<TreeNode<BugFormModel>> getTreeNodes() {
return this.treeNodes;
}

public void setTreeNodes(TreeModel<TreeNode<BugFormModel>> treeNodes) {
this.treeNodes = treeNodes;
}
/**
* <LI>OasiListBoxLayoutModel</LI>
*
* <PRE>
* Aggiunge un nodo al tree
* </PRE>
*
* Aggiungo nodo di root
*
* @author m.spuri
*/
public BugOasiTreeNode<BugFormModel> addTreeNode(boolean open) {
return this.addTreeNode(null, open);
}/**
* <LI>OasiListBoxLayoutModel</LI>
*
* <PRE>
* Aggiunge un nodo al tree
* </PRE>
*
* @author m.spuri
*/
public BugOasiTreeNode<BugFormModel> addTreeNode(
BugOasiTreeNode<BugFormModel> parent,
boolean open) {
return this.addTreeNode(parent, open, null);
}
public BugOasiTreeNode<BugFormModel> addTreeNode(
BugOasiTreeNode<BugFormModel> parent,
boolean open, Integer pos) {
return this.addTreeNode(parent, null, null, open, pos);
}
private BugOasiTreeNode<BugFormModel> addTreeNode(
BugOasiTreeNode<BugFormModel> parent,
BugOasiTreeNode<BugFormModel> newnod, BugFormModel myrow, boolean open,
Integer pos) {
if (parent == null) {
if (this.treeRoot == null)
this.createTreeRoot();
parent = this.treeRoot;
}
BugFormModel row;
if (newnod == null) {
if (myrow == null)
row = new BugFormModel();
else
row = myrow;
} else
row = newnod.getData();


BugOasiTreeNode<BugFormModel> treeNode = null;
if (newnod == null)
treeNode = new BugOasiTreeNode<BugFormModel>(parent, row,
new LinkedList<BugOasiTreeNode<BugFormModel>>(), treeNodes, open,
pos);
else {
treeNode = newnod;
parent.setLeaf(false);
if (pos == null)
parent.add(treeNode);
else
parent.getChildren().add(pos, treeNode);
}
row.setNode(treeNode);
if (treeNode.isOpen())
((DefaultTreeModel<BugFormModel>) treeNodes).addOpenObject(treeNode);
return treeNode;
}
private void createTreeRoot() {
this.treeRoot = new BugOasiTreeNode<BugFormModel>(null,
new LinkedList<BugOasiTreeNode<BugFormModel>>(), treeNodes, true);

this.treeNodes = new DefaultTreeModel<BugFormModel>(this.treeRoot);
((DefaultTreeModel<BugFormModel>)this.treeNodes).setMultiple(this.isEnableMultiSelection());
}
/**
* <LI>OasiListBoxLayoutModel</LI>
*
* <PRE>
* Aggiunge un nodo al tree
* </PRE>
*
* Di default � chiuso
*
* @author m.spuri
*/
public BugOasiTreeNode<BugFormModel> addTreeNode(
BugOasiTreeNode<BugFormModel> parent) {
return this.addTreeNode(parent, false);
}

public void clearTree() {
int n;
if (this.treeRoot != null) {
n = this.treeRoot.getChildren().size();
for (int k = 0; k < n; k++)
this.clearTreeNode((BugOasiTreeNode<BugFormModel>) this.treeRoot.getChildren().get(k));
try {
this.treeRoot.getChildren().clear();
} catch (Exception e) {
// TODO: handle exception
}

this.treeRoot = null;
}
}
private void clearTreeNode(BugOasiTreeNode<BugFormModel> node) {
if (node == null)
return;
if (!node.isLeaf() && node.isOpen())
((DefaultTreeModel<BugFormModel>) treeNodes).removeOpenObject(node);

BugFormModel row = (BugFormModel) node.getData();
row.detach();
if (node.getChildren() != null) {
int n = node.getChildren().size();
for (int i = 0; i < n; i++) {
this.clearTreeNode((BugOasiTreeNode<BugFormModel>) node.getChildren().get(i));
}
node.getChildren().clear();
}
}
public void setLeafNodes() {
int n;
if (this.treeRoot != null) {
n = this.treeRoot.getChildren().size();
for (int k = 0; k < n; k++)
this.setLeaf((BugOasiTreeNode<BugFormModel>) this.treeRoot.getChildren().get(k));
}
}
private void setLeaf(BugOasiTreeNode<BugFormModel> node) {
if (node == null)
return;
if (node.getChildren() != null && node.getChildren().size()>0 ) {
int n = node.getChildren().size();
for (int i = 0; i < n; i++) {
this.setLeaf((BugOasiTreeNode<BugFormModel>) node.getChildren().get(i));
}
}
else
node.setLeaf(true);
}

}
Loading

0 comments on commit 8bab816

Please sign in to comment.