gr.abiss.calipso.wicket.SpaceFormPanel.java Source code

Java tutorial

Introduction

Here is the source code for gr.abiss.calipso.wicket.SpaceFormPanel.java

Source

/*
 * Copyright (c) 2007 - 2010 Abiss.gr <info@abiss.gr>  
 *
 *  This file is part of Calipso, a software platform by www.Abiss.gr.
 *
 *  Calipso is free software: you can redistribute it and/or modify 
 *  it under the terms of the GNU Affero General Public License as published by 
 *  the Free Software Foundation, either version 3 of the License, or 
 *  (at your option) any later version.
 * 
 *  Calipso is distributed in the hope that it will be useful, 
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of 
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 *  GNU Affero General Public License for more details.
 * 
 *  You should have received a copy of the GNU General Public License 
 *  along with Calipso. If not, see http://www.gnu.org/licenses/agpl.html
 * 
 * This file incorporates work released by the JTrac project and  covered 
 * by the following copyright and permission notice:  
 * 
 *   Copyright 2002-2005 the original author or authors.
 * 
 *   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 gr.abiss.calipso.wicket;

import gr.abiss.calipso.CalipsoService;
import gr.abiss.calipso.domain.Language;
import gr.abiss.calipso.domain.Space;
import gr.abiss.calipso.domain.SpaceGroup;
import gr.abiss.calipso.domain.SpaceRole;
import gr.abiss.calipso.domain.User;
import gr.abiss.calipso.util.BreadCrumbUtils;
import gr.abiss.calipso.util.SpaceUtils;
import gr.abiss.calipso.wicket.components.formfields.HumanTimeDurationTextField;
import gr.abiss.calipso.wicket.components.validators.UniqueSpaceGroupNameForEachAdminValidator;
import gr.abiss.calipso.wicket.components.validators.ValidationUtils;
import gr.abiss.calipso.wicket.form.AbstractSpaceform;
import gr.abiss.calipso.wicket.space.panel.SpacePanelLanguageSupport;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.commons.collections.MapUtils;
import org.apache.log4j.Logger;
import org.apache.wicket.Application;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.extensions.breadcrumb.IBreadCrumbModel;
import org.apache.wicket.extensions.breadcrumb.panel.BreadCrumbPanel;
import org.apache.wicket.extensions.breadcrumb.panel.IBreadCrumbPanelFactory;
import org.apache.wicket.extensions.yui.calendar.DateTimeField;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.CheckBox;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.IChoiceRenderer;
import org.apache.wicket.markup.html.form.SimpleFormComponentLabel;
import org.apache.wicket.markup.html.form.TextArea;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.validation.IValidatable;
import org.apache.wicket.validation.validator.AbstractValidator;

/**
 * space edit form Space form when creating new space
 */
public class SpaceFormPanel extends BasePanel {

    private static final long serialVersionUID = 1L;
    protected static final Logger logger = Logger.getLogger(SpaceFormPanel.class);
    private String spaceName = null;
    private final boolean isEdit;

    @Override
    public String getTitle() {
        if (isEdit)
            return localize("space_form.titleEdit", spaceName);
        else
            return localize("space_form.titleCreate");
    }

    public SpaceFormPanel(String id, final IBreadCrumbModel breadCrumbModel) {
        super(id, breadCrumbModel);

        isEdit = false;

        Space space = new Space();

        getBackLinkPanel().makeCancel();
        setHighlightOnPreviousPage(space.getId());
        deleteLink(null);// new Space, hides delete link

        add(new SpaceForm("form", space));
    }

    public SpaceFormPanel(String id, final IBreadCrumbModel breadCrumbModel, Space space) {
        super(id, breadCrumbModel);

        spaceName = space.getName();
        isEdit = spaceName != null;
        getBackLinkPanel().makeCancel();
        setHighlightOnPreviousPage(space.getId());
        deleteLink(space);

        add(new SpaceForm("form", space));
    }

