Java tutorial
/* * The contents of this file are subject to the Mozilla Public License * Version 1.1 (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.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the * License for the specific language governing rights and limitations * under the License. * * The Original Code is "stereotyped" (http://code.google.com/p/stereotyped). * * The Initial Developer of the Original Code is Richard Nichols. * Portions created by Richard Nichols are Copyright (C) 2010 * Richard Nichols. All Rights Reserved. * * Alternatively, the contents of this file may be used under the terms * of the GNU Public License (the "GPL"), in which case the * provisions of GPL License are applicable instead of those * above. If you wish to allow use of your version of this file only * under the terms of the GPL and not to allow others to use * your version of this file under the MPL, indicate your decision by * deleting the provisions above and replace them with the notice and * other provisions required by the GPL. If you do not delete * the provisions above, a recipient may use your version of this file * under either the MPL or the GPL License. */ package com.visural.stereotyped.ui; import com.google.common.collect.Sets; import com.google.inject.Inject; import com.visural.common.StringUtil; import com.visural.stereotyped.core.Stereotype; import com.visural.stereotyped.ui.base.IconReference; import com.visural.stereotyped.ui.base.IconReference.Icon; import com.visural.stereotyped.ui.base.LoggedInPage; import com.visural.stereotyped.ui.components.CheckBox; import com.visural.stereotyped.ui.components.DropDown; import com.visural.stereotyped.ui.model.StereotypeUIMetaData; import com.visural.stereotyped.ui.model.UserListType; import com.visural.stereotyped.ui.prototype.PrototypeEditor; import com.visural.stereotyped.ui.service.SessionService; import com.visural.stereotyped.ui.service.StereotypeService; import com.visural.stereotyped.ui.service.UserService; import com.visural.wicket.component.dropdown.DropDownDataSource; import com.visural.wicket.component.submitters.IndicateModalSubmitLink; import com.visural.wicket.component.submitters.IndicateRefreshAjaxLink; import com.visural.wicket.util.PageParamFactory; import com.visural.wicket.util.WrapCollectionToModelCollection; import java.io.Serializable; import java.lang.reflect.Constructor; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.wicket.Component; import org.apache.wicket.PageParameters; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormSubmitBehavior; import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.behavior.SimpleAttributeModifier; import org.apache.wicket.markup.ComponentTag; import org.apache.wicket.markup.MarkupStream; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.RequiredTextField; import org.apache.wicket.markup.html.image.Image; import org.apache.wicket.markup.html.link.BookmarkablePageLink; import org.apache.wicket.markup.html.panel.FeedbackPanel; import org.apache.wicket.markup.repeater.Item; import org.apache.wicket.markup.repeater.RefreshingView; import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.CompoundPropertyModel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; public class LandingPage extends LoggedInPage { public static final String ARCHIVE_TAG = "#archived"; @Inject StereotypeService service; @Inject SessionService sessionService; @Inject UserService userService; private final List<Class> stereotypes; private final NewModel newModel = new NewModel(); private WebMarkupContainer tagWrap; private IgnoreForm ignoreForm; private PreviewStatePreviewDialog previewStateDialog; private UUID selected; public LandingPage(PageParameters params) { super(params); stereotypes = service.getStereotypes(); add(new FeedbackPanel("feedback")); IModel<UUID> selectedModel = new IModel<UUID>() { public UUID getObject() { if (selected != null && service.read(selected) != null) { return selected; } else { return null; } } public void setObject(UUID object) { selected = object; } public void detach() { } }; final StereotypeManagePanel manage = new StereotypeManagePanel("recordDetails", selectedModel); add(manage); add(new StereotypeListPanel("recentlySaved", new Model("Recently Saved Files"), new AbstractReadOnlyModel<List<UUID>>() { @Override public List<UUID> getObject() { return userService.getUser(userService.getCurrentUser()).getUserLists() .get(UserListType.RECENTLY_SAVED); } }, manage)); add(new StereotypeListPanel("recentlyViewed", new Model("Recently Viewed Files"), new AbstractReadOnlyModel<List<UUID>>() { @Override public List<UUID> getObject() { return userService.getUser(userService.getCurrentUser()).getUserLists() .get(UserListType.RECENTLY_VIEWED); } }, manage)); add(new NewForm("newForm")); add(ignoreForm = new IgnoreForm("ignoreForm")); tagWrap = new WebMarkupContainer("tagWrap"); tagWrap.setOutputMarkupId(true); add(tagWrap); final RefreshingView<String> tags = new RefreshingView<String>("tag") { @Override protected Iterator<IModel<String>> getItemModels() { List<String> tags = new ArrayList<String>(); tags.addAll(service.listAllByTag(sessionService.getSessionBean().isShowFilesFromOtherUsers(), sessionService.getSessionBean().isShowArchived()).keySet()); Collections.sort(tags); return WrapCollectionToModelCollection.get(tags).iterator(); } @Override protected void populateItem(Item<String> item) { final String tag = item.getModelObject(); final boolean isIgnored = Sets .newHashSet(sessionService.getSessionBean().getIgnoreTags().split(" ")).contains(tag); item.setOutputMarkupId(true); item.add(new AjaxLink("title") { @Override public void onClick(AjaxRequestTarget target) { Set<String> tags = Sets .newHashSet(sessionService.getSessionBean().getIgnoreTags().split(" ")); if (isIgnored) { tags.remove(tag); } else { tags.add(tag); } sessionService.getSessionBean().setIgnoreTags(StringUtil.delimitObjectsToString(" ", tags)); target.addComponent(tagWrap); } @Override protected void onComponentTagBody(MarkupStream markupStream, ComponentTag openTag) { replaceComponentTagBody(markupStream, openTag, tag); } }); RefreshingView<UUID> loadList = new RefreshingView<UUID>("itemRow") { @Override protected Iterator<IModel<UUID>> getItemModels() { List<UUID> items = new ArrayList<UUID>(); items.addAll( service.listAllByTag(sessionService.getSessionBean().isShowFilesFromOtherUsers(), sessionService.getSessionBean().isShowArchived()).get(tag)); Collections.sort(items, new Comparator<UUID>() { public int compare(UUID o1, UUID o2) { return service.read(o1).getName().compareTo(service.read(o2).getName()); } }); return WrapCollectionToModelCollection.get(items).iterator(); } @Override protected void populateItem(final Item<UUID> item) { item.setOutputMarkupId(true); Stereotype st = service.read(item.getModelObject()); final String stName = st.getName(); final AjaxLink desc = new AjaxLink("itemOpen") { @Override public void onClick(AjaxRequestTarget target) { manage.select(target, item.getModelObject()); } }; desc.add(new Image("icon", new IconReference(Icon.PROPERTIES))); item.add(desc); StereotypeUIMetaData meta = service.readUIMeta(item.getModelObject()); String userDesc = meta.getOwner() .equals(sessionService.getSessionBean().getLoggedInUsername()) ? "" : "(" + meta.getOwner() + ")"; item.add(new Label("userDesc", userDesc)); WebMarkupContainer previewButton; if (service.read(item.getModelObject()).getPreviewStates().isEmpty()) { previewButton = new WebMarkupContainer("preview"); previewButton.add(new SimpleAttributeModifier("href", "preview/" + StringUtil.urlEncode(item.getModelObject().toString()) + "/")); item.add(previewButton); } else { item.add(previewButton = new AjaxLink("preview") { @Override public void onClick(AjaxRequestTarget target) { previewStateDialog.open(target, item.getModelObject()); } }); } previewButton.add(new Image("icon", new IconReference(Icon.PREVIEW))); item.add(new BookmarkablePageLink("itemDesc", PrototypeEditor.class, new PageParameters(StdParam.LOAD_ID + "=" + item.getModelObject())) { @Override protected void onComponentTagBody(MarkupStream markupStream, ComponentTag openTag) { replaceComponentTagBody(markupStream, openTag, StringUtil.htmlEscape(stName)); } }); } }; if (!isIgnored) { item.add(loadList); } else { item.add(new WebMarkupContainer("itemRow").setVisible(false)); } } }; tagWrap.add(tags); add(previewStateDialog = new PreviewStatePreviewDialog("previewStateDialog")); } @Override public String getPageTitle() { return "Index"; } class NewForm extends Form { public NewForm(String id) { super(id); this.setDefaultModel(new CompoundPropertyModel(newModel)); add(new RequiredTextField("newName")); add(new DropDown("newType", new DropDownDataSource<Class>() { public String getName() { return "stereotypes"; } public List<Class> getValues() { return stereotypes; } public String getDescriptionForValue(Class clazz) { return clazz.getSimpleName(); } }, true)); add(new IndicateModalSubmitLink("create")); } @Override protected void onSubmit() { Constructor[] cons = newModel.getNewType().getConstructors(); for (Constructor con : cons) { if (con.getParameterTypes().length == 1 && con.getParameterTypes()[0].equals(String.class)) { try { Stereotype type = (Stereotype) con.newInstance(newModel.getNewName()); service.write(type); setResponsePage(PrototypeEditor.class, PageParamFactory.get(StdParam.LOAD_ID, type.getUuid().toString())); newModel.setNewName(""); newModel.setNewType(null); } catch (Throwable ex) { Logger.getLogger(LandingPage.class.getName()).log(Level.SEVERE, null, ex); error(ex.getMessage()); } return; } } throw new IllegalStateException("Unable to find suitable constructor."); } } class NewModel implements Serializable { private Class newType; private String newName; public String getNewName() { return newName; } public void setNewName(String newName) { this.newName = newName; } public Class getNewType() { return newType; } public void setNewType(Class newType) { this.newType = newType; } } class IgnoreForm extends Form { public IgnoreForm(String id) { super(id); final WebMarkupContainer indicator = new WebMarkupContainer("indicator"); indicator.setOutputMarkupId(true); add(indicator); add(new IndicateRefreshAjaxLink("expandAll") { @Override public void onClick(AjaxRequestTarget target) { userService.includeAllTags(); target.addComponent(tagWrap); } @Override protected Collection<? extends Component> getIndicateRefreshContainers() { return Arrays.asList(indicator); } }); add(new IndicateRefreshAjaxLink("collapseAll") { @Override protected Collection<? extends Component> getIndicateRefreshContainers() { return Arrays.asList(indicator); } @Override public void onClick(AjaxRequestTarget target) { userService.ignoreAllTags(); target.addComponent(tagWrap); } }); add(new CheckBox("showOthers", new IModel() { public Object getObject() { return sessionService.getSessionBean().isShowFilesFromOtherUsers(); } public void setObject(Object object) { sessionService.getSessionBean() .setShowFilesFromOtherUsers(StringUtil.parseBoolean(object.toString())); } public void detach() { } }).add(new AjaxFormSubmitBehavior("onchange") { @Override protected void onSubmit(AjaxRequestTarget target) { target.addComponent(tagWrap); } @Override protected void onError(AjaxRequestTarget target) { target.addComponent(tagWrap); } })); add(new CheckBox("showArchived", new IModel() { public Object getObject() { return sessionService.getSessionBean().isShowArchived(); } public void setObject(Object object) { sessionService.getSessionBean().setShowArchived(StringUtil.parseBoolean(object.toString())); } public void detach() { } }).add(new AjaxFormSubmitBehavior("onchange") { @Override protected void onSubmit(AjaxRequestTarget target) { target.addComponent(tagWrap); } @Override protected void onError(AjaxRequestTarget target) { target.addComponent(tagWrap); } })); } } }