Java tutorial
/* * 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); } }