Example usage for org.apache.wicket RestartResponseException RestartResponseException

List of usage examples for org.apache.wicket RestartResponseException RestartResponseException

Introduction

In this page you can find the example usage for org.apache.wicket RestartResponseException RestartResponseException.

Prototype

public RestartResponseException(final IPageProvider pageProvider, final RedirectPolicy redirectPolicy) 

Source Link

Document

Redirects to the page provided by the passed pageProvider using the explicit redirectPolicy

Usage

From source file:com.danhaywood.isis.wicket.fullcalendar.collectioncontents.FullCalendarWithEventHandling.java

License:Apache License

@Override
protected void onEventClicked(ClickedEvent event, CalendarResponse response) {

    final String oidStr = (String) event.getEvent().getPayload();
    final RootOid oid = RootOidDefault.deString(oidStr, IsisContext.getOidMarshaller());
    final ObjectAdapter adapter = IsisContext.getPersistenceSession().getAdapterManager().adapterFor(oid);
    final PageParameters params = new EntityModel(adapter).asPageParameters();
    throw new RestartResponseException(EntityPage.class, params);
}

From source file:com.evolveum.midpoint.web.page.self.PageAccountActivation.java

License:Apache License

private void propagatePassword(AjaxRequestTarget target, Form<?> form) {

    List<ShadowType> shadowsToActivate = getShadowsToActivate();

    PasswordTextField passwordPanel = (PasswordTextField) form.get(createComponentPath(ID_PASSWORD));
    String value = passwordPanel.getModelObject();

    ConnectionEnvironment connEnv = ConnectionEnvironment.create(SchemaConstants.CHANNEL_GUI_USER_URI);
    UsernamePasswordAuthenticationToken token;
    try {/*from  ww w  .ja  va2s  . c  o m*/
        token = authenticationEvaluator.authenticate(connEnv,
                new PasswordAuthenticationContext(userModel.getObject().getName().getOrig(), value));
    } catch (Exception ex) {
        LOGGER.error("Failed to authenticate user, reason {}", ex.getMessage());
        getSession().error(getString("PageAccountActivation.authentication.failed"));
        throw new RestartResponseException(PageAccountActivation.class, getPageParameters());
    }
    if (token == null) {
        LOGGER.error("Failed to authenticate user");
        getSession().error(getString("PageAccountActivation.authentication.failed"));
        throw new RestartResponseException(PageAccountActivation.class, getPageParameters());
    }
    ProtectedStringType passwordValue = new ProtectedStringType();
    passwordValue.setClearValue(value);

    Collection<ObjectDelta<ShadowType>> passwordDeltas = new ArrayList<>(shadowsToActivate.size());
    for (ShadowType shadow : shadowsToActivate) {
        ObjectDelta<ShadowType> shadowDelta = getPrismContext().deltaFactory().object()
                .createModificationReplaceProperty(ShadowType.class, shadow.getOid(),
                        SchemaConstants.PATH_PASSWORD_VALUE, passwordValue);
        shadowDelta.addModificationReplaceProperty(ShadowType.F_LIFECYCLE_STATE,
                SchemaConstants.LIFECYCLE_PROPOSED);
        passwordDeltas.add(shadowDelta);
    }

    OperationResult result = runPrivileged(new Producer<OperationResult>() {
        private static final long serialVersionUID = 1L;

        @Override
        public OperationResult run() {
            OperationResult result = new OperationResult(OPERATION_ACTIVATE_SHADOWS);
            Task task = createAnonymousTask(OPERATION_ACTIVATE_SHADOWS);
            WebModelServiceUtils.save((Collection) passwordDeltas, null, result, task,
                    PageAccountActivation.this);
            return result;
        }
    });

    result.recomputeStatus();

    if (!result.isSuccess()) {
        getSession().error(getString("PageAccountActivation.account.activation.failed"));
        LOGGER.error("Failed to acitvate accounts, reason: {} ", result.getMessage());
        target.add(getFeedbackPanel());
    } else {
        getSession().success(getString("PageAccountActivation.account.activation.successful"));
        target.add(getFeedbackPanel());
        activated = true;
    }

    target.add(PageAccountActivation.this);

}

From source file:com.gitblit.wicket.pages.BlobPage.java

License:Apache License

public BlobPage(PageParameters params) {
    super(params);

    Repository r = getRepository();/*w w  w  .j a  v a2  s  .  c  o m*/
    final String blobPath = WicketUtils.getPath(params);
    String[] encodings = getEncodings();

    if (StringUtils.isEmpty(objectId) && StringUtils.isEmpty(blobPath)) {
        throw new RestartResponseException(TreePage.class, WicketUtils.newRepositoryParameter(repositoryName));
    }

    if (StringUtils.isEmpty(blobPath)) {
        // blob by objectid

        add(new BookmarkablePageLink<Void>("blameLink", BlamePage.class,
                WicketUtils.newPathParameter(repositoryName, objectId, blobPath)).setEnabled(false));
        add(new BookmarkablePageLink<Void>("historyLink", HistoryPage.class).setEnabled(false));
        String rawUrl = RawServlet.asLink(getContextUrl(), repositoryName, objectId, blobPath);
        add(new ExternalLink("rawLink", rawUrl));
        add(new CommitHeaderPanel("commitHeader", objectId));
        add(new PathBreadcrumbsPanel("breadcrumbs", repositoryName, blobPath, objectId));
        Component c = new Label("blobText", JGitUtils.getStringContent(r, objectId, encodings));
        WicketUtils.setCssClass(c, "plainprint");
        add(c);
    } else {
        // standard blob view
        String extension = null;
        if (blobPath.lastIndexOf('.') > -1) {
            extension = blobPath.substring(blobPath.lastIndexOf('.') + 1).toLowerCase();
        }

        // see if we should redirect to the doc page
        MarkupProcessor processor = new MarkupProcessor(app().settings(), app().xssFilter());
        for (String ext : processor.getMarkupExtensions()) {
            if (ext.equals(extension)) {
                setResponsePage(DocPage.class, params);
                return;
            }
        }

        RevCommit commit = getCommit();

        // blob page links
        add(new BookmarkablePageLink<Void>("blameLink", BlamePage.class,
                WicketUtils.newPathParameter(repositoryName, objectId, blobPath)));
        add(new BookmarkablePageLink<Void>("historyLink", HistoryPage.class,
                WicketUtils.newPathParameter(repositoryName, objectId, blobPath)));
        String rawUrl = RawServlet.asLink(getContextUrl(), repositoryName, objectId, blobPath);
        add(new ExternalLink("rawLink", rawUrl));

        add(new CommitHeaderPanel("commitHeader", repositoryName, commit));

        add(new PathBreadcrumbsPanel("breadcrumbs", repositoryName, blobPath, objectId));

        // Map the extensions to types
        Map<String, Integer> map = new HashMap<String, Integer>();
        for (String ext : app().settings().getStrings(Keys.web.prettyPrintExtensions)) {
            map.put(ext.toLowerCase(), 1);
        }
        for (String ext : app().settings().getStrings(Keys.web.imageExtensions)) {
            map.put(ext.toLowerCase(), 2);
        }
        for (String ext : app().settings().getStrings(Keys.web.binaryExtensions)) {
            map.put(ext.toLowerCase(), 3);
        }

        if (extension != null) {
            int type = 0;
            if (map.containsKey(extension)) {
                type = map.get(extension);
            }
            switch (type) {
            case 2:
                // image blobs
                add(new Label("blobText").setVisible(false));
                add(new ExternalImage("blobImage", rawUrl));
                break;
            case 3:
                // binary blobs
                add(new Label("blobText", "Binary File"));
                add(new Image("blobImage", "blobImage").setVisible(false));
                break;
            default:
                // plain text
                String source = JGitUtils.getStringContent(r, commit.getTree(), blobPath, encodings);
                String table;
                if (source == null) {
                    table = missingBlob(blobPath, commit);
                } else {
                    table = generateSourceView(source, extension, type == 1);
                    addBottomScriptInline("jQuery(prettyPrint);");
                }
                add(new Label("blobText", table).setEscapeModelStrings(false));
                add(new Image("blobImage", "blobImage").setVisible(false));
                fileExtension = extension;
            }
        } else {
            // plain text
            String source = JGitUtils.getStringContent(r, commit.getTree(), blobPath, encodings);
            String table;
            if (source == null) {
                table = missingBlob(blobPath, commit);
            } else {
                table = generateSourceView(source, null, false);
                addBottomScriptInline("jQuery(prettyPrint);");
            }
            add(new Label("blobText", table).setEscapeModelStrings(false));
            add(new Image("blobImage", "blobImage").setVisible(false));
        }
    }
}

