Java tutorial
/* * Copyright 2011 Marcus Geiger. * * 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 org.antbear.jee.wicket.guestbook.web; import org.antbear.jee.wicket.guestbook.model.Entry; import org.antbear.jee.wicket.guestbook.model.Guestbook; import org.antbear.jee.wicket.guestbook.persistence.GuestbookService; import org.apache.wicket.PageParameters; import org.apache.wicket.RestartResponseAtInterceptPageException; import org.apache.wicket.datetime.markup.html.basic.DateLabel; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.link.ExternalLink; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.PropertyListView; import org.apache.wicket.model.CompoundPropertyModel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.spring.injection.annot.SpringBean; /** * View and add entries to a guestbook. * * @author Marcus Geiger */ public class ViewGuestbook extends WebPage { private static final long serialVersionUID = 1L; public static final String PAGE_PARAM_GUESTBOOK_ID = "guestbook"; @SpringBean private GuestbookService guestbookService; /** * The guestbook id, initialiazied by given page parameters. * @see #ViewGuestbook(org.apache.wicket.PageParameters) */ private final Long guestbookId; // The model gets refreshed when an entry has been added to the guestbook private IModel<Guestbook> guestbookModel; // The entry list view gets a refreshed model when an entry has been added to the guestbook private PropertyListView<Entry> entryListView; // Don't provide default ctor, because we need the guestbook to be viewed. public ViewGuestbook(final PageParameters parameters) { super(parameters); if (null == (this.guestbookId = parameters.getAsLong(PAGE_PARAM_GUESTBOOK_ID))) throw new RestartResponseAtInterceptPageException(HomePage.class); } @Override protected void onInitialize() { super.onInitialize(); if (guestbookId == null) throw new IllegalStateException("Invariant not fullfilled: guestbookId"); this.guestbookModel = new CompoundPropertyModel<Guestbook>(guestbookService.find(guestbookId)); WebMarkupContainer wrapper = new WebMarkupContainer("wrapper", guestbookModel); add(wrapper); wrapper.add(new Label("name1", new PropertyModel<String>(guestbookModel, "name")).setRenderBodyOnly(true)); wrapper.add(new Label("name2", new PropertyModel<String>(guestbookModel, "name")).setRenderBodyOnly(true)); this.entryListView = new PropertyListView<Entry>("entries", guestbookModel.getObject().getEntries()) { private static final long serialVersionUID = 1L; @Override protected void populateItem(ListItem<Entry> item) { item.add(new Label("authorName").setRenderBodyOnly(true)); item.add(DateLabel.forShortStyle("creationDate").setRenderBodyOnly(true)); PropertyModel<String> emailModel = new PropertyModel<String>(item.getDefaultModelObject(), "authorEmail"); ExternalLink emailLink = new ExternalLink("authorEmail", "mailto:" + emailModel.getObject()); emailLink.add(new Label("authorEmailText", emailModel).setRenderBodyOnly(true)); item.add(emailLink); item.add(new Label("text").setRenderBodyOnly(true)); } }; entryListView.setRenderBodyOnly(true); wrapper.add(entryListView); AddEntryPanel addEntryPanel = new AddEntryPanel("addEntryPanel", guestbookId); // Get notified when an entry has been added to the guestbook addEntryPanel.setEntrySubmitObserver(new AddEntryPanel.EntrySubmitObserver() { private static final long serialVersionUID = 1L; @Override public void entrySubmitted() { reloadModel(); } }); wrapper.add(addEntryPanel); } private void reloadModel() { guestbookModel = new CompoundPropertyModel<Guestbook>(guestbookService.find(guestbookId)); entryListView.setModelObject(guestbookModel.getObject().getEntries()); } }