    private void setHighlightOnPreviousPage(long selectedSpaceId) {
        // get previous page. We use the active one as the previous because
        // when this page is created it's not yet activated.
        BreadCrumbPanel previous = (BreadCrumbPanel) getBreadCrumbModel().getActive();

        if (previous instanceof SpaceListPanel) {
            ((SpaceListPanel) previous).setSelectedSpaceId(selectedSpaceId);
        }
    }

    private void deleteLink(final Space space) {
        boolean canBeDeleted = Boolean.parseBoolean(
                ((CalipsoApplication) Application.get()).getCalipsoPropertyValue("allow.delete.item")) && isEdit;
        if (!canBeDeleted) {
            add(new WebMarkupContainer("delete").setVisible(false));
        } else {
            add(new Link("delete") {
                @Override
                public void onClick() {
                    final String heading = localize("space_delete.confirm");
                    final String warning = localize("space_delete.line3");
                    final String line1 = localize("space_delete.line1");
                    final String line2 = localize("space_delete.line2");

                    activate(new IBreadCrumbPanelFactory() {
                        @Override
                        public BreadCrumbPanel create(String componentId, final IBreadCrumbModel breadCrumbModel) {
                            ConfirmPanel confirm = new ConfirmPanel(componentId, breadCrumbModel, heading, warning,
                                    new String[] { line1, line2 }) {
                                @Override
                                public void onConfirm() {
                                    // TODO: Should remove spaceGroup reference?
                                    getCalipso().removeSpace(space);

                                    // logged in user may have been allocated to
                                    // this space
                                    SpaceFormPanel.this.refreshPrincipal();

                                    BreadCrumbUtils.removePreviousBreadCrumbPanel(breadCrumbModel);

                                    activate(new IBreadCrumbPanelFactory() {
                                        @Override
                                        public BreadCrumbPanel create(String componentId,
                                                IBreadCrumbModel breadCrumbModel) {
                                            return (BreadCrumbPanel) breadCrumbModel.getActive();
                                        }
                                    });
                                }
                            };

                            return confirm;
                        }
                    });// activate
                }// onclick
            });// add, new Link
        }
    }

    /**
     * wicket form
     */
    private class SpaceForm extends AbstractSpaceform {

        private Space copyFrom;
        private DropDownChoice spaceGroupChoice;
        WebMarkupContainer spaceGroupDetailsContainer;
        WebMarkupContainer spaceGroupDetails;

        private CalipsoFeedbackMessageFilter filter;

        public Space getCopyFrom() {
            return copyFrom;
        }

        public void setCopyFrom(Space copyFrom) {
            this.copyFrom = copyFrom;
        }

