net.lunikon.rethul.web.pages.ProjectPage.java Source code

Java tutorial

Introduction

Here is the source code for net.lunikon.rethul.web.pages.ProjectPage.java

Source

/*
 * Copyright (c) 2011 by Martin Simons.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */
package net.lunikon.rethul.web.pages;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Locale;

import net.lunikon.rethul.data.ProjectDAO;
import net.lunikon.rethul.model.File;
import net.lunikon.rethul.model.Project;
import net.lunikon.rethul.model.ProjectLocale;
import net.lunikon.rethul.model.User;
import net.lunikon.rethul.service.FileService;
import net.lunikon.rethul.service.ProjectService;
import net.lunikon.rethul.service.ServiceException;
import net.lunikon.rethul.util.LocaleComparator;
import net.lunikon.rethul.web.RethulRequestCycle;
import net.lunikon.rethul.web.auth.IAuthenticatedPage;
import net.lunikon.rethul.web.choice.LocaleChoiceRenderer;
import net.lunikon.rethul.web.components.FileListingPanel;

import org.apache.wicket.PageParameters;
import org.apache.wicket.Session;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.DropDownChoice;
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.list.ListItem;
import org.apache.wicket.markup.html.list.PropertyListView;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.apache.wicket.validation.validator.PatternValidator;
import org.apache.wicket.validation.validator.StringValidator;

/**
 * Homepage
 */
public class ProjectPage extends BasePage implements IAuthenticatedPage {
    /**
     * The NAME_PARAM.
     */
    public static final String NAME_PARAM = "show";

    /**
     * The projectDAO.
     */
    @SpringBean
    protected ProjectDAO projectDAO;

    /**
     * The projectService.
     */
    @SpringBean
    protected ProjectService projectService;

    /**
     * The fileService.
     */
    @SpringBean
    protected FileService fileService;

    /**
     * The name.
     */
    private String name;

    /**
     * Constructor.
     * 
     * @param parameters
     *            Page parameters
     */
    public ProjectPage(final PageParameters parameters) {
        name = parameters.getString(NAME_PARAM, "");

        buildProject();
    }

    private IModel<Project> projectModel;

    protected void buildProject() {
        projectModel = new LoadableDetachableModel<Project>() {
            @Override
            protected Project load() {
                return projectDAO.getByName(name);
            }
        };

        WebMarkupContainer project = new WebMarkupContainer("project",
                new CompoundPropertyModel<Project>(projectModel)) {
            @Override
            public boolean isVisible() {
                return getDefaultModelObject() != null;
            }
        };
        add(project);

        project.add(new Label("name"));

        addActivatedLanguages(project);
        addAddLanguage(project);

        addAddFile(project);

        // file listing in a seperate Panel
        // expected to grow quite a bit
        project.add(new FileListingPanel("files", projectModel));
    }

    private IModel<List<ProjectLocale>> activatedLocalesModel;

    private void addActivatedLanguages(WebMarkupContainer container) {
        activatedLocalesModel = new LoadableDetachableModel<List<ProjectLocale>>() {
            @Override
            protected List<ProjectLocale> load() {
                Project project = projectModel.getObject();
                return projectDAO.getProjectLocales(project);
            }
        };

        container.add(new PropertyListView<ProjectLocale>("locales", activatedLocalesModel) {
            @Override
            protected void populateItem(final ListItem<ProjectLocale> item) {
                item.add(new Label("name", new AbstractReadOnlyModel<String>() {
                    @Override
                    public String getObject() {
                        Locale userLocale = Session.get().getLocale();
                        return item.getModelObject().getLocale().getDisplayName(userLocale);
                    }
                }));
            }
        });
    }

    private void addAddLanguage(WebMarkupContainer container) {
        final IModel<List<Locale>> localesModel = new LoadableDetachableModel<List<Locale>>() {
            @Override
            protected List<Locale> load() {
                Locale[] raw = ProjectLocale.getAvailableLocales();
                Locale userLocale = Session.get().getLocale();

                List<Locale> result = Arrays.asList(raw);
                Collections.sort(result, new LocaleComparator(userLocale));

                return result;
            }
        };
        final IModel<Locale> localeModel = new Model<Locale>();

        Form<Void> form = new Form<Void>("addLanguage-form") {
            @Override
            protected void onSubmit() {
                Project project = projectModel.getObject();
                Locale locale = localeModel.getObject();
                if (projectService.addLanguage(project, locale))
                    info(getString("ProjectLocale.add.success"));
            }

            @Override
            public boolean isVisible() {
                return RethulRequestCycle.get().isUserRole(User.ROLE_MANAGER);
            }
        };
        container.add(form);

        DropDownChoice<Locale> locales = new DropDownChoice<Locale>("locale", localeModel, localesModel);
        locales.setChoiceRenderer(new LocaleChoiceRenderer());
        locales.setNullValid(false);
        locales.setRequired(true);
        form.add(locales);
    }

    private void addAddFile(WebMarkupContainer container) {
        final IModel<String> nameModel = new Model<String>();
        Form<Void> form = new Form<Void>("addFile-form") {
            @Override
            protected void onSubmit() {
                try {
                    Project project = projectModel.getObject();

                    String name = nameModel.getObject();
                    fileService.create(project, name);

                    getSession().info(getString("File.create.success"));
                } catch (ServiceException e) {
                    error(getString(e.getKey()));
                }
            }

            @Override
            public boolean isVisible() {
                return RethulRequestCycle.get().isUserRole(User.ROLE_MANAGER);
            }
        };
        container.add(form);

        TextField<String> name = new RequiredTextField<String>("name", nameModel);
        name.add(StringValidator.lengthBetween(1, 255));
        name.add(new PatternValidator(File.FILENAME_PATTERN));
        form.add(name);
    }
}