From source file:com.gitblit.wicket.pages.EditMilestonePage.java

License:Apache License

public EditMilestonePage(PageParameters params) {
    super(params);

    RepositoryModel model = getRepositoryModel();
    if (!app().tickets().isAcceptingTicketUpdates(model)) {
        // ticket service is read-only
        throw new RestartResponseException(TicketsPage.class,
                WicketUtils.newOpenTicketsParameter(repositoryName));
    }//from   w w  w.  j ava2s .co m

    UserModel currentUser = GitBlitWebSession.get().getUser();
    if (currentUser == null) {
        currentUser = UserModel.ANONYMOUS;
    }

    if (!currentUser.isAuthenticated || !currentUser.canAdmin(model)) {
        // administration prohibited
        throw new RestartResponseException(TicketsPage.class,
                WicketUtils.newOpenTicketsParameter(repositoryName));
    }

    oldName = WicketUtils.getObject(params);
    if (StringUtils.isEmpty(oldName)) {
        // milestone not specified
        throw new RestartResponseException(TicketsPage.class,
                WicketUtils.newOpenTicketsParameter(repositoryName));
    }

    TicketMilestone tm = app().tickets().getMilestone(getRepositoryModel(), oldName);
    if (tm == null) {
        // milestone does not exist
        throw new RestartResponseException(TicketsPage.class,
                WicketUtils.newOpenTicketsParameter(repositoryName));
    }

    setStatelessHint(false);
    setOutputMarkupId(true);

    Form<Void> form = new Form<Void>("editForm");
    add(form);

    nameModel = Model.of(tm.name);
    dueModel = Model.of(tm.due);
    statusModel = Model.of(tm.status);
    notificationModel = Model.of(true);

    form.add(new TextField<String>("name", nameModel));
    form.add(new Html5DateField("due", dueModel, "yyyy-MM-dd"));
    form.add(new Label("dueFormat", "yyyy-MM-dd"));
    form.add(new CheckBox("notify", notificationModel));
    addBottomScriptInline(
            "{var e=document.createElement('input');e.type='date';if(e.type=='date'){$('[name=\"due\"]~.help-inline').hide()}}");
    addBottomScript("scripts/wicketHtml5Patch.js");

    List<Status> statusChoices = Arrays.asList(Status.Open, Status.Closed);
    form.add(new DropDownChoice<TicketModel.Status>("status", statusModel, statusChoices));

    form.add(new AjaxButton("save") {

        private static final long serialVersionUID = 1L;

        @Override
        protected void onSubmit(AjaxRequestTarget target) {
            String name = nameModel.getObject();
            if (StringUtils.isEmpty(name)) {
                return;
            }

            Date due = dueModel.getObject();
            Status status = statusModel.getObject();
            boolean rename = !name.equals(oldName);
            boolean notify = notificationModel.getObject();

            UserModel currentUser = GitBlitWebSession.get().getUser();
            String createdBy = currentUser.username;

            TicketMilestone tm = app().tickets().getMilestone(getRepositoryModel(), oldName);
            tm.setName(name);
            tm.setDue(due);
            tm.status = status;

            boolean success = true;
            if (rename) {
                success = app().tickets().renameMilestone(getRepositoryModel(), oldName, name, createdBy,
                        notify);
            }

            if (success && app().tickets().updateMilestone(getRepositoryModel(), tm, createdBy)) {
                redirectTo(TicketsPage.class, WicketUtils.newOpenTicketsParameter(repositoryName));
            } else {
                // TODO error
            }
        }
    });
    Button cancel = new Button("cancel") {
        private static final long serialVersionUID = 1L;

        @Override
        public void onSubmit() {
            setResponsePage(TicketsPage.class, WicketUtils.newOpenTicketsParameter(repositoryName));
        }
    };
    cancel.setDefaultFormProcessing(false);
    form.add(cancel);

    Link<Void> delete = new Link<Void>("delete") {

        private static final long serialVersionUID = 1L;

        @Override
        public void onClick() {
            UserModel currentUser = GitBlitWebSession.get().getUser();
            String createdBy = currentUser.username;
            boolean notify = notificationModel.getObject();

            if (app().tickets().deleteMilestone(getRepositoryModel(), oldName, createdBy, notify)) {
                setResponsePage(TicketsPage.class, WicketUtils.newOpenTicketsParameter(repositoryName));
            } else {
                error(MessageFormat.format(getString("gb.milestoneDeleteFailed"), oldName));
            }
        }
    };

    delete.add(new JavascriptEventConfirmation("click",
            MessageFormat.format(getString("gb.deleteMilestone"), oldName)));

    form.add(delete);
}

From source file:com.gitblit.wicket.pages.NewMilestonePage.java

License:Apache License

public NewMilestonePage(PageParameters params) {
    super(params);

    RepositoryModel model = getRepositoryModel();
    if (!app().tickets().isAcceptingTicketUpdates(model)) {
        // ticket service is read-only
        throw new RestartResponseException(TicketsPage.class,
                WicketUtils.newOpenTicketsParameter(repositoryName));
    }//from  w  w  w.  j a  v  a2 s .  c  om

    UserModel currentUser = GitBlitWebSession.get().getUser();
    if (currentUser == null) {
        currentUser = UserModel.ANONYMOUS;
    }

    if (!currentUser.isAuthenticated || !currentUser.canAdmin(model)) {
        // administration prohibited
        throw new RestartResponseException(TicketsPage.class,
                WicketUtils.newOpenTicketsParameter(repositoryName));
    }

    setStatelessHint(false);
    setOutputMarkupId(true);

    Form<Void> form = new Form<Void>("editForm");
    add(form);

    nameModel = Model.of("");
    dueModel = Model.of(new Date(System.currentTimeMillis() + TimeUtils.ONEDAY));

    form.add(new TextField<String>("name", nameModel));
    form.add(new Html5DateField("due", dueModel, "yyyy-MM-dd"));
    form.add(new Label("dueFormat", "yyyy-MM-dd"));
    addBottomScriptInline(
            "{var e=document.createElement('input');e.type='date';if(e.type=='date'){$('[name=\"due\"]~.help-inline').hide()}}");
    addBottomScript("scripts/wicketHtml5Patch.js");
    form.add(new AjaxButton("create") {

        private static final long serialVersionUID = 1L;

        @Override
        protected void onSubmit(AjaxRequestTarget target) {
            String name = nameModel.getObject();
            if (StringUtils.isEmpty(name)) {
                // invalid name
                return;
            }

            TicketMilestone milestone = app().tickets().getMilestone(getRepositoryModel(), name);
            if (milestone != null) {
                // milestone already exists
                return;
            }

            Date due = dueModel.getObject();

            UserModel currentUser = GitBlitWebSession.get().getUser();
            String createdBy = currentUser.username;

            milestone = app().tickets().createMilestone(getRepositoryModel(), name, createdBy);
            if (milestone != null) {
                milestone.due = due;
                app().tickets().updateMilestone(getRepositoryModel(), milestone, createdBy);
                redirectTo(TicketsPage.class, WicketUtils.newOpenTicketsParameter(repositoryName));
            } else {
                // TODO error
            }
        }
    });

    Button cancel = new Button("cancel") {
        private static final long serialVersionUID = 1L;

        @Override
        public void onSubmit() {
            setResponsePage(TicketsPage.class, WicketUtils.newOpenTicketsParameter(repositoryName));
        }
    };
    cancel.setDefaultFormProcessing(false);
    form.add(cancel);

}