        @SuppressWarnings("serial")
        public SpaceForm(String id, final Space space) {

            super(id, space);

            FeedbackPanel feedback = new FeedbackPanel("feedback");
            filter = new CalipsoFeedbackMessageFilter();
            feedback.setFilter(filter);
            add(feedback);

            final CompoundPropertyModel model = new CompoundPropertyModel(this);
            setModel(model);

            // display name ====================================================
            /*final TextField name = new TextField("space.name");
            name.setRequired(true);
            name.add(new ErrorHighlighter());
            name.setOutputMarkupId(true);
            add(name);
            add(new HeaderContributor(new IHeaderContributor() {
               public void renderHead(IHeaderResponse response) {
                  response.renderOnLoadJavaScript("document.getElementById('"
                 + name.getMarkupId() + "').focus()");
               }
            }));
            // form label
            name.setLabel(new ResourceModel("space_form.displayName"));
            add(new SimpleFormComponentLabel("nameLabel", name));
            */
            if (MapUtils.isEmpty(space.getNameTranslations())) {
                space.setNameTranslations(getCalipso().getNameTranslations(space));
            }
            add(new ListView<Language>("nameTranslations", space.getSupportedLanguages()) {

                @Override
                protected void populateItem(ListItem<Language> listItem) {
                    Language language = listItem.getModelObject();
                    TextField description = new TextField("name");
                    // name translations are required.
                    description.setRequired(true);
                    description.add(new ErrorHighlighter());
                    listItem.add(description);
                    description.setModel(model.bind("space.nameTranslations[" + language.getId() + "]"));
                    // form label for name
                    description.setLabel(new ResourceModel("language." + language.getId()));
                    listItem.add(new SimpleFormComponentLabel("languageLabel", description));
                }
            }.setReuseItems(true));

            // prefix Code =====================================================
            TextField prefixCode = new TextField("space.prefixCode");
            prefixCode.setRequired(true);
            prefixCode.add(new ErrorHighlighter());
            // validation: greater than 3 chars?
            prefixCode.add(new AbstractValidator() {
                @Override
                protected void onValidate(IValidatable v) {
                    String s = (String) v.getValue();
                    if (s.length() < 3) {
                        error(v);
                    }
                }

                @Override
                protected String resourceKey() {
                    return "space_form.error.prefixCode.tooShort";
                }
            });
            prefixCode.add(new AbstractValidator() {
                @Override
                protected void onValidate(IValidatable v) {
                    String s = (String) v.getValue();
                    if (s.length() > 10) {
                        error(v);
                    }
                }

                @Override
                protected String resourceKey() {
                    return "space_form.error.prefixCode.tooLong";
                }
            });
            // validation: format ok?
            prefixCode.add(new AbstractValidator() {
                @Override
                protected void onValidate(IValidatable v) {
                    String s = (String) v.getValue();
                    if (!ValidationUtils.isAllUpperCase(s)) {
                        error(v);
                    }
                }

                @Override
                protected String resourceKey() {
                    return "space_form.error.prefixCode.invalid";
                }
            });
            // validation: does space already exist with same prefixCode ?
            prefixCode.add(new AbstractValidator() {
                @Override
                protected void onValidate(IValidatable v) {
                    String s = (String) v.getValue();
                    Space temp = getCalipso().loadSpace(s);
                    if (temp != null && temp.getId() != space.getId()) {
                        error(v);
                    }
                }

                @Override
                protected String resourceKey() {
                    return "space_form.error.prefixCode.exists";
                }
            });
            add(prefixCode);

            // form label
            prefixCode.setLabel(new ResourceModel("space_form.spaceKey"));
            add(new SimpleFormComponentLabel("prefixCodeLabel", prefixCode));

            // description =====================================================
            TextArea description = new TextArea("space.description");
            add(description.setRequired(true));
            // form label
            description.setLabel(new ResourceModel("space_form.description"));
            add(new SimpleFormComponentLabel("descriptionLabel", description));

            // enable item titles
            CheckBox itemSummaryEnabledCheckbox = new CheckBox("space.itemSummaryEnabled");
            add(itemSummaryEnabledCheckbox);
            itemSummaryEnabledCheckbox.setLabel(new ResourceModel("space_form.itemSummaryEnabled"));
            add(new SimpleFormComponentLabel("itemSummaryEnabledLabel", itemSummaryEnabledCheckbox));

            // is  template?
            CheckBox isTemplateCheckbox = new CheckBox("space.isTemplate");
            add(isTemplateCheckbox);
            isTemplateCheckbox.setLabel(new ResourceModel("space_form.isTemplate"));
            add(new SimpleFormComponentLabel("isTemplateLabel", isTemplateCheckbox));

            // space item duration
            HumanTimeDurationTextField defaultDuration = new HumanTimeDurationTextField("space.defaultDuration");
            add(defaultDuration);
            // space item duration label
            defaultDuration.setLabel(new ResourceModel("space_state_form.defaultDuration"));
            add(new SimpleFormComponentLabel("defaultDurationLabel", defaultDuration));

            // space closing date
            DateTimeField closingDate = new DateTimeField("space.closingDate");

            //DateField.newDateTextField("space.closingDate", new PropertyModel(SpaceForm.this,"space.closingDate"));
            //               new DateField("space.closingDate") {
            //
            //            @Override
            //            protected String getDateFormat() {
            //               return Metadata.YYYY_MM_DD_HH_MM;
            //            }
            //
            //         };
            add(closingDate);
            // space closing date label
            closingDate.setLabel(new ResourceModel("closingDate"));
            add(new SimpleFormComponentLabel("closingDateLabel", closingDate));

            // Item Visibility allowed ===================================================
            DropDownChoice itemVisibilityChoice = new DropDownChoice("space.itemVisibility",
                    new PropertyModel(SpaceForm.this, "space.itemVisibility"), Space.ITEM_VISIBILITY_MODES_LIST,
                    new IChoiceRenderer() {

                        @Override
                        public Object getDisplayValue(Object object) {
                            return localize("space_form.itemVisibility." + object.toString());
                        }

                        @Override
                        public String getIdValue(Object object, int index) {
                            return index + "";
                        }

                    });
            itemVisibilityChoice.setNullValid(false);
            itemVisibilityChoice.setRequired(true);
            // set label for the drop down
            itemVisibilityChoice.setLabel(new ResourceModel("space_form.itemVisibility"));
            add(itemVisibilityChoice);
            // add space group choice label
            add(new SimpleFormComponentLabel("spaceItemVisibilityChoiceLabel", itemVisibilityChoice));
            // integration with assets =========================================
            DropDownChoice assetVisibilityChoice = new DropDownChoice("space.assetVisibility",
                    new PropertyModel(SpaceForm.this, "space.assetVisibility"), Space.ASSET_VISIBILITY_MODES_LIST,
                    new IChoiceRenderer() {

                        @Override
                        public Object getDisplayValue(Object object) {
                            return localize("space_form.assetVisibility." + object.toString());
                        }

                        @Override
                        public String getIdValue(Object object, int index) {
                            return index + "";
                        }

                    });
            assetVisibilityChoice.setNullValid(false);
            assetVisibilityChoice.setRequired(true);
            // set label for the drop down
            assetVisibilityChoice.setLabel(new ResourceModel("space_form.assetVisibility"));
            add(assetVisibilityChoice);
            // add space group choice label
            add(new SimpleFormComponentLabel("spaceAssetVisibilityChoiceLabel", assetVisibilityChoice));

            // SpaceGroup =========================================
            // get all space groups that the user has created
            // TODO: add Other
            final Set<SpaceGroup> spaceGroups = getCalipso().getSpaceGroupsForUser(getPrincipal().getId());

            spaceGroupDetailsContainer = new WebMarkupContainer("spaceGroupDetailsContainer");
            add(spaceGroupDetailsContainer.setOutputMarkupId(true));
            spaceGroups.add(new SpaceGroup());

            spaceGroupChoice = getSpaceGroupChoice(spaceGroups);
            spaceGroupDetailsContainer.add(spaceGroupChoice);
            // add space group choice label
            spaceGroupDetailsContainer.add(new SimpleFormComponentLabel("spaceGroupChoiceLabel", spaceGroupChoice));
            // TODO: reomve items that are already added
            spaceGroupDetails = getSpaceGroupDetailsContainer(false);
            spaceGroupDetailsContainer.add(spaceGroupDetails);

            add(new Button("back") {
                @Override
                public void onSubmit() {

                    activate(new IBreadCrumbPanelFactory() {

                        private static final long serialVersionUID = 1L;

                        @Override
                        public BreadCrumbPanel create(String componentId, IBreadCrumbModel breadCrumbModel) {
                            BreadCrumbUtils.removePreviousBreadCrumbPanel(breadCrumbModel);
                            return new SpacePanelLanguageSupport(componentId, breadCrumbModel, space);
                        }
                    });
                }
            }.setDefaultFormProcessing(false));

            add(new Button("apply") {
                @Override
                public void onSubmit() {
                    final Space mergedSpace = persistChanges();
                    activate(new IBreadCrumbPanelFactory() {
                        @Override
                        public BreadCrumbPanel create(String id, IBreadCrumbModel breadCrumbModel) {
                            BreadCrumbUtils.removePreviousBreadCrumbPanel(breadCrumbModel);
                            return new SpaceFormPanel(id, breadCrumbModel, mergedSpace);
                        }
                    });
                }
            }.setVisible(false));

            add(new Button("next") {
                /* (non-Javadoc)
                 * @see org.apache.wicket.markup.html.form.Button#onSubmit()
                 */
                @Override
                public void onSubmit() {
                    // update name based on translations
                    // TODO: asset <-> item plugins still depend on this
                    // but this should be covered by CalipsoServiceImpl now
                    // space.setName(space.getNameTranslations().get(space.getSupportedLanguages().get(0).getId()));
                    //logger.debug("next clicked, space roles: "+space.getSpaceRoles());
                    CalipsoService calipso = getCalipso();
                    if (copyFrom != null && !space.getPublished()) {
                        space.setSpaceRoles(new HashSet<SpaceRole>());
                        Space spaceFrom = calipso.loadSpace(copyFrom.getId());
                        SpaceUtils.copySpace(calipso, spaceFrom, SpaceForm.this.getSpace());
                        logger.debug("Space roles: " + space.getSpaceRoles());
                    }
                    if (space.getSpaceGroup() != null && space.getSpaceGroup().getId() == null) {
                        space.getSpaceGroup().getAdmins().add(getPrincipal());
                    }
                    activate(new IBreadCrumbPanelFactory() {
                        @Override
                        public BreadCrumbPanel create(String componentId, IBreadCrumbModel breadCrumbModel) {
                            return new SpaceFieldListPanel(componentId, breadCrumbModel, space, null);
                        }
                    });
                }
            });

            // TODO: choice Renderer

            // hide copy from option if edit ===================================

            WebMarkupContainer hide = new WebMarkupContainer("hide");
            if (space.getPublished()) {
                hide.setVisible(false);
            } else {
                User user = getPrincipal();
                List<Space> spaces;
                // if space admin, only allow 
                if (user.isGlobalAdmin()) {
                    spaces = getCalipso().findAllTemplateSpaces();
                } else {
                    spaces = user.getTemplateSpacesForUser();
                }

                DropDownChoice choice = new DropDownChoice("copyFrom", spaces, new IChoiceRenderer() {
                    @Override
                    public Object getDisplayValue(Object o) {
                        Space space = (Space) o;
                        return new StringBuffer(
                                space.getSpaceGroup() != null ? space.getSpaceGroup().getName() : "").append(": ")
                                        .append(localize(space.getNameTranslationResourceKey()));
                    }

                    @Override
                    public String getIdValue(Object o, int i) {
                        return ((Space) o).getId() + "";
                    }
                });
                choice.setNullValid(true);
                hide.add(choice);
                //form label 
                choice.setLabel(new ResourceModel("space_form.copyExisting"));
                hide.add(new SimpleFormComponentLabel("copyFromLabel", choice));
            }
            add(hide);
        }

