diff src/main/java/edu/harvard/iq/dataverse/TemplatePage.java @ 10:a50cf11e5178

Rewrite LGDataverse completely upgrading to dataverse4.0
author Zoe Hong <zhong@mpiwg-berlin.mpg.de>
date Tue, 08 Sep 2015 17:00:21 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/edu/harvard/iq/dataverse/TemplatePage.java	Tue Sep 08 17:00:21 2015 +0200
@@ -0,0 +1,214 @@
+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.UpdateDataverseTemplateCommand;
+import edu.harvard.iq.dataverse.util.JsfHelper;
+import static edu.harvard.iq.dataverse.util.JsfHelper.JH;
+import java.sql.Timestamp;
+import java.util.Date;
+import java.util.Set;
+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 javax.validation.ConstraintViolation;
+import javax.validation.Validation;
+import javax.validation.Validator;
+import javax.validation.ValidatorFactory;
+
+/**
+ *
+ * @author skraffmiller
+ */
+@ViewScoped
+@Named("TemplatePage")
+public class TemplatePage implements java.io.Serializable {
+
+    @EJB
+    TemplateServiceBean templateService;
+
+    @EJB
+    DataverseServiceBean dataverseService;
+
+    @EJB
+    EjbDataverseEngine commandEngine;
+    
+    @EJB
+    DataverseFieldTypeInputLevelServiceBean dataverseFieldTypeInputLevelService; 
+    
+    @Inject
+    DataverseSession session;
+
+    public enum EditMode {
+
+        CREATE, METADATA
+    };
+
+    private Template template;
+    private Dataverse dataverse;
+    private EditMode editMode;
+    private Long ownerId;
+    private Long templateId;
+
+    public Long getTemplateId() {
+        return templateId;
+    }
+
+    public void setTemplateId(Long templateId) {
+        this.templateId = templateId;
+    }
+
+    public Template getTemplate() {
+        return template;
+    }
+
+    public void setTemplate(Template template) {
+        this.template = template;
+    }
+
+    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 void init() {
+        if (templateId != null) { // edit or view existing for a template  
+            dataverse = dataverseService.find(ownerId);
+            template = templateService.find(templateId);
+            template.setDataverse(dataverse);
+            template.setMetadataValueBlocks();
+            updateDatasetFieldInputLevels();
+        } else if (ownerId != null) {
+            // create mode for a new template
+            dataverse = dataverseService.find(ownerId);
+            editMode = TemplatePage.EditMode.CREATE;
+            template = new Template(this.dataverse);
+            updateDatasetFieldInputLevels();
+        } else {
+            throw new RuntimeException("On Template page without id or ownerid."); // improve error handling
+        }
+    }
+    
+    private void updateDatasetFieldInputLevels(){
+        Long dvIdForInputLevel = ownerId;        
+        if (!dataverseService.find(ownerId).isMetadataBlockRoot()){
+            dvIdForInputLevel = dataverseService.find(ownerId).getMetadataRootId();
+        }        
+        
+        for (DatasetField dsf: template.getFlatDatasetFields()){ 
+           DataverseFieldTypeInputLevel dsfIl = dataverseFieldTypeInputLevelService.findByDataverseIdDatasetFieldTypeId(dvIdForInputLevel, dsf.getDatasetFieldType().getId());
+           if (dsfIl != null){              
+               dsf.setInclude(dsfIl.isInclude());
+           } else {
+               dsf.setInclude(true);
+           } 
+        }
+    }
+
+    public void edit(TemplatePage.EditMode editMode) {
+        this.editMode = editMode;
+    }
+
+    public String save() {
+        
+        boolean dontSave = false;
+        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
+        Validator validator = factory.getValidator();
+        for (DatasetField dsf : template.getFlatDatasetFields()) {
+            dsf.setValidationMessage(null); // clear out any existing validation message
+            Set<ConstraintViolation<DatasetField>> constraintViolations = validator.validate(dsf);
+            for (ConstraintViolation<DatasetField> constraintViolation : constraintViolations) {
+                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Validation Error", constraintViolation.getMessage()));
+                dsf.setValidationMessage(constraintViolation.getMessage());
+                dontSave = true;
+                break; // currently only support one message, so we can break out of the loop after the first constraint violation
+            }
+            for (DatasetFieldValue dsfv : dsf.getDatasetFieldValues()) {
+                dsfv.setValidationMessage(null); // clear out any existing validation message
+                Set<ConstraintViolation<DatasetFieldValue>> constraintViolations2 = validator.validate(dsfv);
+                for (ConstraintViolation<DatasetFieldValue> constraintViolation : constraintViolations2) {
+                    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Validation Error", constraintViolation.getMessage()));
+                    dsfv.setValidationMessage(constraintViolation.getMessage());
+                    dontSave = true;
+                    break; // currently only support one message, so we can break out of the loop after the first constraint violation                    
+                }
+            }
+        }
+        if (dontSave) {
+            return "";
+        }
+        boolean create = false;
+        Command cmd;
+        try {
+            if (editMode == EditMode.CREATE) {
+                template.setCreateTime(new Timestamp(new Date().getTime()));
+                template.setUsageCount(new Long(0));
+                dataverse.getTemplates().add(template);
+                cmd = new UpdateDataverseCommand(dataverse, null, null, session.getUser(), null);
+                create = true;
+                commandEngine.submit(cmd);
+            } else {
+                cmd = new UpdateDataverseTemplateCommand(dataverse, template, session.getUser());
+                commandEngine.submit(cmd);
+            }
+
+        } catch (EJBException ex) {
+            StringBuilder error = new StringBuilder();
+            error.append(ex + " ");
+            error.append(ex.getMessage() + " ");
+            Throwable cause = ex;
+            while (cause.getCause() != null) {
+                cause = cause.getCause();
+                error.append(cause + " ");
+                error.append(cause.getMessage() + " ");
+            }
+            //
+            //FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Template Save Failed", " - " + error.toString()));
+            System.out.print("dataverse " + dataverse.getName());
+            System.out.print("Ejb exception");
+            System.out.print(error.toString());
+            JH.addMessage(FacesMessage.SEVERITY_FATAL, "Template Save Failed");
+            return null;
+        } catch (CommandException ex) {
+            System.out.print("command exception");
+            System.out.print(ex.toString());
+            //FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Template Save Failed", " - " + ex.toString()));
+            JH.addMessage(FacesMessage.SEVERITY_FATAL, "Template Save Failed");
+            return null;
+            //logger.severe(ex.getMessage());
+        }
+        editMode = null;
+        String msg = (create)? "Template has been created.": "Template has been edited and saved.";
+        JsfHelper.addFlashMessage(msg);
+        return "/manage-templates.xhtml?dataverseId=" + dataverse.getId() + "&faces-redirect=true";
+    }
+
+    public void cancel() {
+        editMode = null;
+    }
+
+}