com.evolveum.midpoint.web.component.prism.ContainerValuePanel.java Source code

Java tutorial

Introduction

Here is the source code for com.evolveum.midpoint.web.component.prism.ContainerValuePanel.java

Source

/*
 * Copyright (c) 2010-2017 Evolveum
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.evolveum.midpoint.web.component.prism;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.validator.routines.EmailValidator;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.StringResourceModel;
import org.apache.wicket.validation.validator.EmailAddressValidator;
import org.apache.wicket.validation.validator.RangeValidator;

import com.evolveum.midpoint.gui.api.component.BasePanel;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.impl.util.GuiImplUtil;
import com.evolveum.midpoint.prism.Containerable;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.component.AjaxButton;
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
import com.evolveum.midpoint.xml.ns._public.common.common_3.MetadataType;

/**
 * @author lazyman
 * @author semancik
 */
public class ContainerValuePanel<C extends Containerable> extends BasePanel<ContainerValueWrapper<C>> {
    private static final long serialVersionUID = 1L;

    private static final Trace LOGGER = TraceManager.getTrace(ContainerValuePanel.class);
    private static final String ID_HEADER = "header";
    private static final String ID_PROPERTIES_LABEL = "propertiesLabel";
    private static final String STRIPED_CLASS = "striped";
    private static final String ID_SHOW_EMPTY_BUTTON = "showEmptyButton";

    private PageBase pageBase;
    boolean isVisibleShowMoreButton;

    public ContainerValuePanel(String id, final IModel<ContainerValueWrapper<C>> model, boolean showHeader,
            Form form, ItemVisibilityHandler isPanelVisible, PageBase pageBase) {
        super(id, model);
        setOutputMarkupId(true);
        this.pageBase = pageBase;

        add(new VisibleEnableBehaviour() {

            private static final long serialVersionUID = 1L;

            @Override
            public boolean isVisible() {
                return model.getObject().isVisible();
            }
        });

        LOGGER.trace("Creating container panel for {}", model.getObject());

        initLayout(model, form, isPanelVisible, showHeader);
    }