        private DropDownChoice getSpaceGroupChoice(Set<SpaceGroup> spaceGroups) {
            // add other to the list, REFACTOR
            IChoiceRenderer spaceGroupRenderer = new IChoiceRenderer() {

                @Override
                public Object getDisplayValue(Object object) {

                    SpaceGroup sg = (SpaceGroup) object;
                    if (sg.getId() == null) {
                        return localize("space_form.createNewSpaceGroup");
                    }
                    return sg.getName();
                }

                @Override
                public String getIdValue(Object object, int index) {
                    return String.valueOf(index);
                }

            };
            final DropDownChoice spaceGroupChoice = new DropDownChoice("space.spaceGroup",
                    new PropertyModel(this.getSpace(), "spaceGroup"), new ArrayList(spaceGroups),
                    spaceGroupRenderer);/* {
                                            
                                        @Override
                                        public boolean wantOnSelectionChangedNotifications() {
                                        return true;
                                        }
                                            
                                        public void onSelectionChanged(Object newSelection) {
                                        SpaceGroup tmpSpaceGroup = (SpaceGroup) newSelection;
                                        setModelObject(newSelection);
                                            
                                        if (newSelection != null && tmpSpaceGroup.getId() == null) {
                                        spaceGroupDetails.setVisible(true);
                                        } else {
                                        spaceGroupDetails.setVisible(false);
                                        }
                                        }
                                        };*/
            spaceGroupChoice.add(new AjaxFormComponentUpdatingBehavior("onchange") {
                @Override
                protected void onUpdate(AjaxRequestTarget target) {
                    //SpaceGroup tmpSpaceGroup = (SpaceGroup) newSelection;
                    //setModelObject(newSelection);
                    SpaceGroup sg = (SpaceGroup) spaceGroupChoice.getModelObject();
                    //logger.debug("Selected space group: "+sg);
                    if (sg != null && sg.getId() == null) {
                        spaceGroupDetails = SpaceForm.this.getSpaceGroupDetailsContainer(true);
                        SpaceForm.this.spaceGroupDetailsContainer.replace(spaceGroupDetails);
                        //logger.debug("spaceGroupDetails is visible..."+spaceGroupDetails.isVisible());
                    } else {
                        spaceGroupDetails.setVisible(false);
                    }
                    target.addComponent(SpaceForm.this.spaceGroupDetailsContainer);
                }
            });

            spaceGroupChoice.setEnabled(this.getSpace().getSpaceGroup() == null);
            spaceGroupChoice.setNullValid(false);
            spaceGroupChoice.setRequired(true);

            // set label for the drop down
            spaceGroupChoice.setLabel(new ResourceModel("space_form.spaceGroupChoice"));
            return spaceGroupChoice;
        }