From source file:com.gitblit.wicket.pages.RepositoryPage.java

License:Apache License

public RepositoryPage(PageParameters params) {
    super(params);
    repositoryName = WicketUtils.getRepositoryName(params);
    String root = StringUtils.getFirstPathElement(repositoryName);
    if (StringUtils.isEmpty(root)) {
        projectName = app().settings().getString(Keys.web.repositoryRootGroupName, "main");
    } else {/*from ww w . j a va2 s. c  o  m*/
        projectName = root;
    }
    objectId = WicketUtils.getObject(params);

    if (StringUtils.isEmpty(repositoryName)) {
        error(MessageFormat.format(getString("gb.repositoryNotSpecifiedFor"), getPageName()), true);
    }

    if (!getRepositoryModel().hasCommits && getClass() != EmptyRepositoryPage.class) {
        throw new RestartResponseException(EmptyRepositoryPage.class, params);
    }

    if (getRepositoryModel().isCollectingGarbage) {
        error(MessageFormat.format(getString("gb.busyCollectingGarbage"), getRepositoryModel().name), true);
    }

    if (objectId != null) {
        RefModel branch = null;
        if ((branch = JGitUtils.getBranch(getRepository(), objectId)) != null) {
            UserModel user = GitBlitWebSession.get().getUser();
            if (user == null) {
                // workaround until get().getUser() is reviewed throughout the app
                user = UserModel.ANONYMOUS;
            }
            boolean canAccess = user.canView(getRepositoryModel(), branch.reference.getName());
            if (!canAccess) {
                error(getString("gb.accessDenied"), true);
            }
        }
    }

    if (!params.get(PARAM_STAR).isEmpty()) {
        // set starred state
        boolean star = params.get(PARAM_STAR).toBoolean();
        UserModel user = GitBlitWebSession.get().getUser();
        if (user != null && user.isAuthenticated) {
            UserRepositoryPreferences prefs = user.getPreferences()
                    .getRepositoryPreferences(getRepositoryModel().name);
            prefs.starred = star;
            try {
                app().gitblit().reviseUser(user.username, user);
            } catch (GitBlitException e) {
                logger.error("Failed to update user " + user.username, e);
                error(getString("gb.failedToUpdateUser"), false);
            }
        }
    }

    showAdmin = false;
    if (app().settings().getBoolean(Keys.web.authenticateAdminPages, true)) {
        boolean allowAdmin = app().settings().getBoolean(Keys.web.allowAdministration, false);
        showAdmin = allowAdmin && GitBlitWebSession.get().canAdmin();
    } else {
        showAdmin = app().settings().getBoolean(Keys.web.allowAdministration, false);
    }
    isOwner = GitBlitWebSession.get().isLoggedIn()
            && (getRepositoryModel().isOwner(GitBlitWebSession.get().getUsername()));

    // register the available navigation links for this page and user
    List<NavLink> navLinks = registerNavLinks();

    // standard navigation links
    NavigationPanel navigationPanel = new NavigationPanel("repositoryNavPanel", getRepoNavPageClass(),
            navLinks);
    add(navigationPanel);

    add(new ExternalLink("syndication", SyndicationServlet
            .asLink(GitBlitRequestUtils.getRelativePathPrefixToContextRoot(), getRepositoryName(), null, 0)));

    // add floating search form
    SearchForm searchForm = new SearchForm("searchForm", getRepositoryName());
    add(searchForm);
    searchForm.setTranslatedAttributes();

    // set stateless page preference
    setStatelessHint(true);
}

From source file:com.gitblit.wicket.pages.TicketPage.java

License:Apache License

