ca.travelagency.config.LookupEntitiesPage.java Source code

Java tutorial

Introduction

Here is the source code for ca.travelagency.config.LookupEntitiesPage.java

Source

/**
 *    Copyright (C) 2010 - 2014 VREM Software Development <VREMSoftwareDevelopment@gmail.com>
 *
 *    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 ca.travelagency.config;

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

import org.apache.commons.lang3.Validate;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.extensions.ajax.markup.html.repeater.data.table.AjaxFallbackDefaultDataTable;
import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.RequiredTextField;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.spring.injection.annot.SpringBean;

import ca.travelagency.BasePage;
import ca.travelagency.components.behaviors.AjaxOnBlurBehavior;
import ca.travelagency.components.dataprovider.DataProvider;
import ca.travelagency.components.decorators.FieldDecorator;
import ca.travelagency.components.fields.StringFieldHelper;
import ca.travelagency.components.formdetail.DeletePanel;
import ca.travelagency.components.formheader.DaoEntityModelFactory;
import ca.travelagency.components.formheader.ResetPanel;
import ca.travelagency.components.formheader.SavePanel;
import ca.travelagency.components.validators.DuplicateValidator;
import ca.travelagency.persistence.DaoEntity;
import ca.travelagency.persistence.DaoSupport;
import ca.travelagency.utils.StringUtils;

public abstract class LookupEntitiesPage<T extends DaoEntity> extends BasePage {
    private static final long serialVersionUID = 1L;

    static final String DATA_TABLE = "dataTable";
    static final String DELETE = "deleteLink";

    static final String ADD_FORM = "addForm";
    static final String ADD_FORM_TITLE2 = "addFormTitle2";
    static final String ADD_FORM_TITLE1 = "addFormTitle1";
    static final String EDIT_FORM = "editForm";
    static final String SEARCH_FORM = "searchForm";

    static final String SAVE_BUTTON = "saveButton";
    static final String RESET_BUTTON = "resetButton";
    static final String SEARCH_BUTTON = "searchButton";
    static final String CLEAR_BUTTON = "clearButton";

    private Component dataTable;

    public LookupEntitiesPage(LookupEntitiesFilter lookupEntitiesFilter) {
        super();
        if (lookupEntitiesFilter == null) {
            lookupEntitiesFilter = new LookupEntitiesFilter(getTrueClass());
        }
        IModel<LookupEntitiesFilter> model = Model.of(lookupEntitiesFilter);

        add(makeSearchForm(model));

        add(new Label(ADD_FORM_TITLE1, new ResourceModel("lookup.label.new")));
        add(new Label(ADD_FORM_TITLE2, new ResourceModel(getLabelNameKey())));

        dataTable = makeDataTable(model);
        add(dataTable);

        add(makeAddForm(dataTable));
    }

    private Component makeDataTable(IModel<LookupEntitiesFilter> model) {
        return new AjaxFallbackDefaultDataTable<T, String>(DATA_TABLE, makeColumns(), new DataProvider<T>(model),
                DATA_TABLE_PER_PAGE);
    }

    private Form<LookupEntitiesFilter> makeSearchForm(IModel<LookupEntitiesFilter> model) {
        final Form<LookupEntitiesFilter> form = new Form<LookupEntitiesFilter>(SEARCH_FORM,
                new CompoundPropertyModel<LookupEntitiesFilter>(model));
        form.setOutputMarkupId(true);

        ResourceModel resourceModel = new ResourceModel(getLabelNameKey());

        form.add(new TextField<String>(DaoEntity.PROPERTY_NAME).setLabel(resourceModel)
                .add(StringFieldHelper.maxLenFieldValidator())
                .add(FieldDecorator.inlineDisplayLabel(), new AjaxOnBlurBehavior()));

        form.add(new Button(SEARCH_BUTTON) {
            private static final long serialVersionUID = 1L;

            @Override
            public void onSubmit() {
                setResponsePage(makeLookupEntitiesPage(form.getModelObject()));
            };
        });

        form.add(new Button(CLEAR_BUTTON) {
            private static final long serialVersionUID = 1L;

            @Override
            public void onSubmit() {
                setResponsePage(makeLookupEntitiesPage(new LookupEntitiesFilter(getTrueClass())));
            }
        }.setDefaultFormProcessing(false));

        return form;
    }

    private Form<T> makeAddForm(Component dataTable) {
        Validate.notNull(dataTable);

        @SuppressWarnings("unchecked")
        Form<T> form = makeForm(ADD_FORM, (IModel<T>) DaoEntityModelFactory.make(getTrueClass()));

        makeNameField(form).add(new FieldDecorator());

        form.add(new SavePanel<T>(SAVE_BUTTON, form, dataTable).setResetModelAfterSubmit(true));
        form.add(new ResetPanel<T>(RESET_BUTTON, form).setResetModel(true));

        return form;
    }

    private Form<T> makeForm(String id, IModel<T> model) {
        Form<T> form = new Form<T>(id, model);
        form.setOutputMarkupId(true);
        return form;
    }

    private RequiredTextField<String> makeNameField(Form<T> form) {
        ResourceModel resourceModel = new ResourceModel(getLabelNameKey());

        RequiredTextField<String> textField = new RequiredTextField<String>(DaoEntity.PROPERTY_NAME);
        textField.setLabel(resourceModel).add(StringFieldHelper.maxLenFieldValidator())
                .add(new AjaxOnBlurBehavior(), new DuplicateValidator<T>(form));
        form.add(textField);
        return textField;
    }

    private List<IColumn<T, String>> makeColumns() {
        List<IColumn<T, String>> columns = new ArrayList<IColumn<T, String>>();

        ResourceModel resourceModel = new ResourceModel(getLabelNameKey());
        columns.add(new PropertyColumn<T, String>(resourceModel, DaoEntity.PROPERTY_NAME, DaoEntity.PROPERTY_NAME) {
            private static final long serialVersionUID = 1L;

            @Override
            public void populateItem(Item<ICellPopulator<T>> item, String componentId, IModel<T> rowModel) {
                item.add(new EditPanel(componentId, rowModel.getObject()));
            }
        });

        columns.add(new PropertyColumn<T, String>(Model.of(StringUtils.EMPTY), DaoEntity.PROPERTY_ID) {
            private static final long serialVersionUID = 1L;

            @Override
            public void populateItem(Item<ICellPopulator<T>> item, String componentId, IModel<T> rowModel) {
                item.add(new DeletePanel<T>(componentId, rowModel.getObject(), getDataTable()));
            }
        });

        return columns;
    }

    private Component getDataTable() {
        return dataTable;
    }

    public abstract Class<?> getTrueClass();

    public abstract String getLabelNameKey();

    public abstract LookupEntitiesPage<T> makeLookupEntitiesPage(LookupEntitiesFilter lookupEntitiesFilter);

    public class EditPanel extends Panel {
        private static final long serialVersionUID = 1L;

        @SpringBean
        private DaoSupport<T> daoSupport;

        public EditPanel(String id, T daoEntity) {
            super(id);

            final Form<T> form = makeForm(EDIT_FORM, DaoEntityModelFactory.make(daoEntity));
            add(form);

            makeNameField(form).add(FieldDecorator.doNotDisplayLabel(),
                    new AjaxFormComponentUpdatingBehavior("onchange") {
                        private static final long serialVersionUID = 1L;

                        @Override
                        protected void onUpdate(AjaxRequestTarget target) {
                            T daoEntity = form.getModelObject();
                            daoSupport.persist(daoEntity);
                            target.add(form);
                        }

                        @Override
                        protected void onError(AjaxRequestTarget target, RuntimeException e) {
                            target.add(form);
                        }
                    });
        }
    }

}