        /**
         * @param listOfAllSpaceGroups
         */
        private WebMarkupContainer getSpaceGroupDetailsContainer(boolean visible) {
            WebMarkupContainer spaceGroupDetails = new WebMarkupContainer("spaceGroupDetails");
            spaceGroupDetails.setOutputMarkupId(true);
            spaceGroupDetails.setRenderBodyOnly(false);
            spaceGroupDetails.setVisible(visible);

            boolean isRequiredValue = (spaceGroupChoice != null && spaceGroupChoice.getModelObject() != null
                    && ((SpaceGroup) spaceGroupChoice.getModelObject()).getId() == null);

            // space group name component
            TextField spaceGroupName = new TextField("space.spaceGroup.name",
                    new PropertyModel(SpaceForm.this, "space.spaceGroup.name"));
            spaceGroupName.setRequired(isRequiredValue);
            // set space group name label
            spaceGroupName.setLabel(new ResourceModel("space_form.spaceGroupName"));
            // add validation to check unique space group name
            if (visible) {
                spaceGroupName.add(new UniqueSpaceGroupNameForEachAdminValidator(
                        getCalipso().getSpaceGroupsForUser(getPrincipal().getId())));
            }
            // space group description component
            TextArea spaceGroupDescription = new TextArea("space.spaceGroup.description",
                    new PropertyModel(SpaceForm.this, "space.spaceGroup.description"));
            spaceGroupDescription.setLabel(new ResourceModel("space_form.spaceGroupDescription"));

            spaceGroupDescription.setRequired(isRequiredValue);
            // add space group name component
            spaceGroupDetails.add(spaceGroupName);
            // add space group name label
            spaceGroupDetails.add(new SimpleFormComponentLabel("spaceGroupNameLabel", spaceGroupName));
            // add space group description component         
            spaceGroupDetails.add(spaceGroupDescription);
            // add space group description label
            spaceGroupDetails
                    .add(new SimpleFormComponentLabel("spaceGroupDescriptionLabel", spaceGroupDescription));
            return spaceGroupDetails;
        }

        /*
              @Override
              protected void validate() {
                 filter.reset();
                 super.validate();
              }
        */
        @Override
        protected void onSubmit() {
        }

        private Space persistChanges() {
            Space space = this.getSpace();

            space = getCalipso().storeSpace(space);
            // current user may be allocated to this space, and e.g.
            // name could have changed
            refreshPrincipal();
            return space;
        }
    }
}