edu.harvard.iq.dataverse.GuestbookPage.java Source code

Java tutorial

Introduction

Here is the source code for edu.harvard.iq.dataverse.GuestbookPage.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.harvard.iq.dataverse;

import edu.harvard.iq.dataverse.engine.command.Command;
import edu.harvard.iq.dataverse.engine.command.exception.CommandException;
import edu.harvard.iq.dataverse.engine.command.impl.UpdateDataverseCommand;
import edu.harvard.iq.dataverse.engine.command.impl.UpdateDataverseGuestbookCommand;
import edu.harvard.iq.dataverse.util.JsfHelper;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.ejb.EJBException;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.commons.lang.StringUtils;

/**
 *
 * @author skraffmiller
 */
@ViewScoped
@Named("GuestbookPage")
public class GuestbookPage implements java.io.Serializable {

    private static final Logger logger = Logger.getLogger(GuestbookPage.class.getCanonicalName());

    @EJB
    GuestbookServiceBean guestbookService;

    @EJB
    DataverseServiceBean dataverseService;

    @EJB
    EjbDataverseEngine commandEngine;

    @EJB
    GuestbookResponseServiceBean guestbookResponseService;

    @Inject
    DataverseSession session;

    @Inject
    DataverseRequestServiceBean dvRequestService;

    @Inject
    PermissionsWrapper permissionsWrapper;

    public enum EditMode {

        CREATE, METADATA, CLONE
    };

    private Guestbook guestbook;
    private Dataverse dataverse;
    private EditMode editMode;
    private Long ownerId;
    private Long guestbookId;
    private Long sourceId;

    private Guestbook sourceGB;

    public Long getSourceId() {
        return sourceId;
    }

    public void setSourceId(Long sourceId) {
        this.sourceId = sourceId;
    }

    public Guestbook getSourceGB() {
        return sourceGB;
    }

    public void setSourceGB(Guestbook sourceGB) {
        this.sourceGB = sourceGB;
    }

    public Long getGuestbookId() {
        return guestbookId;
    }

    public void setGuestbookId(Long guestbookId) {
        this.guestbookId = guestbookId;
    }

    public Guestbook getGuestbook() {
        return guestbook;
    }

    public void setGuestbook(Guestbook guestbook) {
        this.guestbook = guestbook;
    }

    public Dataverse getDataverse() {
        return dataverse;
    }

    public void setDataverse(Dataverse dataverse) {
        this.dataverse = dataverse;
    }

    public EditMode getEditMode() {
        return editMode;
    }

    public void setEditMode(EditMode editMode) {
        this.editMode = editMode;
    }

    public Long getOwnerId() {
        return ownerId;
    }

    public void setOwnerId(Long ownerId) {
        this.ownerId = ownerId;
    }

    public String init() {

        dataverse = dataverseService.find(ownerId);
        if (dataverse == null) {
            return permissionsWrapper.notFound();
        }
        if (!permissionsWrapper.canIssueCommand(dataverse, UpdateDataverseCommand.class)) {
            return permissionsWrapper.notAuthorized();
        }

        if (guestbookId != null) { // edit or view existing for a template  
            for (Guestbook dvGb : dataverse.getGuestbooks()) {
                if (dvGb.getId().longValue() == guestbookId) {
                    guestbook = dvGb;
                }
            }
            guestbook.setDataverse(dataverse);
            if (guestbook.getCustomQuestions() == null || guestbook.getCustomQuestions().isEmpty()) {
                guestbook.setCustomQuestions(new ArrayList<CustomQuestion>());
                initCustomQuestion();
            }
            editMode = EditMode.METADATA;
        } else if (ownerId != null && sourceId == null) {
            // create mode for a new template
            guestbook = new Guestbook();
            guestbook.setDataverse(dataverse);
            guestbook.setCustomQuestions(new ArrayList<CustomQuestion>());
            initCustomQuestion();
            editMode = EditMode.CREATE;
        } else if (ownerId != null && sourceId != null) {
            // Clone mode for a new template from source
            editMode = EditMode.CLONE;
            sourceGB = guestbookService.find(sourceId);
            guestbook = sourceGB.copyGuestbook(sourceGB, dataverse);
            String name = "Copy of " + sourceGB.getName();
            guestbook.setName(name);
            guestbook.setUsageCount(new Long(0));
            guestbook.setCreateTime(new Timestamp(new Date().getTime()));
            if (guestbook.getCustomQuestions() == null || guestbook.getCustomQuestions().isEmpty()) {
                guestbook.setCustomQuestions(new ArrayList<CustomQuestion>());
                initCustomQuestion();
            }

        } else {
            throw new RuntimeException("On Guestook page without id or ownerid."); // improve error handling
        }

        return null;

    }

    public String removeCustomQuestion(Long index) {
        guestbook.removeCustomQuestion(index.intValue());
        return "";
    }

    public List<GuestbookResponse> getGuestbookResponses() {
        return null;
    }

    private void initCustomQuestion() {
        CustomQuestion toAdd = new CustomQuestion();
        toAdd.setQuestionType("text");
        toAdd.setCustomQuestionValues(new ArrayList<CustomQuestionValue>());
        toAdd.setGuestbook(guestbook);
        int index = guestbook.getCustomQuestions().size();
        guestbook.addCustomQuestion(index, toAdd);
    }

    public void addCustomQuestion(Integer indexIn) {
        CustomQuestion toAdd = new CustomQuestion();
        toAdd.setQuestionType("text");
        toAdd.setCustomQuestionValues(new ArrayList<CustomQuestionValue>());
        toAdd.setGuestbook(guestbook);
        guestbook.addCustomQuestion(indexIn, toAdd);
    }

