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

Java tutorial

Introduction

Here is the source code for com.visural.stereotyped.ui.LandingPage.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.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);
                }
            }));

        }

    }
}