ro.nextreports.server.web.schedule.TemplatePanel.java Source code

Java tutorial

Introduction

Here is the source code for ro.nextreports.server.web.schedule.TemplatePanel.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF 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 ro.nextreports.server.web.schedule;

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

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.CheckBox;
import org.apache.wicket.markup.html.form.ChoiceRenderer;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import ro.nextreports.server.StorageConstants;
import ro.nextreports.server.domain.Report;
import ro.nextreports.server.domain.ReportRuntimeTemplate;
import ro.nextreports.server.domain.ShortcutType;
import ro.nextreports.server.exception.NotFoundException;
import ro.nextreports.server.report.util.ReportUtil;
import ro.nextreports.server.service.ReportService;
import ro.nextreports.server.service.StorageService;
import ro.nextreports.server.util.StorageUtil;
import ro.nextreports.server.web.common.event.ChangeShortcutTemplateEvent;
import ro.nextreports.server.web.common.event.ChangeValuesTemplateEvent;
import ro.nextreports.server.web.core.BasePage;
import ro.nextreports.server.web.core.validation.FoundEntityValidator;
import ro.nextreports.server.web.report.ReportRuntimeModel;

import ro.nextreports.engine.util.TimeShortcutType;

public class TemplatePanel extends Panel {

    @SpringBean
    private ReportService reportService;

    @SpringBean
    private StorageService storageService;

    private static final Logger LOG = LoggerFactory.getLogger(TemplatePanel.class);

    private Report report;
    private ReportRuntimeTemplate template = null;
    private ReportRuntimeModel runtimeModel;
    private FoundEntityValidator validator;
    private DropDownChoice<ShortcutType> shortcutChoice;
    private TextField<Integer> timeUnitsField;
    private DropDownChoice<String> timeTypeChoice;
    private String timeType = "Days";
    private WebMarkupContainer shortcutLastContainer;

    public TemplatePanel(String id, final Report report, ReportRuntimeModel runtimeModel) {
        super(id);
        this.report = report;
        this.runtimeModel = runtimeModel;
        if (this.runtimeModel.getShortcutType() == null) {
            this.runtimeModel.setShortcutType(ShortcutType.NONE);
        }
        timeType = TimeShortcutType.getTypeName(runtimeModel.getShortcutType().getTimeType());
        init();
    }

