package edu.harvard.iq.dataverse;
import edu.harvard.iq.dataverse.engine.command.exception.CommandException;
import edu.harvard.iq.dataverse.engine.command.impl.CreateTemplateCommand;
import edu.harvard.iq.dataverse.engine.command.impl.DeleteTemplateCommand;
import edu.harvard.iq.dataverse.engine.command.impl.UpdateDataverseCommand;
import edu.harvard.iq.dataverse.engine.command.impl.UpdateDataverseTemplateRootCommand;
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.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.event.ActionEvent;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
/**
*
* @author skraffmiller
*/
@ViewScoped
@Named
public class ManageTemplatesPage implements java.io.Serializable {
@EJB
DataverseServiceBean dvService;
@EJB
TemplateServiceBean templateService;
@EJB
EjbDataverseEngine engineService;
@PersistenceContext(unitName = "VDCNet-ejbPU")
EntityManager em;
@Inject
DataversePage dvpage;
@Inject
TemplatePage tempPage;
@Inject
DataverseSession session;
@Inject
DataverseRequestServiceBean dvRequestService;
@Inject
PermissionsWrapper permissionsWrapper;
private List<Template> templates;
private Dataverse dataverse;
private Long dataverseId;
private boolean inheritTemplatesValue;
private boolean inheritTemplatesAllowed = false;
private Template selectedTemplate = null;
public String init() {
dataverse = dvService.find(dataverseId);
if (dataverse == null) {
return permissionsWrapper.notFound();
}
if (!permissionsWrapper.canIssueCommand(dataverse, UpdateDataverseCommand.class)) {
return permissionsWrapper.notAuthorized();
}
dvpage.setDataverse(dataverse);
if (dataverse.getOwner() != null && dataverse.getMetadataBlocks().equals(dataverse.getOwner().getMetadataBlocks())){
setInheritTemplatesAllowed(true);
}
templates = new LinkedList<>();
setInheritTemplatesValue(!dataverse.isTemplateRoot());
if (inheritTemplatesValue && dataverse.getOwner() != null) {
for (Template pt : dataverse.getParentTemplates()) {
pt.setDataverse(dataverse.getOwner());
templates.add(pt);
}
}
for (Template ct : dataverse.getTemplates()) {
ct.setDataverse(dataverse);
ct.setDataversesHasAsDefault(templateService.findDataversesByDefaultTemplateId(ct.getId()));
ct.setIsDefaultForDataverse(!ct.getDataversesHasAsDefault().isEmpty());
templates.add(ct);
}
if (!templates.isEmpty()){
JH.addMessage(FacesMessage.SEVERITY_INFO, JH.localize("dataset.manageTemplates.info.message.notEmptyTable"));
}
return null;
}
public void makeDefault(Template templateIn) {
dataverse.setDefaultTemplate(templateIn);
saveDataverse("The template has been selected as the default template for this dataverse");
}
public void unselectDefault(Template templateIn) {
dataverse.setDefaultTemplate(null);
saveDataverse("The template has been removed as the default template for this dataverse");
}
public String cloneTemplate(Template templateIn) {
Template newOne = templateIn.cloneNewTemplate(templateIn);
String name = "Copy of " + templateIn.getName();
newOne.setName(name);
newOne.setUsageCount(new Long(0));
newOne.setCreateTime(new Timestamp(new Date().getTime()));
dataverse.getTemplates().add(newOne);
templates.add(newOne);
Template created;
try {
created = engineService.submit(new CreateTemplateCommand(newOne, dvRequestService.getDataverseRequest(), dataverse));
saveDataverse("");
String msg = "The template has been copied";
JsfHelper.addFlashMessage(msg);
return "/template.xhtml?id=" + created.getId() + "&ownerId=" + dataverse.getId() + "&editMode=METADATA&faces-redirect=true";
} catch (CommandException ex) {
JH.addMessage(FacesMessage.SEVERITY_FATAL, "Template could not be copied. " );
}
return "";
}
public void deleteTemplate() {
List <Dataverse> dataverseWDefaultTemplate = null;
if (selectedTemplate != null) {
templates.remove(selectedTemplate);
if(dataverse.getDefaultTemplate() != null && dataverse.getDefaultTemplate().equals(selectedTemplate)){
dataverse.setDefaultTemplate(null);
}
dataverse.getTemplates().remove(selectedTemplate);
dataverseWDefaultTemplate = templateService.findDataversesByDefaultTemplateId(selectedTemplate.getId());
} else {
System.out.print("selected template is null");
}
try {
engineService.submit(new DeleteTemplateCommand(dvRequestService.getDataverseRequest(), getDataverse(), selectedTemplate, dataverseWDefaultTemplate ));
JsfHelper.addFlashMessage("The template has been deleted");
} catch (CommandException ex) {
String failMessage = "The dataset template cannot be deleted.";
JH.addMessage(FacesMessage.SEVERITY_FATAL, failMessage);
}
}
public void saveDataverse(ActionEvent e) {
saveDataverse("");
}
private void saveDataverse(String successMessage) {
if (successMessage.isEmpty()) {
successMessage = "Template data updated";
}
try {
engineService.submit(new UpdateDataverseCommand(getDataverse(), null, null, dvRequestService.getDataverseRequest(), null));
//JH.addMessage(FacesMessage.SEVERITY_INFO, successMessage);
JsfHelper.addFlashMessage(successMessage);
} catch (CommandException ex) {
String failMessage = "Template update failed";
if(successMessage.equals("The template has been deleted")){
failMessage = "The dataset template cannot be deleted.";
}
if(successMessage.equals("The template has been selected as the default template for this dataverse")){
failMessage = "The dataset template cannot be made default.";
}
JH.addMessage(FacesMessage.SEVERITY_FATAL, failMessage);
}
}
public List<Template> getTemplates() {
return templates;
}
public void setTemplates(List<Template> templates) {
this.templates = templates;
}
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 isInheritTemplatesValue() {
return inheritTemplatesValue;
}
public void setInheritTemplatesValue(boolean inheritTemplatesValue) {
this.inheritTemplatesValue = inheritTemplatesValue;
}
public boolean isInheritTemplatesAllowed() {
return inheritTemplatesAllowed;
}
public void setInheritTemplatesAllowed(boolean inheritTemplatesAllowed) {
this.inheritTemplatesAllowed = inheritTemplatesAllowed;
}
public Template getSelectedTemplate() {
return selectedTemplate;
}
public void setSelectedTemplate(Template selectedTemplate) {
this.selectedTemplate = selectedTemplate;
}
public void viewSelectedTemplate(Template selectedTemplate) {
this.selectedTemplate = selectedTemplate;
this.selectedTemplate.setMetadataValueBlocks();
tempPage.setTemplate(selectedTemplate);
}
public String updateTemplatesRoot(javax.faces.event.AjaxBehaviorEvent event) throws javax.faces.event.AbortProcessingException {
try {
if (dataverse.getOwner() != null) {
if (isInheritTemplatesValue() && dataverse.getDefaultTemplate() == null && dataverse.getOwner().getDefaultTemplate() != null) {
dataverse.setDefaultTemplate(dataverse.getOwner().getDefaultTemplate());
}
if (!isInheritTemplatesValue()) {
if (dataverse.getDefaultTemplate() != null) {
for (Template test : dataverse.getParentTemplates()) {
if (test.equals(dataverse.getDefaultTemplate())) {
dataverse.setDefaultTemplate(null);
}
}
}
}
}
dataverse = engineService.submit(new UpdateDataverseTemplateRootCommand(!isInheritTemplatesValue(), dvRequestService.getDataverseRequest(), getDataverse()));
init();
return "";
} catch (CommandException ex) {
Logger.getLogger(ManageTemplatesPage.class.getName()).log(Level.SEVERE, null, ex);
}
return "";
}
}