/* * 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.exception.CommandException; import edu.harvard.iq.dataverse.engine.command.impl.DeleteGuestbookCommand; import edu.harvard.iq.dataverse.engine.command.impl.UpdateDataverseCommand; import edu.harvard.iq.dataverse.engine.command.impl.UpdateDataverseGuestbookRootCommand; import edu.harvard.iq.dataverse.util.JsfHelper; import static edu.harvard.iq.dataverse.util.JsfHelper.JH; import java.util.LinkedList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.ejb.EJB; import javax.faces.application.FacesMessage; import javax.faces.context.FacesContext; import javax.faces.event.ActionEvent; import javax.faces.view.ViewScoped; import javax.inject.Inject; import javax.inject.Named; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; /** * * @author skraffmiller */ @ViewScoped @Named public class ManageGuestbooksPage implements java.io.Serializable { @EJB DataverseServiceBean dvService; @EJB GuestbookResponseServiceBean guestbookResponseService; @EJB GuestbookServiceBean guestbookService; @EJB EjbDataverseEngine engineService; @PersistenceContext(unitName = "VDCNet-ejbPU") EntityManager em; @Inject DataversePage dvpage; @Inject GuestbookPage guestbookPage; @Inject DataverseSession session; @Inject DataverseRequestServiceBean dvRequestService; @Inject PermissionsWrapper permissionsWrapper; private List<Guestbook> guestbooks; private Dataverse dataverse; private Long dataverseId; private boolean inheritGuestbooksValue; private boolean displayDownloadAll = false; private Guestbook selectedGuestbook = null; public String init() { dataverse = dvService.find(dataverseId); if (dataverse == null) { return permissionsWrapper.notFound(); } if (!permissionsWrapper.canIssueCommand(dataverse, UpdateDataverseCommand.class)) { return permissionsWrapper.notAuthorized(); } Long totalResponses = guestbookResponseService.findCountAll(dataverseId); if(totalResponses.intValue() > 0){ displayDownloadAll = true; } dvpage.setDataverse(dataverse); guestbooks = new LinkedList<>(); setInheritGuestbooksValue(!dataverse.isGuestbookRoot()); if (inheritGuestbooksValue && dataverse.getOwner() != null) { for (Guestbook pg : dataverse.getParentGuestbooks()) { pg.setUsageCount(guestbookService.findCountUsages(pg.getId(), dataverseId)); pg.setResponseCount(guestbookResponseService.findCountByGuestbookId(pg.getId(), dataverseId)); guestbooks.add(pg); } } for (Guestbook cg : dataverse.getGuestbooks()) { cg.setDeletable(true); cg.setUsageCount(guestbookService.findCountUsages(cg.getId(), dataverseId)); if (!(guestbookService.findCountUsages(cg.getId(), null) == 0)) { cg.setDeletable(false); } cg.setResponseCount(guestbookResponseService.findCountByGuestbookId(cg.getId() , dataverseId)); if (!(guestbookResponseService.findCountByGuestbookId(cg.getId() , null) == 0)) { cg.setDeletable(false); } cg.setDataverse(dataverse); guestbooks.add(cg); } return null; } public void downloadResponsesByDataverse(){ FacesContext ctx = FacesContext.getCurrentInstance(); HttpServletResponse response = (HttpServletResponse) ctx.getExternalContext().getResponse(); response.setContentType("text/comma-separated-values"); String fileNameString = "attachment;filename=" + getFileName(); response.setHeader("Content-Disposition", fileNameString); String converted = convertResponsesToCommaDelimited(guestbookResponseService.findArrayByDataverseId(dataverseId)); try { ServletOutputStream out = response.getOutputStream(); out.write(converted.getBytes()); out.flush(); ctx.responseComplete(); } catch (Exception e) { } } public void downloadResponsesByDataverseAndGuestbook(){ FacesContext ctx = FacesContext.getCurrentInstance(); HttpServletResponse response = (HttpServletResponse) ctx.getExternalContext().getResponse(); response.setContentType("text/comma-separated-values"); String fileNameString = "attachment;filename=" + getFileName(); response.setHeader("Content-Disposition", fileNameString); //selectedGuestbook String converted = convertResponsesToCommaDelimited(guestbookResponseService.findArrayByDataverseIdAndGuestbookId(dataverseId, selectedGuestbook.getId())); try { ServletOutputStream out = response.getOutputStream(); out.write(converted.getBytes()); out.flush(); ctx.responseComplete(); } catch (Exception e) { } } private String getFileName(){ return dataverse.getName() + "_GuestbookReponses.csv"; } private final String SEPARATOR = ","; private final String END_OF_LINE = "\n"; private String convertResponsesToCommaDelimited(List<Object[]> guestbookResponses) { StringBuilder sb = new StringBuilder(); sb.append("Guestbook, Dataset, Date, Type, File Name, User Name, Email, Institution, Position, Custom Questions"); sb.append(END_OF_LINE); for (Object[] array : guestbookResponses) { sb.append(array[0]); sb.append(SEPARATOR); sb.append(array[1]); sb.append(SEPARATOR); sb.append(array[2]); sb.append(SEPARATOR); sb.append(array[3]); sb.append(SEPARATOR); sb.append(array[4]); sb.append(SEPARATOR); sb.append(array[5] == null ? "" : array[5]); sb.append(SEPARATOR); sb.append(array[6] == null ? "" : array[6]); sb.append(SEPARATOR); sb.append(array[7] == null ? "" : array[7]); sb.append(SEPARATOR); sb.append(array[8] == null ? "" : array[8]); if(array[9] != null){ List <Object[]> responses = (List<Object[]>) array[9]; for (Object[] response: responses){ sb.append(SEPARATOR); sb.append(response[0]); sb.append(SEPARATOR); sb.append(response[1] == null ? "" : response[1]); } } sb.append(END_OF_LINE); } return sb.toString(); } public void deleteGuestbook() { if (selectedGuestbook != null) { guestbooks.remove(selectedGuestbook); dataverse.getGuestbooks().remove(selectedGuestbook); try { engineService.submit(new DeleteGuestbookCommand(dvRequestService.getDataverseRequest(), getDataverse(), selectedGuestbook)); JsfHelper.addFlashMessage("The guestbook has been deleted"); } catch (CommandException ex) { String failMessage = "The dataset guestbook cannot be deleted."; JH.addMessage(FacesMessage.SEVERITY_FATAL, failMessage); } } else { System.out.print("Selected Guestbook is null"); } } public void saveDataverse(ActionEvent e) { saveDataverse("", ""); } public String enableGuestbook(Guestbook selectedGuestbook) { selectedGuestbook.setEnabled(true); saveDataverse("dataset.manageGuestbooks.message.enableSuccess", "dataset.manageGuestbooks.message.enableFailure"); return ""; } public String disableGuestbook(Guestbook selectedGuestbook) { selectedGuestbook.setEnabled(false); saveDataverse("dataset.manageGuestbooks.message.disableSuccess", "dataset.manageGuestbooks.message.disableFailure"); return ""; } private void saveDataverse(String successMessage, String failureMessage) { if (successMessage.isEmpty()) { successMessage = "dataset.manageGuestbooks.message.editSuccess"; } if (failureMessage.isEmpty()) { failureMessage = "dataset.manageGuestbooks.message.editFailure"; } try { engineService.submit(new UpdateDataverseCommand(getDataverse(), null, null, dvRequestService.getDataverseRequest(), null)); JsfHelper.addSuccessMessage(JH.localize(successMessage)); } catch (CommandException ex) { JH.addMessage(FacesMessage.SEVERITY_FATAL, JH.localize(failureMessage)); } } public List<Guestbook> getGuestbooks() { return guestbooks; } public void setGuestbooks(List<Guestbook> guestbooks) { this.guestbooks = guestbooks; } public Dataverse getDataverse() { return dataverse; } public void setDataverse(Dataverse dataverse) { this.dataverse = dataverse; } public Long getDataverseId() { return dataverseId; } public void setDataverseId(Long dataverseId) { this.dataverseId = dataverseId; } public boolean isInheritGuestbooksValue() { return inheritGuestbooksValue; } public void setInheritGuestbooksValue(boolean inheritGuestbooksValue) { this.inheritGuestbooksValue = inheritGuestbooksValue; } public Guestbook getSelectedGuestbook() { return selectedGuestbook; } public void setSelectedGuestbook(Guestbook selectedGuestbook) { this.selectedGuestbook = selectedGuestbook; } public void viewSelectedGuestbook(Guestbook selectedGuestbook) { this.selectedGuestbook = selectedGuestbook; guestbookPage.setGuestbook(selectedGuestbook); } public boolean isDisplayDownloadAll() { return displayDownloadAll; } public void setDisplayDownloadAll(boolean displayDownloadAll) { this.displayDownloadAll = displayDownloadAll; } public String updateGuestbooksRoot(javax.faces.event.AjaxBehaviorEvent event) throws javax.faces.event.AbortProcessingException { try { dataverse = engineService.submit( new UpdateDataverseGuestbookRootCommand(!isInheritGuestbooksValue(), dvRequestService.getDataverseRequest(), getDataverse())); init(); return ""; } catch (CommandException ex) { Logger.getLogger(ManageGuestbooksPage.class.getName()).log(Level.SEVERE, null, ex); } return ""; } }