    private void init() {

        validator = createValidator();

        add(new Label("templateLabel", getString("ActionContributor.Run.template.name")));

        ChoiceRenderer<ReportRuntimeTemplate> nameRenderer = new ChoiceRenderer<ReportRuntimeTemplate>("name") {

            private static final long serialVersionUID = 1L;

            @Override
            public Object getDisplayValue(ReportRuntimeTemplate template) {
                if (template == null) {
                    return getString("nullValid");
                }
                return template.getName();
            }

        };

        final DropDownChoice<ReportRuntimeTemplate> templateChoice = new DropDownChoice<ReportRuntimeTemplate>(
                "template", new PropertyModel<ReportRuntimeTemplate>(this, "template"),
                new LoadableDetachableModel<List<ReportRuntimeTemplate>>() {

                    @Override
                    protected List<ReportRuntimeTemplate> load() {
                        List<ReportRuntimeTemplate> templates = new ArrayList<ReportRuntimeTemplate>();
                        try {
                            templates = reportService.getReportTemplatesById(report.getId());
                        } catch (Exception e) {
                            e.printStackTrace();
                            LOG.error(e.getMessage(), e);
                            error(e.getMessage());
                        }
                        return templates;
                    }
                }, nameRenderer);

        templateChoice.setNullValid(true);

        templateChoice.add(new AjaxFormComponentUpdatingBehavior("onchange") {
            protected void onUpdate(AjaxRequestTarget target) {
                if (template != null) {
                    new ChangeValuesTemplateEvent(templateChoice, report, template.getReportRuntime(),
                            template.getShortcutType(), target).fire();
                    runtimeModel.setShortcutType(template.getShortcutType());
                    target.add(shortcutChoice);

                    // when a template is changed then the shortcut is changed
                    ShortcutType shortcutType = runtimeModel.getShortcutType();
                    new ChangeShortcutTemplateEvent(shortcutChoice, shortcutType, target).fire();

                    timeType = TimeShortcutType.getTypeName(runtimeModel.getShortcutType().getTimeType());
                    boolean visible = (runtimeModel.getShortcutType().getType() == -1);
                    shortcutLastContainer.setVisible(visible);
                    target.add(shortcutLastContainer);
                } else {
                    runtimeModel.setShortcutType(ShortcutType.NONE);
                    shortcutLastContainer.setVisible(false);
                    target.add(shortcutChoice);
                    target.add(shortcutLastContainer);
                }
            }
        });
        add(templateChoice);

        final TextField<String> nameField = new TextField<String>("name",
                new PropertyModel<String>(this, "runtimeModel.templateName"));
        nameField.setRequired(false);
        nameField.setEnabled(false);
        nameField.setOutputMarkupId(true);
        nameField.setLabel(Model.of(getString("ActionContributor.Run.template.info")));
        add(nameField);

        add(new Label("saveTemplateLabel", getString("ActionContributor.Run.template.save")));
        final CheckBox saveTemplate = new CheckBox("saveTemplate",
                new PropertyModel<Boolean>(this, "runtimeModel.saveTemplate"));
        saveTemplate.add(new AjaxFormComponentUpdatingBehavior("onchange") {
            protected void onUpdate(AjaxRequestTarget target) {
                boolean save = runtimeModel.isSaveTemplate();
                nameField.setEnabled(save);
                nameField.setRequired(save);
                if (save) {
                    nameField.add(validator);
                } else {
                    nameField.remove(validator);
                }
                target.add(nameField);
            }
        });
        add(saveTemplate);

        WebMarkupContainer shortcutContainer = new WebMarkupContainer("shortcutContainer");
        boolean visible = ReportUtil.hasIntervalParameters(storageService.getSettings(), report);
        shortcutContainer.setVisible(visible);
        add(shortcutContainer);

        shortcutContainer.add(new Label("withShortcut", getString("ActionContributor.Run.template.interval")));

        ChoiceRenderer<ShortcutType> shortcutRenderer = new ChoiceRenderer<ShortcutType>("name") {

            private static final long serialVersionUID = 1L;

            @Override
            public Object getDisplayValue(ShortcutType shortcut) {
                return getString(
                        "ActionContributor.Run.template.interval." + ShortcutType.getName(shortcut.getType()));
            }

        };
        shortcutChoice = new DropDownChoice<ShortcutType>("shortcutType",
                new PropertyModel<ShortcutType>(this, "runtimeModel.shortcutType"), ShortcutType.getTypes(),
                shortcutRenderer);
        shortcutChoice.setNullValid(false);
        shortcutChoice.add(new AjaxFormComponentUpdatingBehavior("onchange") {
            protected void onUpdate(AjaxRequestTarget target) {
                ShortcutType shortcutType = runtimeModel.getShortcutType();
                new ChangeShortcutTemplateEvent(shortcutChoice, shortcutType, target).fire();
                boolean visible = (runtimeModel.getShortcutType().getType() == -1);
                shortcutLastContainer.setVisible(visible);
                target.add(shortcutLastContainer);
            }
        });
        shortcutChoice.setOutputMarkupId(true);
        shortcutContainer.add(shortcutChoice);

        shortcutLastContainer = new WebMarkupContainer("shortcutLastContainer");
        shortcutLastContainer.setVisible(false);
        shortcutLastContainer.setOutputMarkupPlaceholderTag(true);
        shortcutContainer.add(shortcutLastContainer);

        timeUnitsField = new TextField<Integer>("timeUnits",
                new PropertyModel<Integer>(this, "runtimeModel.shortcutType.timeUnits"));
        timeUnitsField.add(new AjaxFormComponentUpdatingBehavior("onchange") {
            @Override
            protected void onUpdate(AjaxRequestTarget target) {
                new ChangeShortcutTemplateEvent(shortcutChoice, runtimeModel.getShortcutType(), target).fire();
            }
        });
        timeUnitsField.setRequired(false);
        shortcutLastContainer.add(timeUnitsField);

        ChoiceRenderer<String> timeTypeRenderer = new ChoiceRenderer<String>() {

            private static final long serialVersionUID = 1L;

            @Override
            public Object getDisplayValue(String type) {
                return getString(type.toLowerCase());
            }

        };
        timeTypeChoice = new DropDownChoice<String>("timeType", new PropertyModel<String>(this, "timeType"),
                TimeShortcutType.getTypeNames(), timeTypeRenderer);
        timeTypeChoice.add(new AjaxFormComponentUpdatingBehavior("onchange") {
            protected void onUpdate(AjaxRequestTarget target) {
                runtimeModel.getShortcutType().setTimeType(TimeShortcutType.getTypeUnit(timeType));
                new ChangeShortcutTemplateEvent(shortcutChoice, runtimeModel.getShortcutType(), target).fire();
            }
        });
        shortcutLastContainer.add(timeTypeChoice);

        if (runtimeModel.getShortcutType().getType() == -1) {
            shortcutLastContainer.setVisible(true);
        }

        add(new AjaxLink<Void>("removeTemplate") {

            private static final long serialVersionUID = 1L;

            @Override
            public void onClick(AjaxRequestTarget target) {
                ModalWindow dialog = findParent(BasePage.class).getDialog();
                dialog.setTitle(getString("ActionContributor.Run.template.remove"));
                dialog.setInitialWidth(350);
                dialog.setInitialHeight(200);
                dialog.setResizable(true);

                final ManageTemplatesPanel panel = new ManageTemplatesPanel(dialog.getContentId(), report) {

                    private static final long serialVersionUID = 1L;

                    @Override
                    public void onDelete(AjaxRequestTarget target, List<ReportRuntimeTemplate> selected) {
                        ModalWindow.closeCurrent(target);
                        if (selected.size() == 0) {
                            return;
                        }
                        List<String> ids = new ArrayList<String>();
                        for (ReportRuntimeTemplate rt : selected) {
                            ids.add(rt.getId());
                        }
                        try {
                            storageService.removeEntitiesById(ids);
                        } catch (NotFoundException e) {
                            e.printStackTrace();
                            LOG.error(e.getMessage(), e);
                            error(e.getMessage());
                        }
                        template = null;
                        target.add(templateChoice);
                    }

                    @Override
                    public void onCancel(AjaxRequestTarget target) {
                        ModalWindow.closeCurrent(target);
                    }

                };
                dialog.setContent(panel);
                dialog.show(target);
            }

        });
    }

