com.visural.stereotyped.ui.StereotypeManagePanel.java Source code

Java tutorial

Introduction

Here is the source code for com.visural.stereotyped.ui.StereotypeManagePanel.java

Source

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