public TicketPage(PageParameters params) {
    super(params);

    final UserModel user = GitBlitWebSession.get().getUser() == null ? UserModel.ANONYMOUS
            : GitBlitWebSession.get().getUser();
    final RepositoryModel repository = getRepositoryModel();
    final String id = WicketUtils.getObject(params);
    long ticketId = Long.parseLong(id);
    ticket = app().tickets().getTicket(repository, ticketId);

    if (ticket == null) {
        // ticket not found
        throw new RestartResponseException(TicketsPage.class,
                WicketUtils.newRepositoryParameter(repositoryName));
    }// w  w w .j  a v  a  2s  . c  o m

    final List<Change> revisions = new ArrayList<Change>();
    List<Change> comments = new ArrayList<Change>();
    List<Change> statusChanges = new ArrayList<Change>();
    List<Change> discussion = new ArrayList<Change>();
    for (Change change : ticket.changes) {
        if (change.hasComment() || (change.isStatusChange() && (change.getStatus() != Status.New))) {
            discussion.add(change);
        }
        if (change.hasComment()) {
            comments.add(change);
        }
        if (change.hasPatchset()) {
            revisions.add(change);
        }
        if (change.isStatusChange() && !change.hasPatchset()) {
            statusChanges.add(change);
        }
    }

    final Change currentRevision = revisions.isEmpty() ? null : revisions.get(revisions.size() - 1);
    final Patchset currentPatchset = ticket.getCurrentPatchset();

    /*
     * TICKET HEADER
     */
    String href = urlFor(TicketsPage.class, params).toString();
    add(new ExternalLink("ticketNumber", href, "#" + ticket.number));
    Label headerStatus = new Label("headerStatus", ticket.status.toString());
    WicketUtils.setCssClass(headerStatus, TicketsUI.getLozengeClass(ticket.status, false));
    add(headerStatus);
    add(new Label("ticketTitle", ticket.title));
    if (currentPatchset == null) {
        add(new Label("diffstat").setVisible(false));
    } else {
        // calculate the current diffstat of the patchset
        add(new DiffStatPanel("diffstat", ticket.insertions, ticket.deletions));
    }

    /*
     * TAB TITLES
     */
    add(new Label("commentCount", "" + comments.size()).setVisible(!comments.isEmpty()));
    add(new Label("commitCount", "" + (currentPatchset == null ? 0 : currentPatchset.commits))
            .setVisible(currentPatchset != null));

    /*
     * TICKET AUTHOR and DATE (DISCUSSION TAB)
     */
    UserModel createdBy = app().users().getUserModel(ticket.createdBy);
    if (createdBy == null) {
        add(new Label("whoCreated", ticket.createdBy));
    } else {
        add(new LinkPanel("whoCreated", null, createdBy.getDisplayName(), UserPage.class,
                WicketUtils.newUsernameParameter(createdBy.username)));
    }

    if (ticket.isProposal()) {
        // clearly indicate this is a change ticket
        add(new Label("creationMessage", getString("gb.proposedThisChange")));
    } else {
        // standard ticket
        add(new Label("creationMessage", getString("gb.createdThisTicket")));
    }

    String dateFormat = app().settings().getString(Keys.web.datestampLongFormat, "EEEE, MMMM d, yyyy");
    String timestampFormat = app().settings().getString(Keys.web.datetimestampLongFormat, "EEEE, MMMM d, yyyy");
    final TimeZone timezone = getTimeZone();
    final DateFormat df = new SimpleDateFormat(dateFormat);
    df.setTimeZone(timezone);
    final DateFormat tsf = new SimpleDateFormat(timestampFormat);
    tsf.setTimeZone(timezone);
    final Calendar cal = Calendar.getInstance(timezone);

    String fuzzydate;
    TimeUtils tu = getTimeUtils();
    Date createdDate = ticket.created;
    if (TimeUtils.isToday(createdDate, timezone)) {
        fuzzydate = tu.today();
    } else if (TimeUtils.isYesterday(createdDate, timezone)) {
        fuzzydate = tu.yesterday();
    } else {
        // calculate a fuzzy time ago date
        cal.setTime(createdDate);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);
        createdDate = cal.getTime();
        fuzzydate = getTimeUtils().timeAgo(createdDate);
    }
    Label when = new Label("whenCreated", fuzzydate + ", " + df.format(createdDate));
    WicketUtils.setHtmlTooltip(when, tsf.format(ticket.created));
    add(when);

    String exportHref = urlFor(ExportTicketPage.class, params).toString();
    add(new ExternalLink("exportJson", exportHref, "json"));

    /*
     * RESPONSIBLE (DISCUSSION TAB)
     */
    if (StringUtils.isEmpty(ticket.responsible)) {
        add(new Label("responsible"));
    } else {
        UserModel responsible = app().users().getUserModel(ticket.responsible);
        if (responsible == null) {
            add(new Label("responsible", ticket.responsible));
        } else {
            add(new LinkPanel("responsible", null, responsible.getDisplayName(), UserPage.class,
                    WicketUtils.newUsernameParameter(responsible.username)));
        }
    }

    /*
     * MILESTONE PROGRESS (DISCUSSION TAB)
     */
    if (StringUtils.isEmpty(ticket.milestone)) {
        add(new Label("milestone"));
    } else {
        // link to milestone query
        TicketMilestone tm = app().tickets().getMilestone(repository, ticket.milestone);
        if (tm == null) {
            tm = new TicketMilestone(ticket.milestone);
        }
        PageParameters milestoneParameters;
        if (tm.isOpen()) {
            milestoneParameters = WicketUtils.newOpenTicketsParameter(repositoryName);
        } else {
            milestoneParameters = WicketUtils.newRepositoryParameter(repositoryName);
        }
        milestoneParameters.add(Lucene.milestone.name(), ticket.milestone);
        int progress = 0;
        int open = 0;
        int closed = 0;
        if (tm != null) {
            progress = tm.getProgress();
            open = tm.getOpenTickets();
            closed = tm.getClosedTickets();
        }

        Fragment milestoneProgress = new Fragment("milestone", "milestoneProgressFragment", TicketPage.this);
        milestoneProgress
                .add(new LinkPanel("link", null, ticket.milestone, TicketsPage.class, milestoneParameters));
        Label label = new Label("progress");
        WicketUtils.setCssStyle(label, "width:" + progress + "%;");
        milestoneProgress.add(label);
        WicketUtils.setHtmlTooltip(milestoneProgress,
                MessageFormat.format(getString("gb.milestoneProgress"), open, closed));
        add(milestoneProgress);
    }

    /*
     * TICKET DESCRIPTION (DISCUSSION TAB)
     */
    String desc;
    if (StringUtils.isEmpty(ticket.body)) {
        desc = getString("gb.noDescriptionGiven");
    } else {
        String bugtraq = bugtraqProcessor().processText(getRepository(), repositoryName, ticket.body);
        String html = MarkdownUtils.transformGFM(app().settings(), bugtraq, ticket.repository);
        String safeHtml = app().xssFilter().relaxed(html);
        desc = safeHtml;
    }
    add(new Label("ticketDescription", desc).setEscapeModelStrings(false));

    /*
     * PARTICIPANTS (DISCUSSION TAB)
     */
    if (app().settings().getBoolean(Keys.web.allowGravatar, true)) {
        // gravatar allowed
        List<String> participants = ticket.getParticipants();
        add(new Label("participantsLabel",
                MessageFormat.format(
                        getString(participants.size() > 1 ? "gb.nParticipants" : "gb.oneParticipant"),
                        "<b>" + participants.size() + "</b>")).setEscapeModelStrings(false));
        ListDataProvider<String> participantsDp = new ListDataProvider<String>(participants);
        DataView<String> participantsView = new DataView<String>("participants", participantsDp) {
            private static final long serialVersionUID = 1L;

            @Override
            public void populateItem(final Item<String> item) {
                String username = item.getModelObject();
                UserModel user = app().users().getUserModel(username);
                if (user == null) {
                    user = new UserModel(username);
                }
                item.add(new AvatarImage("participant", user.getDisplayName(), user.emailAddress, null, 25,
                        true));
            }
        };
        add(participantsView);
    } else {
        // gravatar prohibited
        add(new Label("participantsLabel").setVisible(false));
        add(new Label("participants").setVisible(false));
    }

    /*
     * LARGE STATUS INDICATOR WITH ICON (DISCUSSION TAB->SIDE BAR)
     */
    Fragment ticketStatus = new Fragment("ticketStatus", "ticketStatusFragment", TicketPage.this);
    Label ticketIcon = TicketsUI.getStateIcon("ticketIcon", ticket);
    ticketStatus.add(ticketIcon);
    ticketStatus.add(new Label("ticketStatus", ticket.status.toString()));
    WicketUtils.setCssClass(ticketStatus, TicketsUI.getLozengeClass(ticket.status, false));
    add(ticketStatus);

    /*
     * UPDATE FORM (DISCUSSION TAB)
     */
    if (user.canEdit(ticket, repository) && app().tickets().isAcceptingTicketUpdates(repository)) {
        if (user.canAdmin(ticket, repository) && ticket.isOpen()) {
            /*
             * OPEN TICKET
             */
            Fragment controls = new Fragment("controls", "openControlsFragment", TicketPage.this);

            /*
             * STATUS
             */
            List<Status> choices = new ArrayList<Status>();
            if (ticket.isProposal()) {
                choices.addAll(Arrays.asList(TicketModel.Status.proposalWorkflow));
            } else if (ticket.isBug()) {
                choices.addAll(Arrays.asList(TicketModel.Status.bugWorkflow));
            } else {
                choices.addAll(Arrays.asList(TicketModel.Status.requestWorkflow));
            }
            choices.remove(ticket.status);

            ListDataProvider<Status> workflowDp = new ListDataProvider<Status>(choices);
            DataView<Status> statusView = new DataView<Status>("newStatus", workflowDp) {
                private static final long serialVersionUID = 1L;

                @Override
                public void populateItem(final Item<Status> item) {
                    SimpleAjaxLink<Status> link = new SimpleAjaxLink<Status>("link", item.getModel()) {

                        private static final long serialVersionUID = 1L;

                        @Override
                        public void onClick(AjaxRequestTarget target) {
                            Status status = getModel().getObject();
                            Change change = new Change(user.username);
                            change.setField(Field.status, status);
                            if (!ticket.isWatching(user.username)) {
                                change.watch(user.username);
                            }
                            TicketModel update = app().tickets().updateTicket(repository, ticket.number,
                                    change);
                            app().tickets().createNotifier().sendMailing(update);
                            redirectTo(TicketsPage.class, getPageParameters());
                        }
                    };
                    String css = TicketsUI.getStatusClass(item.getModel().getObject());
                    WicketUtils.setCssClass(link, css);
                    item.add(link);
                }
            };
            controls.add(statusView);

            /*
             * RESPONSIBLE LIST
             */
            Set<String> userlist = new TreeSet<String>(ticket.getParticipants());
            if (UserModel.ANONYMOUS.canPush(getRepositoryModel())
                    || AuthorizationControl.AUTHENTICATED == getRepositoryModel().authorizationControl) {
                //    authorization is ANONYMOUS or AUTHENTICATED (i.e. all users can be set responsible)
                userlist.addAll(app().users().getAllUsernames());
            } else {
                // authorization is by NAMED users (users with PUSH permission can be set responsible)
                for (RegistrantAccessPermission rp : app().repositories()
                        .getUserAccessPermissions(getRepositoryModel())) {
                    if (rp.permission.atLeast(AccessPermission.PUSH)) {
                        userlist.add(rp.registrant);
                    }
                }
            }
            List<TicketResponsible> responsibles = new ArrayList<TicketResponsible>();
            if (!StringUtils.isEmpty(ticket.responsible)) {
                // exclude the current responsible
                userlist.remove(ticket.responsible);
            }
            for (String username : userlist) {
                UserModel u = app().users().getUserModel(username);
                if (u != null) {
                    responsibles.add(new TicketResponsible(u));
                }
            }
            Collections.sort(responsibles);
            responsibles.add(new TicketResponsible(ESC_NIL, "", ""));
            ListDataProvider<TicketResponsible> responsibleDp = new ListDataProvider<TicketResponsible>(
                    responsibles);
            DataView<TicketResponsible> responsibleView = new DataView<TicketResponsible>("newResponsible",
                    responsibleDp) {
                private static final long serialVersionUID = 1L;

                @Override
                public void populateItem(final Item<TicketResponsible> item) {
                    SimpleAjaxLink<TicketResponsible> link = new SimpleAjaxLink<TicketResponsible>("link",
                            item.getModel()) {

                        private static final long serialVersionUID = 1L;

                        @Override
                        public void onClick(AjaxRequestTarget target) {
                            TicketResponsible responsible = getModel().getObject();
                            Change change = new Change(user.username);
                            change.setField(Field.responsible, responsible.username);
                            if (!StringUtils.isEmpty(responsible.username)) {
                                if (!ticket.isWatching(responsible.username)) {
                                    change.watch(responsible.username);
                                }
                            }
                            if (!ticket.isWatching(user.username)) {
                                change.watch(user.username);
                            }
                            TicketModel update = app().tickets().updateTicket(repository, ticket.number,
                                    change);
                            app().tickets().createNotifier().sendMailing(update);
                            redirectTo(TicketsPage.class, getPageParameters());
                        }
                    };
                    item.add(link);
                }
            };
            controls.add(responsibleView);

            /*
             * MILESTONE LIST
             */
            List<TicketMilestone> milestones = app().tickets().getMilestones(repository, Status.Open);
            if (!StringUtils.isEmpty(ticket.milestone)) {
                for (TicketMilestone milestone : milestones) {
                    if (milestone.name.equals(ticket.milestone)) {
                        milestones.remove(milestone);
                        break;
                    }
                }
            }
            milestones.add(new TicketMilestone(ESC_NIL));
            ListDataProvider<TicketMilestone> milestoneDp = new ListDataProvider<TicketMilestone>(milestones);
            DataView<TicketMilestone> milestoneView = new DataView<TicketMilestone>("newMilestone",
                    milestoneDp) {
                private static final long serialVersionUID = 1L;

                @Override
                public void populateItem(final Item<TicketMilestone> item) {
                    SimpleAjaxLink<TicketMilestone> link = new SimpleAjaxLink<TicketMilestone>("link",
                            item.getModel()) {

                        private static final long serialVersionUID = 1L;

                        @Override
                        public void onClick(AjaxRequestTarget target) {
                            TicketMilestone milestone = getModel().getObject();
                            Change change = new Change(user.username);
                            if (NIL.equals(milestone.name) || ESC_NIL.equals(milestone.name)) {
                                change.setField(Field.milestone, "");
                            } else {
                                change.setField(Field.milestone, milestone.name);
                            }
                            if (!ticket.isWatching(user.username)) {
                                change.watch(user.username);
                            }
                            TicketModel update = app().tickets().updateTicket(repository, ticket.number,
                                    change);
                            app().tickets().createNotifier().sendMailing(update);
                            redirectTo(TicketsPage.class, getPageParameters());
                        }
                    };
                    item.add(link);
                }
            };
            controls.add(milestoneView);

            String editHref = urlFor(EditTicketPage.class, params).toString();
            controls.add(new ExternalLink("editLink", editHref, getString("gb.edit")));

            add(controls);
        } else {
            /*
             * CLOSED TICKET
             */
            Fragment controls = new Fragment("controls", "closedControlsFragment", TicketPage.this);

            String editHref = urlFor(EditTicketPage.class, params).toString();
            controls.add(new ExternalLink("editLink", editHref, getString("gb.edit")));

            add(controls);
        }
    } else {
        add(new Label("controls").setVisible(false));
    }

    /*
     * TICKET METADATA
     */
    add(new Label("ticketType", ticket.type.toString()));

    add(new Label("priority", ticket.priority.toString()));
    add(new Label("severity", ticket.severity.toString()));

    if (StringUtils.isEmpty(ticket.topic)) {
        add(new Label("ticketTopic").setVisible(false));
    } else {
        // process the topic using the bugtraq config to link things
        String topic = bugtraqProcessor().processText(getRepository(), repositoryName, ticket.topic);
        String safeTopic = app().xssFilter().relaxed(topic);
        add(new Label("ticketTopic", safeTopic).setEscapeModelStrings(false));
    }

    /*
     * VOTERS
     */
    List<String> voters = ticket.getVoters();
    Label votersCount = new Label("votes", "" + voters.size());
    if (voters.size() == 0) {
        WicketUtils.setCssClass(votersCount, "badge");
    } else {
        WicketUtils.setCssClass(votersCount, "badge badge-info");
    }
    add(votersCount);
    if (user.isAuthenticated && app().tickets().isAcceptingTicketUpdates(repository)) {
        Model<String> model;
        if (ticket.isVoter(user.username)) {
            model = Model.of(getString("gb.removeVote"));
        } else {
            model = Model.of(MessageFormat.format(getString("gb.vote"), ticket.type.toString()));
        }
        SimpleAjaxLink<String> link = new SimpleAjaxLink<String>("voteLink", model) {

            private static final long serialVersionUID = 1L;

            @Override
            public void onClick(AjaxRequestTarget target) {
                Change change = new Change(user.username);
                if (ticket.isVoter(user.username)) {
                    change.unvote(user.username);
                } else {
                    change.vote(user.username);
                }
                app().tickets().updateTicket(repository, ticket.number, change);
                redirectTo(TicketsPage.class, getPageParameters());
            }
        };
        add(link);
    } else {
        add(new Label("voteLink").setVisible(false));
    }

    /*
     * WATCHERS
     */
    List<String> watchers = ticket.getWatchers();
    Label watchersCount = new Label("watchers", "" + watchers.size());
    if (watchers.size() == 0) {
        WicketUtils.setCssClass(watchersCount, "badge");
    } else {
        WicketUtils.setCssClass(watchersCount, "badge badge-info");
    }
    add(watchersCount);
    if (user.isAuthenticated && app().tickets().isAcceptingTicketUpdates(repository)) {
        Model<String> model;
        if (ticket.isWatching(user.username)) {
            model = Model.of(getString("gb.stopWatching"));
        } else {
            model = Model.of(MessageFormat.format(getString("gb.watch"), ticket.type.toString()));
        }
        SimpleAjaxLink<String> link = new SimpleAjaxLink<String>("watchLink", model) {

            private static final long serialVersionUID = 1L;

            @Override
            public void onClick(AjaxRequestTarget target) {
                Change change = new Change(user.username);
                if (ticket.isWatching(user.username)) {
                    change.unwatch(user.username);
                } else {
                    change.watch(user.username);
                }
                app().tickets().updateTicket(repository, ticket.number, change);
                redirectTo(TicketsPage.class, getPageParameters());
            }
        };
        add(link);
    } else {
        add(new Label("watchLink").setVisible(false));
    }

    /*
     * TOPIC & LABELS (DISCUSSION TAB->SIDE BAR)
     */
    ListDataProvider<String> labelsDp = new ListDataProvider<String>(ticket.getLabels());
    DataView<String> labelsView = new DataView<String>("labels", labelsDp) {
        private static final long serialVersionUID = 1L;

        @Override
        public void populateItem(final Item<String> item) {
            final String value = item.getModelObject();
            Label label = new Label("label", value);
            TicketLabel tLabel = app().tickets().getLabel(repository, value);
            String background = MessageFormat.format("background-color:{0};", tLabel.color);
            label.add(new AttributeModifier("style", background));
            item.add(label);
        }
    };

    add(labelsView);

    /*
     * COMMENTS & STATUS CHANGES (DISCUSSION TAB)
     */
    if (comments.size() == 0) {
        add(new Label("discussion").setVisible(false));
    } else {
        Fragment discussionFragment = new Fragment("discussion", "discussionFragment", TicketPage.this);
        ListDataProvider<Change> discussionDp = new ListDataProvider<Change>(discussion);
        DataView<Change> discussionView = new DataView<Change>("discussion", discussionDp) {
            private static final long serialVersionUID = 1L;

            @Override
            public void populateItem(final Item<Change> item) {
                final Change entry = item.getModelObject();
                if (entry.isMerge()) {
                    /*
                     * MERGE
                     */
                    String resolvedBy = entry.getString(Field.mergeSha);

                    // identify the merged patch, it is likely the last
                    Patchset mergedPatch = null;
                    for (Change c : revisions) {
                        if (c.patchset.tip.equals(resolvedBy)) {
                            mergedPatch = c.patchset;
                            break;
                        }
                    }

                    String commitLink;
                    if (mergedPatch == null) {
                        // shouldn't happen, but just-in-case
                        int len = app().settings().getInteger(Keys.web.shortCommitIdLength, 6);
                        commitLink = resolvedBy.substring(0, len);
                    } else {
                        // expected result
                        commitLink = mergedPatch.toString();
                    }

                    Fragment mergeFragment = new Fragment("entry", "mergeFragment", TicketPage.this);
                    mergeFragment.add(new LinkPanel("commitLink", null, commitLink, CommitPage.class,
                            WicketUtils.newObjectParameter(repositoryName, resolvedBy)));
                    mergeFragment.add(new Label("toBranch",
                            MessageFormat.format(getString("gb.toBranch"), "<b>" + ticket.mergeTo + "</b>"))
                                    .setEscapeModelStrings(false));
                    addUserAttributions(mergeFragment, entry, 0);
                    addDateAttributions(mergeFragment, entry);

                    item.add(mergeFragment);
                } else if (entry.isStatusChange()) {
                    /*
                     *  STATUS CHANGE
                     */
                    Fragment frag = new Fragment("entry", "statusFragment", TicketPage.this);
                    Label status = new Label("statusChange", entry.getStatus().toString());
                    String css = TicketsUI.getLozengeClass(entry.getStatus(), false);
                    WicketUtils.setCssClass(status, css);
                    frag.add(status);
                    addUserAttributions(frag, entry, avatarWidth);
                    addDateAttributions(frag, entry);
                    item.add(frag);
                } else {
                    /*
                     * COMMENT
                     */
                    String bugtraq = bugtraqProcessor().processText(getRepository(), repositoryName,
                            entry.comment.text);
                    String comment = MarkdownUtils.transformGFM(app().settings(), bugtraq, repositoryName);
                    String safeComment = app().xssFilter().relaxed(comment);
                    Fragment frag = new Fragment("entry", "commentFragment", TicketPage.this);
                    Label commentIcon = new Label("commentIcon");
                    if (entry.comment.src == CommentSource.Email) {
                        WicketUtils.setCssClass(commentIcon, "iconic-mail");
                    } else {
                        WicketUtils.setCssClass(commentIcon, "iconic-comment-alt2-stroke");
                    }
                    frag.add(commentIcon);
                    frag.add(new Label("comment", safeComment).setEscapeModelStrings(false));
                    addUserAttributions(frag, entry, avatarWidth);
                    addDateAttributions(frag, entry);
                    item.add(frag);
                }
            }
        };
        discussionFragment.add(discussionView);
        add(discussionFragment);
    }

    /*
     * ADD COMMENT PANEL
     */
    if (UserModel.ANONYMOUS.equals(user) || !repository.isBare || repository.isFrozen || repository.isMirror) {

        // prohibit comments for anonymous users, local working copy repos,
        // frozen repos, and mirrors
        add(new Label("newComment").setVisible(false));
    } else {
        // permit user to comment
        Fragment newComment = new Fragment("newComment", "newCommentFragment", TicketPage.this);
        AvatarImage img = new AvatarImage("newCommentAvatar", user.username, user.emailAddress,
                "gravatar-round", avatarWidth, true);
        newComment.add(img);
        CommentPanel commentPanel = new CommentPanel("commentPanel", user, ticket, null, TicketsPage.class);
        commentPanel.setRepository(repositoryName);
        newComment.add(commentPanel);
        add(newComment);
    }

    /*
     *  PATCHSET TAB
     */
    if (currentPatchset == null) {
        // no patchset available
        RepositoryUrl repoUrl = getRepositoryUrl(user, repository);
        boolean canPropose = repoUrl != null && repoUrl.hasPermission()
                && repoUrl.permission.atLeast(AccessPermission.CLONE) && !UserModel.ANONYMOUS.equals(user);
        if (ticket.isOpen() && app().tickets().isAcceptingNewPatchsets(repository) && canPropose) {
            // ticket & repo will accept a proposal patchset
            // show the instructions for proposing a patchset
            Fragment changeIdFrag = new Fragment("patchset", "proposeFragment", TicketPage.this);
            changeIdFrag.add(new Label("proposeInstructions",
                    MarkdownUtils.transformMarkdown(getString("gb.proposeInstructions")))
                            .setEscapeModelStrings(false));
            changeIdFrag
                    .add(new Label("ptWorkflow", MessageFormat.format(getString("gb.proposeWith"), "Barnum")));
            changeIdFrag.add(new Label("ptWorkflowSteps",
                    getProposeWorkflow("propose_pt.md", repoUrl.url, ticket.number))
                            .setEscapeModelStrings(false));
            changeIdFrag
                    .add(new Label("gitWorkflow", MessageFormat.format(getString("gb.proposeWith"), "Git")));
            changeIdFrag.add(new Label("gitWorkflowSteps",
                    getProposeWorkflow("propose_git.md", repoUrl.url, ticket.number))
                            .setEscapeModelStrings(false));
            add(changeIdFrag);
        } else {
            // explain why you can't propose a patchset
            Fragment fragment = new Fragment("patchset", "canNotProposeFragment", TicketPage.this);
            String reason = "";
            if (ticket.isClosed()) {
                reason = getString("gb.ticketIsClosed");
            } else if (repository.isMirror) {
                reason = getString("gb.repositoryIsMirror");
            } else if (repository.isFrozen) {
                reason = getString("gb.repositoryIsFrozen");
            } else if (!repository.acceptNewPatchsets) {
                reason = getString("gb.repositoryDoesNotAcceptPatchsets");
            } else if (!canPropose) {
                if (UserModel.ANONYMOUS.equals(user)) {
                    reason = getString("gb.anonymousCanNotPropose");
                } else {
                    reason = getString("gb.youDoNotHaveClonePermission");
                }
            } else {
                reason = getString("gb.serverDoesNotAcceptPatchsets");
            }
            fragment.add(new Label("reason", reason));
            add(fragment);
        }
    } else {
        // show current patchset
        Fragment patchsetFrag = new Fragment("patchset", "patchsetFragment", TicketPage.this);
        patchsetFrag.add(new Label("commitsInPatchset",
                MessageFormat.format(getString("gb.commitsInPatchsetN"), currentPatchset.number)));

        patchsetFrag.add(createMergePanel(user, repository));

        if (ticket.isOpen()) {
            // current revision
            MarkupContainer panel = createPatchsetPanel("panel", repository, user);
            patchsetFrag.add(panel);
            addUserAttributions(patchsetFrag, currentRevision, avatarWidth);
            addUserAttributions(panel, currentRevision, 0);
            addDateAttributions(panel, currentRevision);
        } else {
            // current revision
            patchsetFrag.add(new Label("panel").setVisible(false));
        }

        // commits
        List<RevCommit> commits = JGitUtils.getRevLog(getRepository(), currentPatchset.base,
                currentPatchset.tip);
        ListDataProvider<RevCommit> commitsDp = new ListDataProvider<RevCommit>(commits);
        DataView<RevCommit> commitsView = new DataView<RevCommit>("commit", commitsDp) {
            private static final long serialVersionUID = 1L;

            @Override
            public void populateItem(final Item<RevCommit> item) {
                RevCommit commit = item.getModelObject();
                PersonIdent author = commit.getAuthorIdent();
                item.add(new AvatarImage("authorAvatar", author.getName(), author.getEmailAddress(), null, 16,
                        false));
                item.add(new Label("author", commit.getAuthorIdent().getName()));
                item.add(new LinkPanel("commitId", null, getShortObjectId(commit.getName()), CommitPage.class,
                        WicketUtils.newObjectParameter(repositoryName, commit.getName()), true));
                item.add(new LinkPanel("diff", "link", getString("gb.diff"), CommitDiffPage.class,
                        WicketUtils.newObjectParameter(repositoryName, commit.getName()), true));
                item.add(new Label("title",
                        StringUtils.trimString(commit.getShortMessage(), Constants.LEN_SHORTLOG_REFS)));
                item.add(WicketUtils.createDateLabel("commitDate", JGitUtils.getAuthorDate(commit),
                        GitBlitWebSession.get().getTimezone(), getTimeUtils(), false));
                item.add(new DiffStatPanel("commitDiffStat", 0, 0, true));
            }
        };
        patchsetFrag.add(commitsView);
        add(patchsetFrag);
    }

    /*
     * ACTIVITY TAB
     */
    Fragment revisionHistory = new Fragment("activity", "activityFragment", TicketPage.this);
    List<Change> events = new ArrayList<Change>(ticket.changes);
    Collections.sort(events);
    Collections.reverse(events);
    ListDataProvider<Change> eventsDp = new ListDataProvider<Change>(events);
    DataView<Change> eventsView = new DataView<Change>("event", eventsDp) {
        private static final long serialVersionUID = 1L;

        @Override
        public void populateItem(final Item<Change> item) {
            Change event = item.getModelObject();

            addUserAttributions(item, event, 16);

            if (event.hasPatchset()) {
                // patchset
                Patchset patchset = event.patchset;
                String what;
                if (event.isStatusChange() && (Status.New == event.getStatus())) {
                    what = getString("gb.proposedThisChange");
                } else if (patchset.rev == 1) {
                    what = MessageFormat.format(getString("gb.uploadedPatchsetN"), patchset.number);
                } else {
                    if (patchset.added == 1) {
                        what = getString("gb.addedOneCommit");
                    } else {
                        what = MessageFormat.format(getString("gb.addedNCommits"), patchset.added);
                    }
                }
                item.add(new Label("what", what));

                LinkPanel psr = new LinkPanel("patchsetRevision", null, patchset.number + "-" + patchset.rev,
                        ComparePage.class, WicketUtils.newRangeParameter(repositoryName,
                                patchset.parent == null ? patchset.base : patchset.parent, patchset.tip),
                        true);
                WicketUtils.setHtmlTooltip(psr, patchset.toString());
                WicketUtils.setCssClass(psr, "aui-lozenge aui-lozenge-subtle");
                item.add(psr);
                String typeCss = getPatchsetTypeCss(patchset.type);
                Label typeLabel = new Label("patchsetType", patchset.type.toString());
                if (typeCss == null) {
                    typeLabel.setVisible(false);
                } else {
                    WicketUtils.setCssClass(typeLabel, typeCss);
                }
                item.add(typeLabel);

                Link<Void> deleteLink = createDeletePatchsetLink(repository, patchset);

                if (user.canDeleteRef(repository)) {
                    item.add(deleteLink.setVisible(patchset.canDelete));
                } else {
                    item.add(deleteLink.setVisible(false));
                }

                // show commit diffstat
                item.add(new DiffStatPanel("patchsetDiffStat", patchset.insertions, patchset.deletions,
                        patchset.rev > 1));
            } else if (event.hasComment()) {
                // comment
                item.add(new Label("what", getString("gb.commented")));
                item.add(new Label("patchsetRevision").setVisible(false));
                item.add(new Label("patchsetType").setVisible(false));
                item.add(new Label("deleteRevision").setVisible(false));
                item.add(new Label("patchsetDiffStat").setVisible(false));
            } else if (event.hasReference()) {
                // reference
                switch (event.reference.getSourceType()) {
                case Commit: {
                    final int shaLen = app().settings().getInteger(Keys.web.shortCommitIdLength, 6);

                    item.add(new Label("what", getString("gb.referencedByCommit")));
                    LinkPanel psr = new LinkPanel("patchsetRevision", null,
                            event.reference.toString().substring(0, shaLen), CommitPage.class,
                            WicketUtils.newObjectParameter(repositoryName, event.reference.toString()), true);
                    WicketUtils.setHtmlTooltip(psr, event.reference.toString());
                    WicketUtils.setCssClass(psr, "ticketReference-commit shortsha1");
                    item.add(psr);

                }
                    break;

                case Ticket: {
                    final String text = MessageFormat.format("ticket/{0}", event.reference.ticketId);

                    item.add(new Label("what", getString("gb.referencedByTicket")));
                    //NOTE: Ideally reference the exact comment using reference.toString,
                    //      however anchor hash is used and is escaped resulting in broken link
                    LinkPanel psr = new LinkPanel("patchsetRevision", null, text, TicketsPage.class,
                            WicketUtils.newObjectParameter(repositoryName, event.reference.ticketId.toString()),
                            true);
                    WicketUtils.setCssClass(psr, "ticketReference-comment");
                    item.add(psr);
                }
                    break;

                default: {
                    item.add(new Label("what").setVisible(false));
                    item.add(new Label("patchsetRevision").setVisible(false));
                }
                }

                item.add(new Label("patchsetType").setVisible(false));
                item.add(new Label("deleteRevision").setVisible(false));
                item.add(new Label("patchsetDiffStat").setVisible(false));
            } else if (event.hasReview()) {
                // review
                String score;
                switch (event.review.score) {
                case approved:
                    score = "<span style='color:darkGreen'>" + getScoreDescription(event.review.score)
                            + "</span>";
                    break;
                case vetoed:
                    score = "<span style='color:darkRed'>" + getScoreDescription(event.review.score)
                            + "</span>";
                    break;
                default:
                    score = getScoreDescription(event.review.score);
                }
                item.add(new Label("what", MessageFormat.format(getString("gb.reviewedPatchsetRev"),
                        event.review.patchset, event.review.rev, score)).setEscapeModelStrings(false));
                item.add(new Label("patchsetRevision").setVisible(false));
                item.add(new Label("patchsetType").setVisible(false));
                item.add(new Label("deleteRevision").setVisible(false));
                item.add(new Label("patchsetDiffStat").setVisible(false));
            } else {
                // field change
                item.add(new Label("patchsetRevision").setVisible(false));
                item.add(new Label("patchsetType").setVisible(false));
                item.add(new Label("deleteRevision").setVisible(false));
                item.add(new Label("patchsetDiffStat").setVisible(false));

                String what = "";
                if (event.isStatusChange()) {
                    switch (event.getStatus()) {
                    case New:
                        if (ticket.isProposal()) {
                            what = getString("gb.proposedThisChange");
                        } else {
                            what = getString("gb.createdThisTicket");
                        }
                        break;
                    default:
                        break;
                    }
                }
                item.add(new Label("what", what).setVisible(what.length() > 0));
            }

            addDateAttributions(item, event);

            if (event.hasFieldChanges()) {
                StringBuilder sb = new StringBuilder();
                sb.append("<table class=\"summary\"><tbody>");
                for (Map.Entry<Field, String> entry : event.fields.entrySet()) {
                    String value;
                    switch (entry.getKey()) {
                    case body:
                        String body = entry.getValue();
                        if (event.isStatusChange() && Status.New == event.getStatus()
                                && StringUtils.isEmpty(body)) {
                            // ignore initial empty description
                            continue;
                        }
                        // trim body changes
                        if (StringUtils.isEmpty(body)) {
                            value = "<i>" + ESC_NIL + "</i>";
                        } else {
                            value = StringUtils.trimString(body, Constants.LEN_SHORTLOG_REFS);
                        }
                        break;
                    case status:
                        // special handling for status
                        Status status = event.getStatus();
                        String css = TicketsUI.getLozengeClass(status, true);
                        value = String.format("<span class=\"%1$s\">%2$s</span>", css, status.toString());
                        break;
                    default:
                        value = StringUtils.isEmpty(entry.getValue()) ? ("<i>" + ESC_NIL + "</i>")
                                : StringUtils.escapeForHtml(entry.getValue(), false);
                        break;
                    }
                    sb.append("<tr><th style=\"width:70px;\">");
                    try {
                        sb.append(getString("gb." + entry.getKey().name()));
                    } catch (Exception e) {
                        sb.append(entry.getKey().name());
                    }
                    sb.append("</th><td>");
                    sb.append(value);
                    sb.append("</td></tr>");
                }
                sb.append("</tbody></table>");
                String safeHtml = app().xssFilter().relaxed(sb.toString());
                item.add(new Label("fields", safeHtml).setEscapeModelStrings(false));
            } else {
                item.add(new Label("fields").setVisible(false));
            }
        }
    };
    revisionHistory.add(eventsView);
    add(revisionHistory);
}

