From 7ca0d43883d6ddc78f3346695867b2a94d5461d8 Mon Sep 17 00:00:00 2001 From: Manuel Rego Casasnovas Date: Fri, 7 Dec 2012 12:01:59 +0100 Subject: [PATCH] Bug #1590: Fix problem calling several times the same method in OrderModel The problem was that OrderModel.getOrders() was been called several times to show the list of projects. After reviewing the problem several issues were detected: * Util.createBindingsFor was always calling .loadAll() for each binder it creates, however this was not needed. Moreover a lot of times Util.reloadBindings is called just after Util.createBindings so the same thing is called twice. * If you go via the entry point or the icon to the project list, the binder for the page is properly initialized or not. If you come from the entry point, the binder is already working as expected, however if you come from the icon the binder has to be created manually. It has been added a method CreatedOnDemandTab.afterCreateAction() that is called or not depending if the user comes from the entry point or the icon. FEA: ItEr77S04BugFixing --- .../main/java/org/zkoss/ganttz/TabsRegistry.java | 15 ++++++++++++++- .../java/org/zkoss/ganttz/extensions/ITab.java | 2 ++ .../org/zkoss/ganttz/extensions/TabProxy.java | 5 +++++ .../main/java/org/libreplan/web/common/Util.java | 16 ++++++++++++---- .../web/planner/tabs/CreatedOnDemandTab.java | 15 +++++++++++++++ .../tabs/MultipleTabsPlannerController.java | 2 +- .../web/planner/tabs/OrdersTabCreator.java | 7 +++++-- .../web/planner/tabs/TabOnModeType.java | 9 +++++++++ 8 files changed, 63 insertions(+), 8 deletions(-) diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/TabsRegistry.java b/ganttzk/src/main/java/org/zkoss/ganttz/TabsRegistry.java index e9b98b2ef..23db9e97b 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/TabsRegistry.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/TabsRegistry.java @@ -65,10 +65,23 @@ public class TabsRegistry { show(tab, DO_NOTHING); } + public void showWithoutAfterCreate(ITab tab) { + show(tab, DO_NOTHING, false); + } + public void show(ITab tab, IBeforeShowAction beforeShowAction) { + show(tab, beforeShowAction, true); + } + + private void show(ITab tab, IBeforeShowAction beforeShowAction, + boolean afterCreate) { hideAllExcept(tab); beforeShowAction.doAction(); - tab.show(); + if (afterCreate) { + tab.show(); + } else { + tab.showWithoutAfterCreate(); + } parent.invalidate(); activateMenuIfRegistered(tab); } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/extensions/ITab.java b/ganttzk/src/main/java/org/zkoss/ganttz/extensions/ITab.java index 7645a8047..d822d2fa5 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/extensions/ITab.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/extensions/ITab.java @@ -37,6 +37,8 @@ public interface ITab { void show(); + void showWithoutAfterCreate(); + void hide(); } diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/extensions/TabProxy.java b/ganttzk/src/main/java/org/zkoss/ganttz/extensions/TabProxy.java index 2fbd04ce7..096d92fa5 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/extensions/TabProxy.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/extensions/TabProxy.java @@ -53,6 +53,11 @@ public class TabProxy implements ITab { proxiedTab.show(); } + @Override + public void showWithoutAfterCreate() { + proxiedTab.showWithoutAfterCreate(); + } + @Override public String getCssClass() { return proxiedTab.getCssClass(); diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/common/Util.java b/libreplan-webapp/src/main/java/org/libreplan/web/common/Util.java index 3e33a3591..8bfad383c 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/common/Util.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/common/Util.java @@ -111,20 +111,28 @@ public class Util { return (DataBinder) component.getVariable("binder", false); } - @SuppressWarnings("unchecked") public static void createBindingsFor(org.zkoss.zk.ui.Component result) { + createBindingsFor(result, true); + } + + @SuppressWarnings("unchecked") + public static void createBindingsFor(org.zkoss.zk.ui.Component result, + boolean loadBindings) { List children = new ArrayList( result.getChildren()); for (org.zkoss.zk.ui.Component child : children) { createBindingsFor(child); } - setBinderFor(result); + setBinderFor(result, loadBindings); } - private static void setBinderFor(org.zkoss.zk.ui.Component result) { + private static void setBinderFor(org.zkoss.zk.ui.Component result, + boolean loadBindings) { AnnotateDataBinder binder = new AnnotateDataBinder(result, true); result.setVariable("binder", binder, true); - binder.loadAll(); + if (loadBindings) { + binder.loadAll(); + } } /** diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/CreatedOnDemandTab.java b/libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/CreatedOnDemandTab.java index ebba95f83..b7ef835fd 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/CreatedOnDemandTab.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/CreatedOnDemandTab.java @@ -72,9 +72,21 @@ public class CreatedOnDemandTab implements ITab { @Override public void show() { + show(true); + } + + @Override + public void showWithoutAfterCreate() { + show(false); + } + + private void show(boolean afterCreate) { beforeShowAction(); if (component == null) { component = componentCreator.create(parent); + if (afterCreate) { + afterCreateAction(component); + } } component.setParent(parent); afterShowAction(); @@ -90,6 +102,9 @@ public class CreatedOnDemandTab implements ITab { protected void beforeShowAction() { } + protected void afterCreateAction(Component component) { + } + protected void afterShowAction() { } diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/MultipleTabsPlannerController.java b/libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/MultipleTabsPlannerController.java index 9cc20d977..824245410 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/MultipleTabsPlannerController.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/MultipleTabsPlannerController.java @@ -472,7 +472,7 @@ public class MultipleTabsPlannerController implements Composer, @Override public void goToOrdersList() { // ordersTab.show(); - getTabsRegistry().show(ordersTab); + getTabsRegistry().showWithoutAfterCreate(ordersTab); } public void goToCreateForm() { diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/OrdersTabCreator.java b/libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/OrdersTabCreator.java index 15ecc5a39..956e273e9 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/OrdersTabCreator.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/OrdersTabCreator.java @@ -68,8 +68,6 @@ public class OrdersTabCreator { args.put("orderController", setupOrderCrudController()); result = Executions.createComponents("/orders/_ordersTab.zul", parent, args); - Util.createBindingsFor(result); - Util.reloadBindings(result); return result; } @@ -110,6 +108,11 @@ public class OrdersTabCreator { } } + @Override + protected void afterCreateAction(org.zkoss.zk.ui.Component component) { + Util.createBindingsFor(component, false); + } + @Override protected void afterShowAction() { orderCRUDController.goToList(); diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/TabOnModeType.java b/libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/TabOnModeType.java index 6f92e1880..f56f08168 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/TabOnModeType.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/planner/tabs/TabOnModeType.java @@ -140,4 +140,13 @@ public class TabOnModeType implements ITab { } } + @Override + public void showWithoutAfterCreate() { + beingShown = true; + ITab currentTab = getCurrentTab(); + if (currentTab != null) { + currentTab.showWithoutAfterCreate(); + } + } + }