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.inject.Inject; import com.visural.common.StringUtil; import com.visural.stereotyped.ui.admin.EditMetaPage; import com.visural.stereotyped.ui.base.BasePage; import com.visural.stereotyped.ui.components.SecureAjaxLink; import com.visural.stereotyped.ui.model.StereotypeUIMetaData; import com.visural.stereotyped.ui.prototype.PrototypeEditor; import com.visural.stereotyped.ui.service.StereotypeService; import com.visural.stereotyped.ui.service.UserService; import com.visural.wicket.component.confirmer.ConfirmerLink; import com.visural.wicket.security.IPrivilege; import com.visural.wicket.security.components.SecureWebMarkupContainer; import com.visural.wicket.util.WrapCollectionToModelCollection; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.UUID; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.wicket.PageParameters; import org.apache.wicket.ResourceReference; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.markup.ComponentTag; 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.form.SubmitLink; import org.apache.wicket.markup.html.image.Image; import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.markup.html.panel.Panel; 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.IModel; import org.apache.wicket.model.Model; /** * @version $Id$ * @author Visural */ public class StereotypeManagePanel extends Panel { @Inject UserService userService; @Inject StereotypeService service; private PreviewStatePreviewDialog previewStateDialog; private final IModel<UUID> stereotype; public StereotypeManagePanel(String id, IModel<UUID> st) { super(id); this.stereotype = st; setOutputMarkupId(true); WebMarkupContainer wrap = new WebMarkupContainer("wrap") { @Override public boolean isVisible() { return stereotype.getObject() != null; } }; add(wrap); add(previewStateDialog = new PreviewStatePreviewDialog("previewStateDialog")); final Label desc = new Label("itemDesc", new AbstractReadOnlyModel() { @Override public Object getObject() { return service.read(stereotype.getObject()).getName(); } }); wrap.add(desc); wrap.add(new Label("userDesc", new AbstractReadOnlyModel() { @Override public Object getObject() { StereotypeUIMetaData meta = service.readUIMeta(stereotype.getObject()); return meta.getOwner().equals(userService.getCurrentUser()) ? "" : "(" + meta.getOwner() + ")"; } })); WebMarkupContainer previewSingle = new WebMarkupContainer("previewSingle") { @Override public boolean isVisible() { return false; //return service.read(stereotype.getObject()).getPreviewStates().isEmpty(); } @Override protected void onComponentTag(ComponentTag tag) { super.onComponentTag(tag); tag.put("href", "preview/" + StringUtil.urlEncode(stereotype.getObject().toString()) + "/"); tag.put("target", stereotype.getObject().toString()); } }; previewSingle.add(new Image("icon", new ResourceReference(BasePage.class, "eye--arrow.png"))); wrap.add(previewSingle); WebMarkupContainer previewMulti = new AjaxLink("previewMulti") { @Override public boolean isVisible() { return false; //return !service.read(stereotype.getObject()).getPreviewStates().isEmpty(); } @Override public void onClick(AjaxRequestTarget target) { previewStateDialog.open(target, stereotype.getObject()); } }; previewMulti.add(new Image("icon", new ResourceReference(BasePage.class, "eye--arrow.png"))); wrap.add(previewMulti); wrap.add(new WebMarkupContainer("itemOpen") { @Override protected void onComponentTag(ComponentTag tag) { super.onComponentTag(tag); tag.put("href", urlFor(PrototypeEditor.class, new PageParameters(StdParam.LOAD_ID + "=" + stereotype.getObject())).toString()); } }.setVisible(false)); wrap.add(new SecureWebMarkupContainer("itemAccess") { @Override public IPrivilege getRenderPrivilege() { return Privilege.currentUserHasWriteAccess(stereotype.getObject()); } @Override protected void onComponentTag(ComponentTag tag) { super.onComponentTag(tag); tag.put("href", urlFor(EditMetaPage.class, new PageParameters(StdParam.LOAD_ID + "=" + stereotype.getObject())).toString()); } }); wrap.add(new AjaxLink("itemCopy") { @Override public void onClick(AjaxRequestTarget target) { service.copy(stereotype.getObject()); setResponsePage(LandingPage.class); } }); final RenameForm renameForm = new RenameForm(); wrap.add(renameForm); wrap.add(new SecureAjaxLink("itemRename") { @Override public boolean isVisible() { return Privilege.currentUserHasWriteAccess(stereotype.getObject()) .isGrantedToClient(userService.getUser(userService.getCurrentUser())); } @Override public void onClick(AjaxRequestTarget target) { renameForm.show(stereotype.getObject(), service.read(stereotype.getObject()).getName()); desc.setVisible(false); target.addComponent(StereotypeManagePanel.this); } }); wrap.add(new ConfirmerLink("itemArchive") { @Override public boolean isVisible() { return Privilege.currentUserHasWriteAccess(stereotype.getObject()) .isGrantedToClient(userService.getUser(userService.getCurrentUser())); } @Override public String getMessageContentHTML() { return "Are you sure you want to archive '" + service.read(stereotype.getObject()).getName() + "'?"; } @Override public String getOkButtonLabel() { return "Yes"; } @Override public String getCancelButtonLabel() { return "No"; } @Override public void onClick() { StereotypeUIMetaData meta = service.readUIMeta(stereotype.getObject()); meta.getTags().add(StereotypeUIMetaData.ARCHIVE_TAG); service.writeUIMeta(stereotype.getObject(), meta); } }); wrap.add(new ConfirmerLink("itemDelete") { @Override public boolean isVisible() { return Privilege.currentUserHasWriteAccess(stereotype.getObject()) .isGrantedToClient(userService.getUser(userService.getCurrentUser())); } @Override public String getMessageContentHTML() { return "Are you sure you want to delete '" + service.read(stereotype.getObject()).getName() + "'?"; } @Override public String getOkButtonLabel() { return "Yes"; } @Override public String getCancelButtonLabel() { return "No"; } @Override public void onClick() { service.archive(stereotype.getObject()); } }); wrap.add(new RefreshingView<String>("groups") { @Override protected Iterator<IModel<String>> getItemModels() { List<String> all = new ArrayList<String>(); if (stereotype.getObject() != null) { StereotypeUIMetaData meta = service.readUIMeta(stereotype.getObject()); for (String g : meta.getEditGroups()) { all.add("Group - " + g + " (edit)"); } for (String g : meta.getEditUsers()) { all.add("User - " + g + " (edit)"); } for (String g : meta.getViewGroups()) { all.add("Group - " + g + " (view)"); } for (String g : meta.getViewUsers()) { all.add("User - " + g + " (view)"); } } if (all.isEmpty()) { all.add("Private (owner only)"); } return WrapCollectionToModelCollection.get(all).iterator(); } @Override protected void populateItem(final Item<String> item) { item.add(new Label("group", item.getModelObject())); } }); } public void select(AjaxRequestTarget target, UUID uuid) { target.addComponent(this); stereotype.setObject(uuid); } class RenameForm extends Form { private Model name = new Model(""); private String currentName = ""; private UUID id = null; public RenameForm() { super("renameForm"); add(new RequiredTextField("newName", name)); add(new SubmitLink("ok")); add(new Link("cancel") { @Override public void onClick() { setResponsePage(LandingPage.class); } }); setVisible(false); } private List<String> getTags(String name) { Pattern tag = Pattern.compile("#\\S+"); List<String> tags = new ArrayList<String>(); Matcher m = tag.matcher(name); while (m.find()) { tags.add(m.group()); } return tags; } private String removeTags(String name) { return name.replaceAll("#\\S+", ""); } private String addTags(String name, UUID id) { StereotypeUIMetaData meta = service.readUIMeta(id); return name + " " + StringUtil.delimitObjectsToString(" ", meta.getTags()); } @Override protected void onSubmit() { try { StereotypeUIMetaData meta = service.readUIMeta(id); meta.getTags().clear(); meta.getTags().addAll(getTags(name.getObject().toString())); service.writeUIMeta(id, meta); String newName = removeTags(name.getObject().toString()); service.rename(id, newName); setResponsePage(LandingPage.class); } catch (Throwable t) { error(t.getMessage()); } } public void show(UUID id, String currentName) { this.currentName = currentName; this.id = id; name.setObject(addTags(currentName, id)); setVisible(true); } }; }