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

Java tutorial

Introduction

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

Source

/*
 * Copyright (c) 2010-2013 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 com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem;
import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItemAction;
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
import com.evolveum.midpoint.web.resource.img.ImgResources;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationStatusType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType;

import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxEventBehavior;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.markup.head.CssHeaderItem;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.image.Image;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.EmptyPanel;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.StringResourceModel;
import org.apache.wicket.request.resource.PackageResourceReference;
import org.apache.wicket.request.resource.ResourceReference;

import java.util.ArrayList;
import java.util.List;

/**
 * @author lazyman
 */
public class PrismObjectPanel extends Panel {

    private static final String STRIPED_CLASS = "striped";
    private static final String ID_HEADER = "header";

    private boolean showHeader = true;

    public PrismObjectPanel(String id, IModel<ObjectWrapper> model, ResourceReference image, Form form) {
        super(id);
        setOutputMarkupId(true);

        initLayout(model, image, form);
    }

    @Override
    public void renderHead(IHeaderResponse response) {
        super.renderHead(response);

        response.render(CssHeaderItem
                .forReference(new PackageResourceReference(PrismObjectPanel.class, "PrismObjectPanel.css")));

        StringBuilder sb = new StringBuilder();
        sb.append("fixStripingOnPrismForm('").append(getMarkupId()).append("', '").append(STRIPED_CLASS)
                .append("');");
        response.render(OnDomReadyHeaderItem.forScript(sb.toString()));
    }

    private AjaxEventBehavior createHeaderOnClickBehaviour(final IModel<ObjectWrapper> model) {
        return new AjaxEventBehavior("onClick") {

            @Override
            protected void onEvent(AjaxRequestTarget target) {
                headerOnClickPerformed(target, model);
            }
        };
    }

    private IModel<String> createHeaderClassModel(final IModel<ObjectWrapper> model) {
        return new AbstractReadOnlyModel<String>() {
            @Override
            public String getObject() {
                ObjectWrapper wrapper = model.getObject();
                if (wrapper.isProtectedAccount()) {
                    return "protected";
                }

                return wrapper.getHeaderStatus().name().toLowerCase();
            }
        };
    }

    private IModel<String> createHeaderNameClassModel(final IModel<ObjectWrapper> model) {
        return new AbstractReadOnlyModel<String>() {
            @Override
            public String getObject() {
                ObjectWrapper wrapper = model.getObject();
                if (isDisabled(wrapper)) {
                    return "disable";
                }
                return "";
            }
        };
    }

    /**
     * Method uses value from administrativeStatus property for
     * {@link com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType}
     * and effectiveStatus property for {@link com.evolveum.midpoint.xml.ns._public.common.common_3.UserType}.
     *
     * @return true if panel should look like its' object is disabled (strike through font).
     */
    public boolean isDisabled(ObjectWrapper wrapper) {
        //        PrismObject object = wrapper.getObject();
        //
        //        if (UserType.class.isAssignableFrom(object.getCompileTimeClass())) {
        //            ActivationStatusType status = getActivationStatus(object, ActivationType.F_EFFECTIVE_STATUS);
        //            return ActivationStatusType.DISABLED.equals(status);
        //        } else if (ShadowType.class.isAssignableFrom(object.getCompileTimeClass())) {
        //            ActivationStatusType status = getActivationStatus(object, ActivationType.F_ADMINISTRATIVE_STATUS);
        //            return ActivationStatusType.DISABLED.equals(status);
        //        }

        // attempt to fix MID-1580
        ContainerWrapper activation = wrapper.findContainerWrapper(new ItemPath(ShadowType.F_ACTIVATION));
        if (activation == null) {
            return false;
        }
        PropertyWrapper enabledProperty = activation.findPropertyWrapper(ActivationType.F_ADMINISTRATIVE_STATUS);
        if (enabledProperty == null || enabledProperty.getValues().isEmpty()) {
            return false;
        }
        ValueWrapper value = enabledProperty.getValues().get(0);
        if (value.getValue() == null) {
            return false;
        }
        ActivationStatusType status = (ActivationStatusType) value.getValue().getValue();
        return ActivationStatusType.DISABLED.equals(status);
    }

    //    private ActivationStatusType getActivationStatus(PrismObject object, QName property) {
    //        PrismProperty prismProperty = object.findProperty(new ItemPath(ShadowType.F_ACTIVATION, property));
    //        if (prismProperty == null || prismProperty.isEmpty()) {
    //            return null;
    //        }
    //
    //        return (ActivationStatusType) prismProperty.getRealValue();
    //    }

    protected Component createHeader(String id, IModel<ObjectWrapper> model) {
        H3Header header = new H3Header(id, model) {

            @Override
            protected List<InlineMenuItem> createMenuItems() {
                return createDefaultMenuItems(getModel());
            }
        };

        return header;
    }

    protected List<InlineMenuItem> createDefaultMenuItems(IModel<ObjectWrapper> model) {
        List<InlineMenuItem> items = new ArrayList<InlineMenuItem>();

        InlineMenuItem item = new InlineMenuItem(createMinMaxLabel(model), createMinMaxAction(model));
        items.add(item);

        item = new InlineMenuItem(createEmptyLabel(model), createEmptyAction(model));
        items.add(item);

        return items;
    }

    private InlineMenuItemAction createEmptyAction(final IModel<ObjectWrapper> model) {
        return new InlineMenuItemAction() {

            @Override
            public void onClick(AjaxRequestTarget target) {
                ObjectWrapper wrapper = model.getObject();
                wrapper.setShowEmpty(!wrapper.isShowEmpty());
                target.add(PrismObjectPanel.this);
            }
        };
    }