    private void initLayout(final IModel<ContainerValueWrapper<C>> model, final Form form,
            ItemVisibilityHandler isPanelVisible, boolean showHeader) {
        addOrReplacePropertiesAndContainers(model, form, isPanelVisible, false);

        AjaxButton labelShowEmpty = new AjaxButton(ID_SHOW_EMPTY_BUTTON, getNameOfShowEmptyButton(model)) {
            private static final long serialVersionUID = 1L;

            @Override
            public void onClick(AjaxRequestTarget target) {
                onShowEmptyClick(target, model, form, isPanelVisible);
                isVisibleShowMoreButton = true;
                setModel(getNameOfShowEmptyButton(model));
                target.add(this);
            }
        };
        labelShowEmpty.setOutputMarkupId(true);
        labelShowEmpty.add(AttributeAppender.append("style", "cursor: pointer;"));
        labelShowEmpty.add(new VisibleEnableBehaviour() {
            @Override
            public boolean isVisible() {
                return model.getObject().isExpanded() && isVisibleShowMoreButton;
            }
        });
        add(labelShowEmpty);

        PrismContainerValueHeaderPanel<C> header = new PrismContainerValueHeaderPanel<C>(ID_HEADER, model,
                isPanelVisible) {
            private static final long serialVersionUID = 1L;

            @Override
            protected void onButtonClick(AjaxRequestTarget target) {
                if (model.getObject().getContainer().isShowOnTopLevel()) {
                    addOrReplaceProperties(model, form, isPanelVisible, true);
                } else {
                    addOrReplacePropertiesAndContainers(model, form, isPanelVisible, true);
                }
                target.add(ContainerValuePanel.this);
                target.add(getPageBase().getFeedbackPanel());
            }

        };

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

            @Override
            public boolean isVisible() {
                return showHeader && (hasAnyProperty() || !getModelObject().getContainer().isShowOnTopLevel());// && !model.getObject().isMain();
            }
        });
        add(header);
        header.setOutputMarkupId(true);

    }

    public boolean hasAnyProperty() {
        for (ItemWrapper item : getModelObject().getItems()) {
            if (item instanceof PropertyOrReferenceWrapper) {
                return true;
            }
        }
        return false;
    }

    private StringResourceModel getNameOfShowEmptyButton(IModel<ContainerValueWrapper<C>> model) {
        if (!model.getObject().isShowEmpty()) {
            return pageBase.createStringResource("ShowEmptyButton.showMore");
        }
        return pageBase.createStringResource("ShowEmptyButton.showLess");
    }

    private void onShowEmptyClick(AjaxRequestTarget target, IModel<ContainerValueWrapper<C>> model, Form form,
            ItemVisibilityHandler isPanelVisible) {

        ContainerValueWrapper<C> wrapper = model.getObject();
        wrapper.setShowEmpty(!wrapper.isShowEmpty(), false);

        wrapper.computeStripes();
        //      addOrReplaceProperties(model, form, isPanelVisible, true);
        target.add(addOrReplaceProperties(model, form, isPanelVisible, true));
        target.add(getPageBase().getFeedbackPanel());
    }

    public PageBase getPageBase() {
        return pageBase;
    }

    private IModel<String> createStyleClassModel(final IModel<ItemWrapper> wrapper) {
        return new IModel<String>() {
            private static final long serialVersionUID = 1L;

            @Override
            public String getObject() {
                ItemWrapper property = wrapper.getObject();
                return property.isStripe() ? "stripe" : null;
            }
        };
    }

    private <IW extends ItemWrapper> void addOrReplacePropertiesAndContainers(
            IModel<ContainerValueWrapper<C>> model, final Form form, ItemVisibilityHandler isPanaleVisible,
            boolean isToBeReplaced) {
        addOrReplaceProperties(model, form, isPanaleVisible, isToBeReplaced);
        addOrReplaceContainers(model, form, isPanaleVisible, isToBeReplaced);
    }

    private <IW extends ItemWrapper> WebMarkupContainer addOrReplaceProperties(
            IModel<ContainerValueWrapper<C>> model, final Form form, ItemVisibilityHandler isPanalVisible,
            boolean isToBeReplaced) {
        isVisibleShowMoreButton = false;

        WebMarkupContainer propertiesLabel = new WebMarkupContainer(ID_PROPERTIES_LABEL);
        propertiesLabel.setOutputMarkupId(true);

        ListView<IW> properties = new ListView<IW>("properties", new PropertyModel<>(model, "properties")) {
            private static final long serialVersionUID = 1L;

            @Override
            protected void populateItem(final ListItem<IW> item) {
                item.setOutputMarkupId(true);
                if (item.getModelObject() instanceof PropertyOrReferenceWrapper) {
                    PrismPropertyPanel propertyPanel = new PrismPropertyPanel("property", item.getModel(), form,
                            isPanalVisible, pageBase);
                    propertyPanel.setOutputMarkupId(true);
                    propertyPanel.add(new VisibleEnableBehaviour() {

                        private static final long serialVersionUID = 1L;

                        @Override
                        public boolean isVisible() {
                            if (!model.getObject().isExpanded()) {
                                return false;
                            }
                            return propertyPanel.isVisible();
                        }
                    });
                    item.add(propertyPanel);
                    item.add(AttributeModifier.append("class",
                            createStyleClassModel((IModel<ItemWrapper>) item.getModel())));
                    if (propertyPanel.isVisible(isPanalVisible)
                            || ((PropertyOrReferenceWrapper) item.getModel().getObject()).isOnlyHide()) {
                        isVisibleShowMoreButton = true;
                    }
                    return;
                }
                WebMarkupContainer property = new WebMarkupContainer("property");
                item.add(new VisibleEnableBehaviour() {
                    @Override
                    public boolean isVisible() {
                        return false;
                    }
                });
                item.add(property);
            }
        };
        properties.setReuseItems(true);
        properties.setOutputMarkupId(true);
        if (isToBeReplaced) {
            replace(propertiesLabel);
            propertiesLabel.add(properties);
        } else {
            add(propertiesLabel);
            propertiesLabel.add(properties);
        }
        return propertiesLabel;
    }

    private <IW extends ItemWrapper> void addOrReplaceContainers(IModel<ContainerValueWrapper<C>> model,
            final Form form, ItemVisibilityHandler isPanalVisible, boolean isToBeReplaced) {
        ListView<IW> containers = new ListView<IW>("containers", new PropertyModel<>(model, "properties")) {
            private static final long serialVersionUID = 1L;

            @Override
            protected void populateItem(final ListItem<IW> item) {
                item.setOutputMarkupId(true);
                if (item.getModel().getObject() instanceof ContainerWrapper) {
                    PrismContainerPanel<C> containerPanel = new PrismContainerPanel<C>("container",
                            (IModel<ContainerWrapper<C>>) item.getModel(), true, form, isPanalVisible, pageBase,
                            false);
                    containerPanel.setOutputMarkupId(true);
                    item.add(containerPanel);
                    item.add(new VisibleEnableBehaviour() {

                        private static final long serialVersionUID = 1L;

                        @Override
                        public boolean isVisible() {
                            if (!model.getObject().isExpanded()
                                    && !model.getObject().getContainer().isShowOnTopLevel()) {
                                return false;
                            }

                            if (((ContainerWrapper) item.getModelObject() != null
                                    && ((ContainerWrapper) item.getModelObject()).getItemDefinition() != null
                                    && ((ContainerWrapper) item.getModelObject()).getItemDefinition()
                                            .getTypeName() != null
                                    && ((ContainerWrapper) item.getModelObject()).getItemDefinition().getTypeName()
                                            .equals(MetadataType.COMPLEX_TYPE))
                                    && (((ContainerWrapper) item.getModelObject()).getValues() != null
                                            && ((ContainerWrapper) item.getModelObject()).getValues().get(0) != null
                                            && !((ContainerWrapper<MetadataType>) item.getModelObject()).getValues()
                                                    .get(0).isVisible())) {
                                return false;
                            }

                            if (model.getObject().containsMultipleMultivalueContainer(isPanalVisible)
                                    && item.getModelObject().getItemDefinition().isMultiValue()
                                    && CollectionUtils.isEmpty(item.getModelObject().getValues())) {
                                return false;
                            }

                            return containerPanel.isPanelVisible(isPanalVisible,
                                    (IModel<ContainerWrapper<C>>) item.getModel());

                        }
                    });
                    if (!((ContainerWrapper) item.getModelObject() != null
                            && ((ContainerWrapper) item.getModelObject()).getItemDefinition() != null
                            && ((ContainerWrapper) item.getModelObject()).getItemDefinition().getTypeName() != null
                            && ((ContainerWrapper) item.getModelObject()).getItemDefinition().getTypeName()
                                    .equals(MetadataType.COMPLEX_TYPE))) {
                        item.add(AttributeModifier.append("class", "container-wrapper"));
                    }
                    return;
                }
                WebMarkupContainer container = new WebMarkupContainer("container");
                item.add(new VisibleEnableBehaviour() {
                    @Override
                    public boolean isVisible() {
                        return false;
                    }
                });
                item.add(container);
            }
        };
        containers.setReuseItems(true);
        containers.setOutputMarkupId(true);
        if (isToBeReplaced) {
            replace(containers);
        } else {
            add(containers);
        }
    }
}