org.headsupdev.agile.app.issues.ViewIssue.java Source code

Java tutorial

Introduction

Here is the source code for org.headsupdev.agile.app.issues.ViewIssue.java

Source

/*
 * HeadsUp Agile
 * Copyright 2009-2014 Heads Up Development Ltd.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package org.headsupdev.agile.app.issues;

import org.apache.wicket.PageParameters;
import org.apache.wicket.ResourceReference;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxFallbackLink;
import org.apache.wicket.markup.html.CSSPackageResource;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.image.Image;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.link.DownloadLink;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.headsupdev.agile.api.Manager;
import org.headsupdev.agile.api.MenuLink;
import org.headsupdev.agile.api.Permission;
import org.headsupdev.agile.api.User;
import org.headsupdev.agile.api.mime.Mime;
import org.headsupdev.agile.app.issues.permission.IssueEditPermission;
import org.headsupdev.agile.app.issues.permission.IssueViewPermission;
import org.headsupdev.agile.storage.Attachment;
import org.headsupdev.agile.storage.Comment;
import org.headsupdev.agile.storage.HibernateStorage;
import org.headsupdev.agile.storage.StoredProject;
import org.headsupdev.agile.storage.issues.Issue;
import org.headsupdev.agile.storage.resource.DurationWorked;
import org.headsupdev.agile.web.*;
import org.headsupdev.agile.web.components.*;
import org.headsupdev.agile.web.components.issues.IssueListPanel;
import org.headsupdev.agile.web.dialogs.ConfirmDialog;
import org.hibernate.Session;
import org.hibernate.Transaction;

import java.io.File;
import java.io.Serializable;
import java.util.*;

/**
 * Issue view page
 *
 * @author Andrew Williams
 * @version $Id$
 * @since 1.0
 */
@MountPoint("view")
public class ViewIssue extends HeadsUpPage {
    private long issueId;
    private Issue issue;
    private boolean watching;
    private IssuePanel issuePanel;

    public Permission getRequiredPermission() {
        return new IssueViewPermission();
    }

    public void layout() {
        super.layout();
        add(CSSPackageResource.getHeaderContribution(getClass(), "issue.css"));
        add(CSSPackageResource.getHeaderContribution(IssueListPanel.class, "issue.css"));

        if (!IdPatternValidator.isValidId(getPageParameters().getString("id"))) {
            userError("Invalid issue id");
            return;
        }

        issueId = getPageParameters().getLong("id");
        issue = IssuesApplication.getIssue(issueId, getProject());
        if (issue == null) {
            notFoundError();
            return;
        }

        watching = issue.getWatchers().contains(getSession().getUser());
        List<MenuLink> links = getLinks(issue);
        if (issue.getStatus() < Issue.STATUS_CLOSED) {
            links.add(1, new MenuLink() {
                public String getLabel() {
                    if (watching) {
                        return "unwatch";
                    }

                    return "watch";
                }

                public void onClick() {
                    toggleWatching();
                }
            });
        }
        addLinks(links);
        issuePanel = new IssuePanel("issue", issue);
        add(issuePanel);

        final List<Attachment> attachmentList = new LinkedList<Attachment>();
        attachmentList.addAll(issue.getAttachments());
        Collections.sort(attachmentList, new Comparator<Attachment>() {
            public int compare(Attachment attachment1, Attachment attachment2) {
                return attachment1.getCreated().compareTo(attachment2.getCreated());
            }
        });
        add(new ListView<Attachment>("attachments", attachmentList) {

            private Attachment attachment;

            protected void populateItem(ListItem<Attachment> listItem) {
                attachment = listItem.getModelObject();
                PageParameters params = new PageParameters();
                listItem.add(new GravatarLinkPanel("avatar", attachment.getUser(),
                        HeadsUpPage.DEFAULT_AVATAR_EDGE_LENGTH));
                params.add("username", attachment.getUser().getUsername());
                params.add("silent", "true");
                BookmarkablePageLink usernameLink = new BookmarkablePageLink("usernameLink",
                        ViewIssue.this.getPageClass("account"), params);
                usernameLink.add(new Label("username", attachment.getUser().getFullnameOrUsername()));
                listItem.add(usernameLink);
                listItem.add(new Label("created", new FormattedDateModel(attachment.getCreated(),
                        ((HeadsUpSession) getSession()).getTimeZone())));

                final File file = attachment.getFile(getStorage());
                Mime mime = Mime.get(file.getName());
                listItem.add(new Image("attachment-icon", new ResourceReference(Mime.class, mime.getIconName())));

                listItem.add(new EmbeddedFilePanel("embed", attachment.getFile(getStorage()), getProject()));

                Link download = new DownloadLink("attachment-link", file);
                download.add(new Label("attachment-label", attachment.getFilename()));
                listItem.add(download);
                User currentUser = ((HeadsUpSession) getSession()).getUser();
                listItem.add(new AjaxFallbackLink("attachment-delete") {
                    @Override
                    public void onClick(AjaxRequestTarget ajaxRequestTarget) {
                        ConfirmDialog dialog = new ConfirmDialog(HeadsUpPage.DIALOG_PANEL_ID, "Delete Attachment",
                                "delete this attachment") {
                            @Override
                            public void onDialogConfirmed() {
                                attachment = (Attachment) ((HibernateStorage) getStorage()).getHibernateSession()
                                        .merge(attachment);
                                issue = (Issue) ((HibernateStorage) getStorage()).getHibernateSession()
                                        .merge(issue);
                                attachmentList.remove(attachment);
                                issue.getAttachments().remove(attachment);
                                ((HibernateStorage) getStorage()).delete(attachment);
                                attachment.getFile(getStorage()).delete();
                            }
                        };
                        showDialog(dialog, ajaxRequestTarget);
                    }
                }.setVisible(Manager.getSecurityInstance().userHasPermission(currentUser, new IssueEditPermission(),
                        getProject())));
                Comment comment = attachment.getComment();
                if (comment != null) {
                    Label commentLabel = new Label("comment",
                            new MarkedUpTextModel(comment.getComment(), getProject()));
                    commentLabel.setEscapeModelStrings(false);
                    listItem.add(commentLabel);
                } else {
                    listItem.add(new WebMarkupContainer("comment").setVisible(false));
                }
            }
        });

        final List commentList = new LinkedList();
        commentList.addAll(issue.getComments());
        if (issue.getTimeWorked() != null && Boolean.parseBoolean(
                issue.getProject().getConfigurationValue(StoredProject.CONFIGURATION_TIMETRACKING_ENABLED))) {
            commentList.addAll(issue.getTimeWorked());
        }

        Collections.sort(commentList, new Comparator() {
            public int compare(Object o1, Object o2) {
                Date date1 = null, date2 = null;
                if (o1 instanceof Comment) {
                    date1 = ((Comment) o1).getCreated();
                } else if (o1 instanceof DurationWorked) {
                    date1 = ((DurationWorked) o1).getDay();
                }

                if (o2 instanceof Comment) {
                    date2 = ((Comment) o2).getCreated();
                } else if (o2 instanceof DurationWorked) {
                    date2 = ((DurationWorked) o2).getDay();
                }

                if (date1 == null || date2 == null) {
                    if (date1 == null) {
                        if (date2 == null) {
                            return 0;
                        } else {
                            return 1;
                        }
                    } else {
                        return -1;
                    }
                }

                return date1.compareTo(date2);
            }
        });
        add(new ListView<Serializable>("comments", commentList) {
            protected void populateItem(final ListItem listItem) {
                IssueCommentPanel panel = new IssueCommentPanel("comment", listItem.getModel(), getProject(),
                        commentList, issue) {
                    @Override
                    public void showConfirmDialog(ConfirmDialog dialog, AjaxRequestTarget target) {
                        showDialog(dialog, target);
                    }

                    @Override
                    public Link getEditLink() {
                        PageParameters params = new PageParameters();
                        params.put("project", getProject());
                        params.put("id", issue.getId());
                        params.put("commentId", getComment().getId());
                        return new BookmarkablePageLink("editComment", EditComment.class, params);
                    }
                };
                listItem.add(panel);
            }
        });
    }

