com.evolveum.midpoint.web.component.message.OperationResultPanel.java Source code

Java tutorial

Introduction

Here is the source code for com.evolveum.midpoint.web.component.message.OperationResultPanel.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.message;

import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.component.util.LoadableModel;
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
import org.apache.commons.lang.StringUtils;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.feedback.FeedbackMessage;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.basic.MultiLineLabel;
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.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.PropertyModel;

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

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

    private static final Trace LOGGER = TraceManager.getTrace(OperationResultPanel.class);
    static final String OPERATION_RESOURCE_KEY_PREFIX = "operation.";

    public OperationResultPanel(String id, final IModel<OpResult> model) {
        super(id);

        initLayout(model);
    }

    private void initLayout(final IModel<OpResult> model) {
        WebMarkupContainer operationPanel = new WebMarkupContainer("operationPanel");
        operationPanel.setOutputMarkupId(true);
        add(operationPanel);
        Label operation = new Label("operation", new LoadableModel<Object>() {

            @Override
            protected Object load() {
                OpResult result = model.getObject();

                String resourceKey = OPERATION_RESOURCE_KEY_PREFIX + result.getOperation();
                return getPage().getString(resourceKey, null, resourceKey);
            }
        });
        operation.setOutputMarkupId(true);
        operationPanel.add(operation);
        operationPanel.add(initCountPanel(model));

        WebMarkupContainer arrow = new WebMarkupContainer("arrow");
        arrow.add(new AttributeAppender("class", createArrowClass(model), " "));
        arrow.setMarkupId(operationPanel.getMarkupId() + "_arrow");
        add(arrow);

        WebMarkupContainer operationContent = new WebMarkupContainer("operationContent");
        operationContent.setMarkupId(operationPanel.getMarkupId() + "_content");
        add(operationContent);

        operationContent.add(new Label("message", new PropertyModel<String>(model, "message")));

        initParams(operationContent, model);
        initContexts(operationContent, model);
        //initCount(operationContent, model);
        initExceptionLayout(operationContent, model);

    }

    private WebMarkupContainer initCountPanel(final IModel<OpResult> model) {
        WebMarkupContainer countPanel = new WebMarkupContainer("countPanel");
        countPanel.add(new VisibleEnableBehaviour() {

            @Override
            public boolean isVisible() {
                OpResult result = model.getObject();
                return result.getCount() > 1;
            }
        });
        countPanel.add(new Label("count", new PropertyModel<String>(model, "count")));
        return countPanel;
    }

    /*    private void initCount(WebMarkupContainer operationContent, final IModel<OpResult> model) {
    WebMarkupContainer countLi = new WebMarkupContainer("countLi");
    countLi.add(new VisibleEnableBehaviour() {
        
        @Override
        public boolean isVisible() {
            OpResult result = model.getObject();
            return result.getCount() > 1;
        }
    });
    operationContent.add(countLi);
    countLi.add(new Label("count", new PropertyModel<String>(model, "count")));
        }*/

    private void initParams(WebMarkupContainer operationContent, final IModel<OpResult> model) {
        ListView<Param> params = new ListView<Param>("params", createParamsModel(model)) {

            @Override
            protected void populateItem(ListItem<Param> item) {
                item.add(new Label("paramName", new PropertyModel<Object>(item.getModel(), "name")));
                item.add(new Label("paramValue", new PropertyModel<Object>(item.getModel(), "value")));
            }
        };
        operationContent.add(params);

        ListView<OpResult> subresults = new ListView<OpResult>("subresults", createSubresultsModel(model)) {

            @Override
            protected void populateItem(final ListItem<OpResult> item) {
                item.add(new AttributeAppender("class", createMessageLiClass(item.getModel()), " "));
                item.add(new AttributeModifier("title", new LoadableModel<String>() {

                    @Override
                    protected String load() {
                        return getString(
                                "operationResultPanel.title." + createMessageTooltip(item.getModel()).getObject());
                    }
                }));
                item.add(new OperationResultPanel("subresult", item.getModel()));
            }
        };
        operationContent.add(subresults);

    }

    private void initContexts(WebMarkupContainer operationContent, final IModel<OpResult> model) {
        ListView<Context> contexts = new ListView<Context>("contexts", createContextsModel(model)) {
            @Override
            protected void populateItem(ListItem<Context> item) {
                item.add(new Label("contextName", new PropertyModel<Object>(item.getModel(), "name")));
                item.add(new Label("contextValue", new PropertyModel<Object>(item.getModel(), "value")));
            }
        };
        operationContent.add(contexts);
    }

    private void initExceptionLayout(WebMarkupContainer operationContent, final IModel<OpResult> model) {
        WebMarkupContainer exception = new WebMarkupContainer("exception") {

            @Override
            public boolean isVisible() {
                OpResult result = model.getObject();
                return StringUtils.isNotEmpty(result.getExceptionMessage())
                        || StringUtils.isNotEmpty(result.getExceptionsStackTrace());
            }
        };
        operationContent.add(exception);
        exception.add(new MultiLineLabel("exceptionMessage", new PropertyModel<String>(model, "exceptionMessage")));

        WebMarkupContainer errorStack = new WebMarkupContainer("errorStack");
        errorStack.setOutputMarkupId(true);
        exception.add(errorStack);

        WebMarkupContainer errorStackContent = new WebMarkupContainer("errorStackContent");
        errorStackContent.setMarkupId(errorStack.getMarkupId() + "_content");
        exception.add(errorStackContent);

        errorStackContent.add(
                new MultiLineLabel("exceptionStack", new PropertyModel<String>(model, "exceptionsStackTrace")));
    }

    static IModel<String> createMessageLiClass(final IModel<OpResult> model) {
        return new LoadableModel<String>(false) {

            @Override
            protected String load() {
                OpResult result = model.getObject();
                if (result == null || result.getStatus() == null) {
                    LOGGER.warn(
                            "Operation result on panel is null or has null status (will be rendered as warning).");
                    return "messages-warn-details-section";
                }
                switch (result.getStatus()) {
                case FATAL_ERROR:
                case PARTIAL_ERROR:
                    return "messages-error-details-section";
                case IN_PROGRESS:
                case NOT_APPLICABLE:
                    return "messages-info-details-section";
                case SUCCESS:
                    return "messages-succ-details-section";
                case HANDLED_ERROR:
                    return "messages-exp-details-section";
                case UNKNOWN:
                case WARNING:
                default:
                    return "messages-warn-details-section";
                }
            }
        };
    }

    static IModel<String> createMessageTooltip(final IModel<OpResult> model) {
        return new LoadableModel<String>() {

            @Override
            protected String load() {
                OpResult result = model.getObject();
                switch (result.getStatus()) {
                case FATAL_ERROR:
                    return "fatalError";
                case PARTIAL_ERROR:
                    return "partialError";
                case IN_PROGRESS:
                    return "inProgress";
                case NOT_APPLICABLE:
                    return "info";
                case SUCCESS:
                    return "success";
                case HANDLED_ERROR:
                    return "expectedError";
                case UNKNOWN:
                    return "unknown";
                case WARNING:
                default:
                    return "warn";
                }
            }
        };
    }

    static IModel<String> createArrowClass(final IModel<OpResult> model) {
        return new LoadableModel<String>(false) {

            @Override
            protected String load() {
                OpResult result = model.getObject();
                if (result == null || result.getStatus() == null) {
                    LOGGER.warn(
                            "Operation result on panel is null or has null status (will be rendered as warning).");
                    return "messages-warn-details-bold-arrow";
                }
                switch (result.getStatus()) {
                case FATAL_ERROR:
                case PARTIAL_ERROR:
                    return "messages-error-details-bold-arrow";
                case IN_PROGRESS:
                case NOT_APPLICABLE:
                    return "messages-info-details-bold-arrow";
                case SUCCESS:
                    return "messages-succ-details-bold-arrow";
                case HANDLED_ERROR:
                    return "messages-exp-details-bold-arrow";
                case UNKNOWN:
                case WARNING:
                default:
                    return "messages-warn-details-bold-arrow";
                }
            }
        };
    }

    static IModel<List<Param>> createParamsModel(final IModel<OpResult> model) {
        return new LoadableModel<List<Param>>(false) {

            @Override
            protected List<Param> load() {
                OpResult result = model.getObject();
                return result.getParams();
            }
        };
    }

    static IModel<List<Context>> createContextsModel(final IModel<OpResult> model) {
        return new LoadableModel<List<Context>>(false) {

            @Override
            protected List<Context> load() {
                OpResult result = model.getObject();
                return result.getContexts();
            }
        };
    }

    private IModel<List<OpResult>> createSubresultsModel(final IModel<OpResult> model) {
        return new LoadableModel<List<OpResult>>(false) {

            @Override
            protected List<OpResult> load() {
                OpResult result = model.getObject();
                List<OpResult> subresults = result.getSubresults();
                if (subresults == null) {
                    subresults = new ArrayList<OpResult>();
                }

                return subresults;
            }
        };
    }
}