/*
* 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.authorization.Permission;
import edu.harvard.iq.dataverse.engine.command.Command;
import edu.harvard.iq.dataverse.engine.command.impl.UpdateDataverseThemeCommand;
import edu.harvard.iq.dataverse.util.JsfHelper;
import static edu.harvard.iq.dataverse.util.JsfHelper.JH;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PreDestroy;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.component.html.HtmlInputText;
import javax.faces.context.FacesContext;
import javax.faces.validator.ValidatorException;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.commons.lang.StringUtils;
import org.primefaces.context.RequestContext;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;
/**
*
* @author ellenk
*/
@ViewScoped
@Named
public class ThemeWidgetFragment implements java.io.Serializable {
static final String DEFAULT_LOGO_BACKGROUND_COLOR = "F5F5F5";
static final String DEFAULT_BACKGROUND_COLOR = "F5F5F5";
static final String DEFAULT_LINK_COLOR = "428BCA";
static final String DEFAULT_TEXT_COLOR = "888888";
private static final Logger logger = Logger.getLogger(ThemeWidgetFragment.class.getCanonicalName());
private File tempDir;
private File uploadedFile;
private Dataverse editDv= new Dataverse();
private HtmlInputText linkUrlInput;
private HtmlInputText taglineInput;
@EJB
EjbDataverseEngine commandEngine;
@EJB
DataverseServiceBean dataverseServiceBean;
@Inject
DataverseRequestServiceBean dvRequestService;
@Inject PermissionsWrapper permissionsWrapper;
public HtmlInputText getLinkUrlInput() {
return linkUrlInput;
}
public void setLinkUrlInput(HtmlInputText linkUrlInput) {
this.linkUrlInput = linkUrlInput;
}
public HtmlInputText getTaglineInput() {
return taglineInput;
}
public void setTaglineInput(HtmlInputText taglineInput) {
this.taglineInput = taglineInput;
}
private void createTempDir() {
try {
File tempRoot = Files.createDirectories(Paths.get("../docroot/logos/temp")).toFile();
tempDir = Files.createTempDirectory(tempRoot.toPath(),editDv.getId().toString()).toFile();
} catch (IOException e) {
throw new RuntimeException("Error creating temp directory", e); // improve error handling
}
}
@PreDestroy
/**
* Cleanup by deleting temp directory and uploaded files
*/
public void cleanupTempDirectory() {
try {
if (tempDir != null) {
for (File f : tempDir.listFiles()) {
Files.deleteIfExists(f.toPath());
}
Files.deleteIfExists(tempDir.toPath());
}
} catch (IOException e) {
throw new RuntimeException("Error deleting temp directory", e); // improve error handling
}
uploadedFile=null;
tempDir=null;
}
public void checkboxListener() {
// not sure if this is needed for the ajax component
}
public String initEditDv() {
editDv = dataverseServiceBean.find(editDv.getId());
// check if dv exists and user has permission
if (editDv == null) {
return permissionsWrapper.notFound();
}
if (!permissionsWrapper.canIssueCommand(editDv, UpdateDataverseThemeCommand.class)) {
return permissionsWrapper.notAuthorized();
}
if (editDv.getOwner()==null) {
editDv.setThemeRoot(true);
}
if (editDv.getDataverseTheme()==null && editDv.isThemeRoot()) {
editDv.setDataverseTheme(initDataverseTheme());
}
return null;
}
private DataverseTheme initDataverseTheme() {
DataverseTheme dvt = new DataverseTheme();
dvt.setLinkColor(DEFAULT_LINK_COLOR);
dvt.setLogoBackgroundColor(DEFAULT_LOGO_BACKGROUND_COLOR);
dvt.setBackgroundColor(DEFAULT_BACKGROUND_COLOR);
dvt.setTextColor(DEFAULT_TEXT_COLOR);
dvt.setDataverse(editDv);
return dvt;
}
public Dataverse getEditDv() {
return editDv;
}
public void setEditDv(Dataverse editDV) {
this.editDv = editDV;
}
public void validateTagline(FacesContext context, UIComponent component, Object value) throws ValidatorException {
if (!StringUtils.isEmpty((String) value) && ((String) value).length() > 140) {
FacesMessage msg = new FacesMessage("Tagline must be at most 140 characters.");
msg.setSeverity(FacesMessage.SEVERITY_ERROR);
throw new ValidatorException(msg);
}
}
public void validateUrl(FacesContext context, UIComponent component, Object value) throws ValidatorException {
try {
if (!StringUtils.isEmpty((String) value)) {
URL test = new URL((String) value);
}
} catch (MalformedURLException e) {
FacesMessage msg
= new FacesMessage(" URL validation failed.",
"Please provide URL.");
msg.setSeverity(FacesMessage.SEVERITY_ERROR);
throw new ValidatorException(msg);
}
}
public String getTempDirName() {
if (tempDir!=null) {
return tempDir.getName();
} else {
return null;
}
}
public boolean uploadExists() {
return uploadedFile!=null;
}
/**
* Copy uploaded file to temp area, until we are ready to save
* Copy filename into Dataverse logo
* @param event
*/
public void handleImageFileUpload(FileUploadEvent event) {
logger.finer("entering fileUpload");
if (this.tempDir==null) {
createTempDir();
logger.finer("created tempDir");
}
UploadedFile uFile = event.getFile();
try {
uploadedFile = new File(tempDir, uFile.getFileName());
if (!uploadedFile.exists()) {
uploadedFile.createNewFile();
}
logger.finer("created file");
Files.copy(uFile.getInputstream(), uploadedFile.toPath(),StandardCopyOption.REPLACE_EXISTING);
logger.finer("copied inputstream to file");
editDv.getDataverseTheme().setLogo(uFile.getFileName());
} catch (IOException e) {
logger.finer("caught IOException");
logger.throwing("ThemeWidgetFragment", "handleImageFileUpload", e);
throw new RuntimeException("Error uploading logo file", e); // improve error handling
}
// If needed, set the default values for the logo
if (editDv.getDataverseTheme().getLogoFormat()==null) {
editDv.getDataverseTheme().setLogoFormat(DataverseTheme.ImageFormat.SQUARE);
}
logger.finer("end handelImageFileUpload");
}
public void removeLogo() {
editDv.getDataverseTheme().setLogo(null);
this.cleanupTempDirectory();
}
public boolean getInheritCustomization() {
boolean inherit= editDv==null ? true : !editDv.getThemeRoot();
return inherit;
}
public void setInheritCustomization(boolean inherit) {
editDv.setThemeRoot(!inherit);
if (!inherit) {
if (editDv.getDataverseTheme(true)==null) {
editDv.setDataverseTheme(initDataverseTheme());
}
}
}
public void resetForm() {
RequestContext context = RequestContext.getCurrentInstance();
context.reset(":dataverseForm:themeWidgetsTabView");
}
public String cancel() {
return "dataverse?faces-redirect=true&alias="+editDv.getAlias(); // go to dataverse page
}
public String save() {
// If this Dv isn't the root, delete the uploaded file and remove theme
// before saving.
if (!editDv.isThemeRoot()) {
uploadedFile=null;
editDv.setDataverseTheme(null);
}
Command<Dataverse> cmd = new UpdateDataverseThemeCommand(editDv, this.uploadedFile, dvRequestService.getDataverseRequest());
try {
commandEngine.submit(cmd);
} catch (Exception ex) {
logger.log(Level.SEVERE, "error updating dataverse theme", ex);
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL, "Dataverse Save Failed-", JH.localize("dataverse.theme.failure")));
return null;
} finally {
this.cleanupTempDirectory();
}
JsfHelper.addSuccessMessage(JH.localize("dataverse.theme.success"));
return "dataverse?faces-redirect=true&alias="+editDv.getAlias(); // go to dataverse page
}
}