Package org.openengsb.ui.admin.ruleEditorPanel

Source Code of org.openengsb.ui.admin.ruleEditorPanel.RuleEditorPanel

/**
* Licensed to the Austrian Association for Software Tool Integration (AASTI)
* under one or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information regarding copyright
* ownership. The AASTI licenses this file to you 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 org.openengsb.ui.admin.ruleEditorPanel;

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

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.ajax.form.OnChangeAjaxBehavior;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxButton;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.Model;
import org.openengsb.core.api.security.annotation.SecurityAttribute;
import org.openengsb.core.workflow.api.RuleBaseException;
import org.openengsb.core.workflow.api.model.RuleBaseElementId;
import org.openengsb.core.workflow.api.model.RuleBaseElementType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@SecurityAttribute(key = "org.openengsb.ui.component", value = "WORKFLOW_ADMIN")
public class RuleEditorPanel extends Panel {

    private static final long serialVersionUID = 3743136687567466406L;

    private static final Logger LOGGER = LoggerFactory.getLogger(RuleEditorPanel.class);

    private RuleManagerProvider ruleManagerProvider;
    private TextArea<String> textArea;
    private DropDownChoice<RuleBaseElementId> ruleChoice;
    private TextField<String> newRuleTextField;
    private DropDownChoice<RuleBaseElementType> typeChoice;
    private AjaxButton newButton;
    private AjaxButton cancelButton;
    private AjaxButton deleteButton;
    private IndicatingAjaxButton saveButton;
    private boolean newRuleMode;
    private Form<Object> form;
    private FeedbackPanel feedbackPanel;

    public RuleEditorPanel(String id, RuleManagerProvider ruleManagerProvider) {
        super(id);
        this.ruleManagerProvider = ruleManagerProvider;
        initPage();
    }

    private void initPage() {
        form = new Form<Object>("form");
        initTypeChoice(form);
        initRuleChoice(form);
        newRuleTextField = new TextField<String>("ruleName", new Model<String>("rulename"));
        newRuleTextField.setOutputMarkupId(true);
        newRuleTextField.setVisible(false);
        form.add(newRuleTextField);
        initButtons(form);
        initTextArea(form);
        add(form);
        feedbackPanel = new FeedbackPanel("feedback");
        feedbackPanel.setOutputMarkupId(true);
        add(feedbackPanel);
    }

    @SuppressWarnings("serial")
    private void initTextArea(Form<Object> form) {
        Model<String> textAreaModel = new Model<String>();
        textArea = new TextArea<String>("text", textAreaModel);
        textArea.add(new OnChangeAjaxBehavior() {
            @Override
            protected void onUpdate(AjaxRequestTarget target) {
                enableButtons(target);
            }
        });
        textArea.setEnabled(false);
        textArea.setOutputMarkupId(true);
        form.add(textArea);
    }

    private void enableButtons(AjaxRequestTarget target) {
        saveButton.setEnabled(true);
        target.add(saveButton);
        cancelButton.setEnabled(true);
        target.add(cancelButton);
    }

    private void disableButtons(AjaxRequestTarget target) {
        saveButton.setEnabled(false);
        target.add(saveButton);
        cancelButton.setEnabled(false);
        target.add(cancelButton);
    }

    private void enableDeleteButton(AjaxRequestTarget target) {
        deleteButton.setEnabled(true);
        target.add(deleteButton);
    }

    private void disableDeleteButton(AjaxRequestTarget target) {
        deleteButton.setEnabled(false);
        target.add(deleteButton);
    }

    @SuppressWarnings("serial")
    private void initButtons(Form<Object> form) {
        saveButton = new IndicatingAjaxButton("save") {
            @Override
            protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
                target.add(textArea);
                if (newRuleMode) {
                    boolean error = false;
                    RuleBaseElementId ruleBaseElementId = new RuleBaseElementId(typeChoice.getModelObject(),
                            newRuleTextField.getModelObject());
                    try {
                        ruleManagerProvider.getRuleManager().add(ruleBaseElementId, textArea.getModelObject());
                    } catch (RuleBaseException e) {
                        error = true;
                        target.add(feedbackPanel);
                        error(e.getLocalizedMessage());
                    }
                    resetAfterNew(target);
                    ruleChoice.setModelObject(ruleBaseElementId);
                    if (!error) {
                        error("");
                        target.add(feedbackPanel);
                    }
                } else {
                    updateRule(target);
                }
                enableDeleteButton(target);
            }

            @Override
            protected void onError(AjaxRequestTarget target, Form<?> form) {
                LOGGER.warn("Error during submit with save.");
            }

        };
        saveButton.setEnabled(false);
        saveButton.setOutputMarkupId(true);
        form.add(saveButton);
        cancelButton = new AjaxButton("cancel") {
            @Override
            protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
                if (newRuleMode) {
                    resetAfterNew(target);
                    disableDeleteButton(target);
                } else {
                    reloadTextArea(target);
                    enableDeleteButton(target);
                }
            }

            @Override
            protected void onError(AjaxRequestTarget target, Form<?> form) {
                LOGGER.warn("Submit error during cancle button.");
            }
        };
        cancelButton.setEnabled(false);
        cancelButton.setOutputMarkupId(true);
        form.add(cancelButton);
        newButton = new AjaxButton("new") {
            @Override
            protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
                enterNewRuleMode(target);
                disableDeleteButton(target);
            }

            @Override
            protected void onError(AjaxRequestTarget target, Form<?> form) {
                LOGGER.warn("Submit error during new buttion");
            }
        };
        form.add(newButton);
        deleteButton = new AjaxButton("delete") {
            @Override
            protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
                deleteRule(target);
                disableDeleteButton(target);
            }

            @Override
            protected void onError(AjaxRequestTarget target, Form<?> form) {
                LOGGER.warn("Submit error during delete button");
            }
        };
        deleteButton.setEnabled(false);
        deleteButton.setOutputMarkupId(true);
        form.add(deleteButton);
    }

    @SuppressWarnings("serial")
    private void initRuleChoice(Form<Object> form) {
        ruleChoice = new DropDownChoice<RuleBaseElementId>("ruleChoice");
        loadRuleChoice();
        ruleChoice.add(new AjaxFormComponentUpdatingBehavior("onchange") {
            @Override
            protected void onUpdate(AjaxRequestTarget target) {
                reloadTextArea(target);
            }
        });
        ruleChoice.setOutputMarkupId(true);
        form.add(ruleChoice);
    }

    @SuppressWarnings("serial")
    private void initTypeChoice(Form<Object> form) {
        List<RuleBaseElementType> ruleTypes = Arrays.asList(RuleBaseElementType.values());
        typeChoice = new DropDownChoice<RuleBaseElementType>("typeChoice", ruleTypes);
        typeChoice.setModel(new Model<RuleBaseElementType>());
        typeChoice.getModel().setObject(RuleBaseElementType.Rule);
        typeChoice.add(new AjaxFormComponentUpdatingBehavior("onchange") {
            @Override
            protected void onUpdate(AjaxRequestTarget target) {
                if (!newRuleMode) {
                    reloadTextArea(target);
                    reloadRuleChoice(target);
                }
            }
        });
        form.add(typeChoice);
    }

    private void reloadRuleChoice(AjaxRequestTarget target) {
        target.add(ruleChoice);
        loadRuleChoice();
    }

    private void loadRuleChoice() {
        RuleBaseElementType selectedType = typeChoice.getModelObject();
        List<RuleBaseElementId> choices = new ArrayList<RuleBaseElementId>(ruleManagerProvider.getRuleManager()
                .listAll(selectedType));
        ruleChoice.setChoices(choices);
        ruleChoice.setModel(new Model<RuleBaseElementId>());
    }

    private void reloadTextArea(AjaxRequestTarget target) {
        target.add(textArea);
        RuleBaseElementId selection = ruleChoice.getModelObject();
        if (selection != null) {
            textArea.setModel(new Model<String>(ruleManagerProvider.getRuleManager().get(selection)));
            textArea.setEnabled(true);
            enableDeleteButton(target);
        } else {
            textArea.setModel(new Model<String>());
            textArea.setEnabled(false);
            disableDeleteButton(target);
        }
        disableButtons(target);
    }

    private void updateRule(AjaxRequestTarget target) {
        RuleBaseElementId selection = ruleChoice.getModelObject();
        String text = textArea.getModelObject();
        boolean error = false;
        if (selection != null && text != null) {
            try {
                ruleManagerProvider.getRuleManager().update(selection, text);
            } catch (RuleBaseException e) {
                error = true;
                target.add(feedbackPanel);
                error(e.getLocalizedMessage());
            }
        }
        if (!error) {
            error("");
            target.add(feedbackPanel);
        }
        disableButtons(target);
    }

    private void deleteRule(AjaxRequestTarget target) {
        RuleBaseElementId selection = ruleChoice.getModelObject();
        ruleManagerProvider.getRuleManager().delete(selection);
        reloadTextArea(target);
        reloadRuleChoice(target);
    }

    private void resetAfterNew(AjaxRequestTarget target) {
        newRuleMode = false;
        newButton.setEnabled(true);
        newRuleTextField.setVisible(false);
        ruleChoice.setVisible(true);
        loadRuleChoice();
        target.add(form);
        target.add(newButton);
        target.add(ruleChoice);
        disableButtons(target);
    }

    private void enterNewRuleMode(AjaxRequestTarget target) {
        newRuleMode = true;
        newRuleTextField.setVisible(true);
        ruleChoice.setVisible(false);
        textArea.setEnabled(true);
        if (textArea.getModelObject() == null) {
            textArea.setModel(new Model<String>(""));
        }
        newButton.setEnabled(false);
        saveButton.setEnabled(true);
        cancelButton.setEnabled(true);
        deleteButton.setEnabled(false);
        target.add(form);
        target.add(newRuleTextField);
        target.add(newRuleTextField);
        target.add(ruleChoice);
        target.add(textArea);
        target.add(newButton);
    }
}
TOP

Related Classes of org.openengsb.ui.admin.ruleEditorPanel.RuleEditorPanel

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.