ro.nextreports.server.web.schedule.time.IntervalFieldPanel.java Source code

Java tutorial

Introduction

Here is the source code for ro.nextreports.server.web.schedule.time.IntervalFieldPanel.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.time;

import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.validation.validator.PatternValidator;

import ro.nextreports.server.web.schedule.validator.IntervalFieldStringValidator;

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

//
public class IntervalFieldPanel extends Panel {

    private ModalWindow modal;
    private TextField<String> intervalText;
    private AjaxLink setLink;

    public IntervalFieldPanel(String id, final IModel model, final String entityType, final String intType) {
        this(id, model, entityType, intType, false);
    }

    @SuppressWarnings("unchecked")
    public IntervalFieldPanel(String id, final IModel model, final String entityType, final String intType,
            boolean required) {
        super(id, model);

        String text = getLabelText(entityType);

        intervalText = new TextField<String>("intervalText", model);
        intervalText.setOutputMarkupId(true);
        if (required) {
            intervalText.setRequired(true);
            intervalText.setLabel(new Model<String>(text));
        }

        // validators to respect the pattern
        if (SelectIntervalPanel.DAY_ENTITY.equals(entityType)) {
            String day = "(0[1-9]|[1-9]|[12][0-9]|3[01])";
            String pattern = day + "{1}(," + day + ")*|" + day + "{1}(-" + day + "){0,1}";
            intervalText.add(new PatternValidator(pattern));
        } else if (SelectIntervalPanel.HOUR_ENTITY.equals(entityType)) {
            String hour = "(0[0-9]|[0-9]|1[0-9]|2[0-3])";
            String pattern = hour + "{1}(," + hour + ")*|" + hour + "{1}(-" + hour + "){0,1}";
            intervalText.add(new PatternValidator(pattern));
        } else if (SelectIntervalPanel.MONTH_ENTITY.equals(entityType)) {
            String month = "(0[1-9]|[1-9]|1[0-2])";
            String pattern = month + "{1}(," + month + ")*|" + month + "{1}(-" + month + "){0,1}";
            intervalText.add(new PatternValidator(pattern));
        } else if (SelectIntervalPanel.DAY_OF_WEEK_ENTITY.equals(entityType)) {
            String weekDay = "(Sun|Mon|Tue|Wed|Thu|Fri|Sat)";
            String pattern = weekDay + "{1}(," + weekDay + ")*|" + weekDay + "{1}(-" + weekDay + "){0,1}";
            intervalText.add(new PatternValidator(pattern));
        }
        // validator to respect the order and uniqness
        intervalText.add(new IntervalFieldStringValidator(entityType));

        add(intervalText);

        modal = new ModalWindow("modal");
        add(modal);

        add(setLink = new AjaxLink("set") {
            @Override
            public void onClick(AjaxRequestTarget target) {
                final TimeValues timeValues = getTimeValues(intervalText.getModelObject());
                modal.setTitle(new Model<String>(getString("select") + " " + getLabelText(entityType)));
                modal.setInitialWidth(450);
                modal.setInitialHeight(300);
                modal.setContent(new SelectIntervalPanel(modal.getContentId(), entityType, intType, timeValues) {
                    protected void onCancel(AjaxRequestTarget target) {
                        ModalWindow.closeCurrent(target);
                    }

                    @SuppressWarnings("unchecked")
                    protected void onSet(AjaxRequestTarget target) {
                        ModalWindow.closeCurrent(target);
                        //System.out.println("entityType=" + entityType + "  intervalType=" + timeValues.getIntervalType() + "  values=" + timeValues.getDiscreteValues());
                        String interval = getTimeEntity(entityType, timeValues);
                        model.setObject(interval);
                        //System.out.println("*** interval=" + interval);
                        target.add(intervalText);
                    }
                });
                modal.show(target);
            }
        });
    }

    private String getLabelText(String entityType) {
        if (SelectIntervalPanel.HOUR_ENTITY.equals(entityType)) {
            return getString("hours");
        } else if (SelectIntervalPanel.DAY_ENTITY.equals(entityType)) {
            return getString("days");
        } else if (SelectIntervalPanel.MONTH_ENTITY.equals(entityType)) {
            return getString("months");
        } else {
            return getString("weekDays");
        }
    }

    public String getTimeEntity(String entityType, TimeValues timeValues) {
        if (TimeValues.INTERVAL_TYPE.equals(timeValues.getIntervalType())) {
            return timeValues.getStartTime() + SelectIntervalPanel.INTERVAL_SEPARATOR + timeValues.getEndTime();
        } else {
            List<String> intervals = timeValues.getDiscreteValues();
            StringBuilder sb = new StringBuilder();
            for (int i = 0, size = intervals.size(); i < size; i++) {
                sb.append(intervals.get(i));
                if (i < size - 1) {
                    sb.append(SelectIntervalPanel.DISCRETE_SEPARATOR);
                }
            }
            return sb.toString();
        }
    }

    private TimeValues getTimeValues(String timeEntity) {
        TimeValues tv = new TimeValues();
        tv.setIntervalType(getIntervalType(timeEntity));
        if ((timeEntity == null) || timeEntity.trim().equals("")) {
            return tv;
        }
        if (timeEntity.contains(SelectIntervalPanel.INTERVAL_SEPARATOR)) {
            String[] elements = timeEntity.split(SelectIntervalPanel.INTERVAL_SEPARATOR);
            tv.setStartTime(elements[0]);
            tv.setEndTime(elements[1]);
            return tv;
        } else {
            String[] elements = timeEntity.split(SelectIntervalPanel.DISCRETE_SEPARATOR);
            ArrayList<String> discreteValues = new ArrayList<String>();
            discreteValues.addAll(Arrays.asList(elements));
            tv.setDiscreteValues(discreteValues);
            return tv;
        }
    }

    private String getIntervalType(String timeEntity) {
        if ((timeEntity == null) || timeEntity.trim().equals("")) {
            return null;
        }
        if (timeEntity.contains(SelectIntervalPanel.INTERVAL_SEPARATOR)) {
            return TimeValues.INTERVAL_TYPE;
        } else if (timeEntity.contains(SelectIntervalPanel.DISCRETE_SEPARATOR)) {
            return TimeValues.DISCRETE_TYPE;
        }
        return null;
    }

    public TextField<String> getIntervalText() {
        return intervalText;
    }

    public void setLinkVisible(boolean visible) {
        setLink.setVisible(visible);
    }

}