    public void addCustomQuestionValue(CustomQuestion cq, int index) {
        CustomQuestionValue toAdd = new CustomQuestionValue();
        toAdd.setValueString("");
        toAdd.setCustomQuestion(cq);
        cq.addCustomQuestionValue(index, toAdd);
    }

    public void removeCustomQuestionValue(CustomQuestion cq, Long index) {
        cq.removeCustomQuestionValue(index.intValue());
    }

    public void toggleQuestionType(CustomQuestion questionIn) {
        if (questionIn.getCustomQuestionValues() != null && questionIn.getCustomQuestionValues().isEmpty()
                && questionIn.getQuestionType() != null && questionIn.getQuestionType().equals("options")) {
            questionIn.setCustomQuestionValues(new ArrayList<CustomQuestionValue>());
            CustomQuestionValue addCQV = new CustomQuestionValue();
            addCQV.setCustomQuestion(questionIn);
            questionIn.getCustomQuestionValues().add(addCQV);
        }
    }

    public void edit(GuestbookPage.EditMode editMode) {
        this.editMode = editMode;
    }

    public String save() {
        boolean create = false;
        if (!(guestbook.getCustomQuestions() == null)) {
            for (CustomQuestion cq : guestbook.getCustomQuestions()) {
                if (cq.getQuestionType().equals("text")) {
                    cq.setCustomQuestionValues(null);
                }
            }

            Iterator<CustomQuestion> cqIt = guestbook.getCustomQuestions().iterator();
            while (cqIt.hasNext()) {
                CustomQuestion cq = cqIt.next();
                if (StringUtils.isBlank(cq.getQuestionString())) {
                    cqIt.remove();
                }
            }

            for (CustomQuestion cq : guestbook.getCustomQuestions()) {
                if (cq != null && cq.getQuestionType().equals("options")) {
                    Iterator<CustomQuestionValue> cqvIt = cq.getCustomQuestionValues().iterator();
                    while (cqvIt.hasNext()) {
                        CustomQuestionValue cqv = cqvIt.next();
                        if (StringUtils.isBlank(cqv.getValueString())) {
                            cqvIt.remove();
                        }
                    }
                }
            }

            for (CustomQuestion cq : guestbook.getCustomQuestions()) {
                if (cq != null && cq.getQuestionType().equals("options")) {
                    if (cq.getCustomQuestionValues() == null || cq.getCustomQuestionValues().isEmpty()) {
                        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(
                                FacesMessage.SEVERITY_ERROR, "Guestbook Save Failed",
                                " - An Option question requires multiple options. Please complete before saving."));
                        return null;
                    }
                    if (cq.getCustomQuestionValues().size() == 1) {
                        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(
                                FacesMessage.SEVERITY_ERROR, "Guestbook Save Failed",
                                " - An Option question requires multiple options. Please complete before saving."));
                        return null;
                    }
                }
            }
            int i = 0;
            for (CustomQuestion cq : guestbook.getCustomQuestions()) {
                int j = 0;
                cq.setDisplayOrder(i);
                if (cq.getCustomQuestionValues() != null && !cq.getCustomQuestionValues().isEmpty()) {
                    for (CustomQuestionValue cqv : cq.getCustomQuestionValues()) {
                        cqv.setDisplayOrder(j);
                        j++;
                    }
                }
                i++;
            }
        }

        Command<Dataverse> cmd;
        try {
            if (editMode == EditMode.CREATE || editMode == EditMode.CLONE) {
                guestbook.setCreateTime(new Timestamp(new Date().getTime()));
                guestbook.setUsageCount(new Long(0));
                guestbook.setEnabled(true);
                dataverse.getGuestbooks().add(guestbook);
                cmd = new UpdateDataverseCommand(dataverse, null, null, dvRequestService.getDataverseRequest(),
                        null);
                commandEngine.submit(cmd);
                create = true;
            } else {
                cmd = new UpdateDataverseGuestbookCommand(dataverse, guestbook,
                        dvRequestService.getDataverseRequest());
                commandEngine.submit(cmd);
            }

        } catch (EJBException ex) {
            StringBuilder error = new StringBuilder();
            error.append(ex).append(" ");
            error.append(ex.getMessage()).append(" ");
            Throwable cause = ex;
            while (cause.getCause() != null) {
                cause = cause.getCause();
                error.append(cause).append(" ");
                error.append(cause.getMessage()).append(" ");
            }
            //
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL,
                    "Guestbook Save Failed", " - " + error.toString()));
            logger.info("Guestbook Page EJB Exception. Dataverse: " + dataverse.getName());
            logger.info(error.toString());
            return null;
        } catch (CommandException ex) {
            logger.info("Guestbook Page Command Exception. Dataverse: " + dataverse.getName());
            logger.info(ex.toString());
            FacesContext.getCurrentInstance().addMessage(null,
                    new FacesMessage(FacesMessage.SEVERITY_FATAL, "Guestbook Save Failed", " - " + ex.toString()));
            //logger.severe(ex.getMessage());
        }
        editMode = null;
        String msg = (create) ? "The guestbook has been created." : "The guestbook has been edited and saved.";
        JsfHelper.addFlashMessage(msg);
        return "/manage-guestbooks.xhtml?dataverseId=" + dataverse.getId() + "&faces-redirect=true";
    }

    public void cancel() {
        editMode = null;
    }

}