From source file:com.servoy.j2db.server.headlessclient.MainPage.java

License:Open Source License

public MainPage(PageParameters pp) {
    super();/*from ww w. jav a  2 s. c  om*/
    if (pp.getString(StartupArguments.PARAM_KEY_SOLUTION) != null
            || pp.getString(StartupArguments.PARAM_KEY_SHORT_SOLUTION) != null) {
        throw new RestartResponseException(SolutionLoader.class, pp);
    } else {
        throw new RestartResponseException(SelectSolution.class);
    }
}

From source file:com.servoy.j2db.server.headlessclient.WebClientSession.java

License:Open Source License

@SuppressWarnings("nls")
public IWebClientApplication startSessionClient(RootObjectMetaData sd, String method,
        StartupArguments argumentsScope) throws Exception {
    String firstArgument = argumentsScope.getFirstArgument();
    IWebClientApplication webClient = getWebClient();
    if (webClient != null) {
        boolean solutionLoaded = webClient.getSolution() != null;
        if (solutionLoaded && !webClient.closeSolution(false, null)) {
            return webClient; // not allowed to close solution?
        }/*from   w w  w .ja  v a  2s .  c o  m*/

        if (solutionLoaded && isSignedIn()
                && !Utils.getAsBoolean(
                        Settings.getInstance().getProperty("servoy.allowSolutionBrowsing", "true"))
                && !sd.getName().equals(keepCredentialsSolutionName)) {
            webClient.logout(null);
        }
        if (!isSignedIn()) {
            SolutionMetaData smd = (SolutionMetaData) sd;
            IRepository repository = ApplicationServerRegistry.get().getLocalRepository();
            Solution sol = (Solution) repository.getActiveRootObject(smd.getName(), IRepository.SOLUTIONS);
            if (sol.getLoginSolutionName() == null && sol.getLoginFormID() <= 0 && smd.getMustAuthenticate()) {
                //signin first
                throw new RestartResponseAtInterceptPageException(SignIn.class);
            }
        }
        keepCredentialsSolutionName = null;
    }
    if (webClient == null || webClient.isShutDown()) {
        HttpServletRequest req = ((WebRequest) RequestCycle.get().getRequest()).getHttpServletRequest();
        httpSession = req.getSession();
        webClient = createWebClient(req, credentials, method,
                firstArgument == null ? null : new Object[] { firstArgument, argumentsScope.toJSMap() },
                sd.getName());
        webClient.handleArguments(new String[] { sd.getName() }, argumentsScope);
        if (RequestCycle.get() != null) {
            // if this is inside a request cycle set the service provider.
            // will be reset by the detach of the RequestCycle.
            J2DBGlobals.setServiceProvider(webClient);
        }
        setAttribute("servoy_webclient", webClient);
    } else {
        webClient.handleArguments(firstArgument != null ? new String[] { sd.getName(), method, firstArgument }
                : new String[] { sd.getName(), method }, argumentsScope);
    }

    webClient.handleClientUserUidChanged(null, ""); // fake first load
    if (webClient.getSolution() != null)
        getSolutionLastModifiedTime(webClient.getSolution());
    else {
        if (webClient.getPreferedSolutionNameToLoadOnInit() != null) {
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("s", webClient.getPreferedSolutionNameToLoadOnInit());
            map.put("m", webClient.getPreferedSolutionMethodNameToCall());
            if (webClient.getPreferedSolutionMethodArguments() != null
                    && webClient.getPreferedSolutionMethodArguments().length > 0) {
                map.put("a", webClient.getPreferedSolutionMethodArguments()[0]);
            }
            throw new RestartResponseException(SolutionLoader.class, new PageParameters(map));
        }
    }
    return webClient;
}

From source file:de.inren.frontend.storehouse.ActionPanel.java

License:Apache License

private Form<String> createAddFolder(String id) {

    final Form<String> form = new Form<String>(id, Model.of(""));
    form.add(new TextField<String>("name", form.getModel()));
    form.add(new Button("submit", Model.of("add")) {
        @Override//  ww w.ja va  2 s .  c o  m
        public void onSubmit() {
            String fname = form.getModel().getObject();
            if (!Strings.isEmpty(fname)) {
                Folder srcFolder = ActionPanel.this.getModel().getObject();
                Folder folder = new Folder();
                folder.setName(fname);
                folder.setRoles(srcFolder.getGrantedRoles());
                folder.setType(FolderType.FOLDER);
                folder = folderService.saveFolder(folder);
                folderService.insertIntoFolder(srcFolder, folder);
                PageParameters parameters = new PageParameters();
                parameters.add("id", folder.getId());
                throw new RestartResponseException(FileManagerPage.class, parameters);
            }
        }
    });
    return form;
}