    public void setRuntimeModel(ReportRuntimeModel runtimeModel) {
        this.runtimeModel = runtimeModel;
    }

    private FoundEntityValidator createValidator() {
        String path = null;
        try {
            if (!StorageUtil.isVersion(report)) {
                path = storageService.getEntityById(report.getId()).getPath();
            } else {
                String versionId = StorageUtil.getVersionableId(report);
                path = storageService.getEntityById(versionId).getPath();
            }
        } catch (Exception e) {
            e.printStackTrace();
            LOG.error(e.getMessage(), e);
        }
        path += StorageConstants.PATH_SEPARATOR + "templates";
        return new FoundEntityValidator(path, getString("ActionContributor.Run.template.exists"));
    }

    public void refreshShortcut(AjaxRequestTarget target) {
        target.add(shortcutChoice);
        target.add(shortcutLastContainer);
    }

    public ReportRuntimeTemplate getTemplate() {
        return template;
    }

    public void setTemplate(ReportRuntimeTemplate template) {
        this.template = template;
        if (template != null) {
            this.runtimeModel.setShortcutType(template.getShortcutType());
            this.timeType = TimeShortcutType.getTypeName(runtimeModel.getShortcutType().getTimeType());
            boolean visible = (runtimeModel.getShortcutType().getType() == -1);
            shortcutLastContainer.setVisible(visible);
        } else {
            this.runtimeModel.setShortcutType(ShortcutType.NONE);
            shortcutLastContainer.setVisible(false);
        }
    }

}