    private IModel<String> createEmptyLabel(final IModel<ObjectWrapper> model) {
        return new AbstractReadOnlyModel<String>() {

            @Override
            public String getObject() {
                ObjectWrapper wrapper = model.getObject();
                String key = wrapper.isShowEmpty() ? "PrismObjectPanel.hideEmpty" : "PrismObjectPanel.showEmpty";
                return new StringResourceModel(key, PrismObjectPanel.this, null, key).getString();
            }
        };
    }

    private InlineMenuItemAction createMinMaxAction(final IModel<ObjectWrapper> model) {
        return new InlineMenuItemAction() {

            @Override
            public void onClick(AjaxRequestTarget target) {
                ObjectWrapper wrapper = model.getObject();
                wrapper.setMinimalized(!wrapper.isMinimalized());
                target.add(PrismObjectPanel.this);
            }
        };
    }

    private IModel<String> createMinMaxLabel(final IModel<ObjectWrapper> model) {
        return new AbstractReadOnlyModel<String>() {

            @Override
            public String getObject() {
                ObjectWrapper wrapper = model.getObject();
                String key = wrapper.isMinimalized() ? "PrismObjectPanel.maximize" : "PrismObjectPanel.minimize";
                return new StringResourceModel(key, PrismObjectPanel.this, null, key).getString();
            }
        };
    }

    private void initLayout(final IModel<ObjectWrapper> model, ResourceReference image, final Form form) {
        add(createHeader(ID_HEADER, model));

        WebMarkupContainer headerPanel = new WebMarkupContainer("headerPanel");
        headerPanel.add(new AttributeAppender("class", createHeaderClassModel(model), " "));
        //        TODO - attempt to fix row color application when certain actions performed, similar to AssignmentEditorPanel.
        //        headerPanel.add(AttributeModifier.append("class", createHeaderClassModel(model)));
        //        headerPanel.setOutputMarkupId(true);
        add(headerPanel);
        headerPanel.add(new VisibleEnableBehaviour() {

            @Override
            public boolean isVisible() {
                return isShowHeader();
            }
        });

        Image shield = new Image("shield", new PackageResourceReference(ImgResources.class, ImgResources.SHIELD));
        shield.add(new VisibleEnableBehaviour() {

            @Override
            public boolean isVisible() {
                ObjectWrapper wrapper = model.getObject();
                return wrapper.isProtectedAccount();
            }
        });
        headerPanel.add(shield);

        Label header = new Label("header", createDisplayName(model));
        header.add(new AttributeAppender("class", createHeaderNameClassModel(model), " "));
        header.add(createHeaderOnClickBehaviour(model));
        headerPanel.add(header);
        Label description = new Label("description", createDescription(model));
        description.add(new AttributeModifier("title", createDescription(model)));

        description.add(createHeaderOnClickBehaviour(model));
        headerPanel.add(description);

        Image headerImg = new Image("headerImg", image);
        headerImg.add(createHeaderOnClickBehaviour(model));
        headerPanel.add(headerImg);

        initButtons(headerPanel, model);

        WebMarkupContainer body = new WebMarkupContainer("body");
        body.add(new VisibleEnableBehaviour() {

            @Override
            public boolean isVisible() {
                ObjectWrapper wrapper = model.getObject();
                return !wrapper.isMinimalized();
            }
        });
        add(body);

        ListView<ContainerWrapper> containers = new ListView<ContainerWrapper>("containers",
                new PropertyModel<List<ContainerWrapper>>(model, "containers")) {

            @Override
            protected void populateItem(ListItem<ContainerWrapper> item) {
                item.add(new PrismContainerPanel("container", item.getModel(), form));
            }
        };
        containers.setReuseItems(true);
        body.add(containers);
    }

    protected IModel<String> createDisplayName(IModel<ObjectWrapper> model) {
        return new PropertyModel<String>(model, "displayName");
    }

    protected IModel<String> createDescription(IModel<ObjectWrapper> model) {
        return new PropertyModel<String>(model, "description");
    }

    private void initButtons(WebMarkupContainer headerPanel, final IModel<ObjectWrapper> model) {
        headerPanel.add(new PrismOptionButtonPanel("optionButtons", model) {

            @Override
            public void checkBoxOnUpdate(AjaxRequestTarget target) {
                target.add(PrismObjectPanel.this);
            }

            @Override
            public void minimizeOnClick(AjaxRequestTarget target) {
                ObjectWrapper wrapper = model.getObject();
                wrapper.setMinimalized(!wrapper.isMinimalized());
                target.add(PrismObjectPanel.this);
            }

            @Override
            public void showEmptyOnClick(AjaxRequestTarget target) {
                ObjectWrapper wrapper = model.getObject();
                wrapper.setShowEmpty(!wrapper.isShowEmpty());
                target.add(PrismObjectPanel.this);
            }
        });
        headerPanel.add(createOperationPanel("operationButtons"));
    }

    protected Panel createOperationPanel(String id) {
        return new EmptyPanel(id);
    }

    public boolean isShowHeader() {
        return showHeader;
    }

    public void setShowHeader(boolean showHeader) {
        this.showHeader = showHeader;
    }

    public void headerOnClickPerformed(AjaxRequestTarget target, IModel<ObjectWrapper> model) {
        ObjectWrapper wrapper = model.getObject();
        wrapper.setMinimalized(!wrapper.isMinimalized());
        target.add(PrismObjectPanel.this);
    }
}