Skip to content

Commit

Permalink
Fixing page size growth issue (MID-3354)
Browse files Browse the repository at this point in the history
  • Loading branch information
semancik committed Aug 18, 2016
1 parent e80bb82 commit e84837d
Show file tree
Hide file tree
Showing 7 changed files with 135 additions and 58 deletions.
Expand Up @@ -17,6 +17,7 @@
package com.evolveum.midpoint.gui.api.page;

import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
Expand All @@ -31,6 +32,7 @@
import org.apache.commons.lang.Validate;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
import org.apache.wicket.MarkupContainer;
import org.apache.wicket.Page;
import org.apache.wicket.RestartResponseException;
import org.apache.wicket.RuntimeConfigurationType;
Expand Down Expand Up @@ -97,6 +99,7 @@
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.task.api.TaskCategory;
import com.evolveum.midpoint.task.api.TaskManager;
import com.evolveum.midpoint.util.DebugUtil;
import com.evolveum.midpoint.util.Holder;
import com.evolveum.midpoint.util.Producer;
import com.evolveum.midpoint.util.exception.SchemaException;
Expand Down Expand Up @@ -185,6 +188,7 @@
* @author semancik
*/
public abstract class PageBase extends WebPage implements ModelServiceLocator {
private static final long serialVersionUID = 1L;

private static final String DOT_CLASS = PageBase.class.getName() + ".";
private static final String OPERATION_LOAD_USER = DOT_CLASS + "loadUser";
Expand Down Expand Up @@ -218,49 +222,49 @@ public abstract class PageBase extends WebPage implements ModelServiceLocator {
private static final Trace LOGGER = TraceManager.getTrace(PageBase.class);

@SpringBean(name = "modelController")
private ScriptingService scriptingService;
private transient ScriptingService scriptingService;

@SpringBean(name = "modelController")
private ModelService modelService;
private transient ModelService modelService;

@SpringBean(name = "modelInteractionService")
private ModelInteractionService modelInteractionService;
private transient ModelInteractionService modelInteractionService;

@SpringBean(name = "modelController")
private TaskService taskService;
private transient TaskService taskService;

@SpringBean(name = "modelDiagController")
private ModelDiagnosticService modelDiagnosticService;
private transient ModelDiagnosticService modelDiagnosticService;

@SpringBean(name = "taskManager")
private TaskManager taskManager;
private transient TaskManager taskManager;

@SpringBean(name = "modelController")
private WorkflowService workflowService;
private transient WorkflowService workflowService;

@SpringBean(name = "workflowManager")
private WorkflowManager workflowManager;
private transient WorkflowManager workflowManager;

@SpringBean(name = "midpointConfiguration")
private MidpointConfiguration midpointConfiguration;
private transient MidpointConfiguration midpointConfiguration;

@SpringBean(name = "reportManager")
private ReportManager reportManager;
private transient ReportManager reportManager;

@SpringBean(name = "resourceValidator")
private ResourceValidator resourceValidator;
private transient ResourceValidator resourceValidator;

// @SpringBean(name = "certificationManager")
// private CertificationManager certificationManager;

@SpringBean(name = "modelController")
private AccessCertificationService certficationService;
private transient AccessCertificationService certficationService;

@SpringBean(name = "accessDecisionManager")
private SecurityEnforcer securityEnforcer;
private transient SecurityEnforcer securityEnforcer;

@SpringBean
private MidpointFormValidatorRegistry formValidatorRegistry;
private transient MidpointFormValidatorRegistry formValidatorRegistry;

private boolean initialized = false;

Expand All @@ -280,7 +284,7 @@ public PageBase(PageParameters parameters) {

initializeModel();

initLayout();
initLayout();
}

@Override
Expand All @@ -306,7 +310,7 @@ protected Integer load() {
ObjectQuery query = QueryBuilder.queryFor(WorkItemType.class, getPrismContext())
.item(WorkItemType.F_ASSIGNEE_REF).ref(getPrincipal().getOid())
.build();
return modelService.countContainers(WorkItemType.class, query, null, task, task.getResult());
return getModelService().countContainers(WorkItemType.class, query, null, task, task.getResult());
} catch (SchemaException|SecurityViolationException e) {
LoggingUtils.logExceptionAsWarning(LOGGER, "Couldn't load work item count", e);
return null;
Expand Down Expand Up @@ -1360,8 +1364,9 @@ private MainMenuItem createUsersItems() {
}

private void createFocusPageNewEditMenu(List<MenuItem> submenu, String newKey, String editKey,
final Class<? extends PageAdmin> newPageType) {
MenuItem edit = new MenuItem(createStringResource(editKey), newPageType, null, new VisibleEnableBehaviour() {
final Class<? extends PageAdmin> newPageClass) {
MenuItem edit = new MenuItem(createStringResource(editKey), newPageClass, null, new VisibleEnableBehaviour() {
private static final long serialVersionUID = 1L;

@Override
public boolean isEnabled() {
Expand All @@ -1370,7 +1375,7 @@ public boolean isEnabled() {

@Override
public boolean isVisible() {
if (!getPage().getClass().equals(newPageType)) {
if (!getPage().getClass().equals(newPageClass)) {
return false;
}

Expand All @@ -1386,11 +1391,12 @@ public boolean isVisible() {
}
});
submenu.add(edit);
MenuItem newMenu = new MenuItem(createStringResource(newKey), newPageType) {
MenuItem newMenu = new MenuItem(createStringResource(newKey), newPageClass) {
private static final long serialVersionUID = 1L;

@Override
protected boolean isMenuActive() {
if (!PageBase.this.getPage().getClass().equals(newPageType)) {
if (!PageBase.this.getPage().getClass().equals(newPageClass)) {
return false;
}

Expand All @@ -1411,6 +1417,7 @@ protected boolean isMenuActive() {
private void createFocusPageViewMenu(List<MenuItem> submenu, String viewKey,
final Class<? extends PageBase> newPageType) {
MenuItem view = new MenuItem(createStringResource(viewKey), newPageType, null, new VisibleEnableBehaviour() {
private static final long serialVersionUID = 1L;

@Override
public boolean isEnabled() {
Expand Down
Expand Up @@ -56,12 +56,12 @@ public class Breadcrumb implements Serializable, DebugDumpable {
public Breadcrumb() {
}

public Breadcrumb(IModel<String> label) {
this(label, null);
public Breadcrumb(IModel<String> labelModel) {
this(labelModel, null);
}

public Breadcrumb(IModel<String> label, IModel<String> icon) {
setLabel(label);
public Breadcrumb(IModel<String> labelModel, IModel<String> icon) {
setLabel(labelModel);
setIcon(icon);
}

Expand Down
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2010-2015 Evolveum
* Copyright (c) 2010-2016 Evolveum
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand All @@ -22,14 +22,16 @@
import org.apache.wicket.request.mapper.parameter.PageParameters;

import java.io.Serializable;
import java.util.Arrays;

/**
* @author Viliam Repan (lazyman)
*/
public class BaseMenuItem implements Serializable {
private static final long serialVersionUID = 1L;

private IModel<String> name;
private Class<? extends WebPage> page;
private IModel<String> nameModel;
private Class<? extends WebPage> pageClass;
private PageParameters params;
private VisibleEnableBehaviour visibleEnable;
private Class<? extends WebPage>[] aliases;
Expand All @@ -38,12 +40,12 @@ public BaseMenuItem(IModel<String> name, Class<? extends WebPage> page) {
this(name, page, null, null);
}

public BaseMenuItem(IModel<String> name, Class<? extends WebPage> page,
public BaseMenuItem(IModel<String> nameModel, Class<? extends WebPage> pageClass,
PageParameters params, VisibleEnableBehaviour visibleEnable,
Class<? extends WebPage>... aliases) {
this.aliases = aliases;
this.name = name;
this.page = page;
this.nameModel = nameModel;
this.pageClass = pageClass;
this.params = params;
this.visibleEnable = visibleEnable;
}
Expand All @@ -55,12 +57,12 @@ public Class<? extends WebPage>[] getAliases() {
return aliases;
}

public IModel<String> getName() {
return name;
public IModel<String> getNameModel() {
return nameModel;
}

public Class<? extends WebPage> getPage() {
return page;
public Class<? extends WebPage> getPageClass() {
return pageClass;
}

public PageParameters getParams() {
Expand All @@ -78,13 +80,13 @@ public boolean isMenuActive(WebPage page) {

Class pageClass = page.getClass();

if (this.page == null) {
if (this.pageClass == null) {
return false;
}

boolean isMenuActive = isMenuActive();

if (pageClass.equals(this.page)) {
if (pageClass.equals(this.pageClass)) {
return isMenuActive;
}

Expand All @@ -104,4 +106,12 @@ public boolean isMenuActive(WebPage page) {
protected boolean isMenuActive() {
return true;
}

@Override
public String toString() {
return "BaseMenuItem(nameModel=" + nameModel + ", pageClass=" + pageClass + ", params=" + params
+ ", visibleEnable=" + visibleEnable + ", aliases=" + Arrays.toString(aliases) + ")";
}


}
Expand Up @@ -17,6 +17,8 @@

import com.evolveum.midpoint.gui.api.component.BasePanel;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.component.breadcrumbs.Breadcrumb;
import com.evolveum.midpoint.web.component.breadcrumbs.BreadcrumbPageClass;
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
Expand Down Expand Up @@ -57,6 +59,8 @@ public class MainMenuPanel extends BasePanel<MainMenuItem> {
private static final String ID_SUB_ITEM = "subItem";
private static final String ID_SUB_LINK = "subLink";
private static final String ID_SUB_LABEL = "subLabel";

private static final Trace LOGGER = TraceManager.getTrace(MainMenuPanel.class);

public MainMenuPanel(String id, IModel<MainMenuItem> model) {
super(id, model);
Expand Down Expand Up @@ -88,8 +92,9 @@ public String getObject() {
add(item);

WebMarkupContainer link;
if (menu.getPage() != null) {
if (menu.getPageClass() != null) {
link = new AjaxLink(ID_LINK) {
private static final long serialVersionUID = 1L;

@Override
public void onClick(AjaxRequestTarget target) {
Expand All @@ -105,7 +110,7 @@ public void onClick(AjaxRequestTarget target) {
icon.add(AttributeModifier.replace("class", new PropertyModel<>(menu, MainMenuItem.F_ICON_CLASS)));
link.add(icon);

Label label = new Label(ID_LABEL, menu.getName());
Label label = new Label(ID_LABEL, menu.getNameModel());
link.add(label);

final PropertyModel<String> bubbleModel = new PropertyModel<>(menu, MainMenuItem.F_BUBBLE_LABEL);
Expand Down Expand Up @@ -154,30 +159,32 @@ protected void populateItem(ListItem<MenuItem> listItem) {
}

private void createSubmenu(final ListItem<MenuItem> listItem) {
final MenuItem menu = listItem.getModelObject();
final MenuItem menuItem = listItem.getModelObject();

listItem.add(AttributeModifier.replace("class", new AbstractReadOnlyModel<String>() {
private static final long serialVersionUID = 1L;

@Override
public String getObject() {
return menu.isMenuActive((WebPage) getPage()) ? "active" : null;
return menuItem.isMenuActive((WebPage) getPage()) ? "active" : null;
}
}));

Link subLink = new Link(ID_SUB_LINK) {

Link<String> subLink = new Link<String>(ID_SUB_LINK) {
private static final long serialVersionUID = 1L;

@Override
public void onClick() {
menuItemPerformed(menu);
menuItemPerformed(menuItem);
}
};
listItem.add(subLink);

Label subLabel = new Label(ID_SUB_LABEL, menu.getName());
Label subLabel = new Label(ID_SUB_LABEL, menuItem.getNameModel());
subLink.add(subLabel);

listItem.add(new VisibleEnableBehaviour() {
private static final long serialVersionUID = 1L;

@Override
public boolean isVisible() {
Expand Down Expand Up @@ -205,35 +212,46 @@ public boolean isEnabled() {
}

private void menuItemPerformed(MenuItem menu) {
LOGGER.trace("menuItemPerformed: {}", menu);
SessionStorage storage = getPageBase().getSessionStorage();
storage.clearBreadcrumbs();


// IMPORTANT: we need to re-bundle the name to a new models
// that will not be connected to the old page reference
// otherwise the old page will somehow remain in the memory
// I have no idea how it could do that and especially how
// several old pages can remain in memory. But if the model
// is not re-bundled here then the page size grows and never
// falls.
MainMenuItem mainMenuItem = getModelObject();
Breadcrumb bc = new Breadcrumb(mainMenuItem.getName());
String name = mainMenuItem.getNameModel().getObject();
Breadcrumb bc = new Breadcrumb(new Model<>(name));
bc.setIcon(new Model<>(mainMenuItem.getIconClass()));
storage.pushBreadcrumb(bc);

List<MenuItem> items = mainMenuItem.getItems();
if (!items.isEmpty()) {
MenuItem first = items.get(0);

BreadcrumbPageClass invisibleBc = new BreadcrumbPageClass(first.getName(), first.getPage(),
IModel<String> nameModel = first.getNameModel();
BreadcrumbPageClass invisibleBc = new BreadcrumbPageClass(new Model<>(nameModel.getObject()), first.getPageClass(),
first.getParams());
invisibleBc.setVisible(false);
storage.pushBreadcrumb(invisibleBc);
}

setResponsePage(menu.getPage(), menu.getParams());
setResponsePage(menu.getPageClass(), menu.getParams());
}

private void mainMenuPerformed(MainMenuItem menu) {
LOGGER.trace("mainMenuPerformed: {}", menu);
SessionStorage storage = getPageBase().getSessionStorage();
storage.clearBreadcrumbs();

if (menu.getParams() == null) {
setResponsePage(menu.getPage());
setResponsePage(menu.getPageClass());
} else {
setResponsePage(menu.getPage(), menu.getParams());
setResponsePage(menu.getPageClass(), menu.getParams());
}
}
}

0 comments on commit e84837d

Please sign in to comment.