    @Override
    public String getPageTitle() {
        return "Issue:" + issueId + PAGE_TITLE_SEPARATOR + super.getPageTitle();
    }

    public static List<MenuLink> getLinks(Issue issue) {
        List<MenuLink> links = new LinkedList<MenuLink>();
        PageParameters pageParams = new PageParameters();
        pageParams.add("project", issue.getProject().getId());
        pageParams.add("id", String.valueOf(issue.getId()));

        if (issue.getStatus() < Issue.STATUS_CLOSED) {
            links.add(new BookmarkableMenuLink(RenderUtil.getPageClass("issues/edit"), pageParams, "edit"));
            links.add(new BookmarkableMenuLink(RenderUtil.getPageClass("issues/comment"), pageParams, "comment"));
            links.add(new BookmarkableMenuLink(RenderUtil.getPageClass("issues/attach"), pageParams, "attach"));
            links.add(new BookmarkableMenuLink(RenderUtil.getPageClass("issues/relate"), pageParams, "relate"));

            links.add(new BookmarkableMenuLink(RenderUtil.getPageClass("issues/assign"), pageParams, "assign"));

            if (issue.getStatus() < Issue.STATUS_RESOLVED) {
                if (Boolean.parseBoolean(issue.getProject()
                        .getConfigurationValue(StoredProject.CONFIGURATION_TIMETRACKING_ENABLED))) {
                    links.add(new BookmarkableMenuLink(RenderUtil.getPageClass("issues/progress"), pageParams,
                            "progress"));
                }
                links.add(
                        new BookmarkableMenuLink(RenderUtil.getPageClass("issues/resolve"), pageParams, "resolve"));
            } else {
                links.add(new BookmarkableMenuLink(RenderUtil.getPageClass("issues/reopen"), pageParams,
                        "unresolve"));
            }

            links.add(new BookmarkableMenuLink(RenderUtil.getPageClass("issues/close"), pageParams, "close"));
        } else {
            links.add(new BookmarkableMenuLink(RenderUtil.getPageClass("issues/reopen"), pageParams, "reopen"));
        }

        return links;
    }

    void toggleWatching() {
        if (watching) {
            issue.getWatchers().remove(getSession().getUser());
        } else {
            issue.getWatchers().add(getSession().getUser());
        }

        Session session = ((HibernateStorage) Manager.getStorageInstance()).getHibernateSession();
        Transaction tx = session.beginTransaction();
        session.update(issue);
        tx.commit();
        setResponsePage(ApplicationPageMapper.get().getPageClass("issues/view"), getPageParameters());
        watching = !watching;
    }
}