package edu.harvard.iq.dataverse.engine.command.impl; import edu.harvard.iq.dataverse.Dataverse; import edu.harvard.iq.dataverse.authorization.Permission; import edu.harvard.iq.dataverse.engine.command.AbstractCommand; import edu.harvard.iq.dataverse.engine.command.CommandContext; import edu.harvard.iq.dataverse.engine.command.DataverseRequest; import edu.harvard.iq.dataverse.engine.command.RequiredPermissions; import edu.harvard.iq.dataverse.engine.command.exception.CommandException; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; /** * Update an existing dataverse. * @author michael */ @RequiredPermissions( Permission.EditDataverse ) public class UpdateDataverseThemeCommand extends AbstractCommand<Dataverse> { private final Dataverse editedDv; private final File uploadedFile; private final Path logoPath = Paths.get("../docroot/logos"); public UpdateDataverseThemeCommand(Dataverse editedDv, File uploadedFile, DataverseRequest aRequest) { super(aRequest, editedDv); this.uploadedFile = uploadedFile; this.editedDv = editedDv; } /** * Update Theme and Widget related data for this dataverse, and * do file management needed for theme images. * * @param ctxt * @return * @throws CommandException */ @Override public Dataverse execute(CommandContext ctxt) throws CommandException { // Get current dataverse, so we can delete current logo file if necessary Dataverse currentDv = ctxt.dataverses().find(editedDv.getId()); File logoFileDir = new File(logoPath.toFile(), editedDv.getId().toString()); File currentFile=null; if (currentDv.getDataverseTheme()!=null && currentDv.getDataverseTheme().getLogo()!=null) { currentFile = new File(logoFileDir, currentDv.getDataverseTheme().getLogo()); } try { // If edited logo field is empty, and a logoFile currently exists, delete it if (editedDv.getDataverseTheme()==null || editedDv.getDataverseTheme().getLogo()==null ) { if (currentFile!=null) { currentFile.delete(); } } // If edited logo file isn't empty,and uploaded File exists, delete currentFile and copy uploaded file from temp dir to logos dir else if (uploadedFile!=null) { File newFile = new File(logoFileDir,editedDv.getDataverseTheme().getLogo()); if (currentFile!=null) { currentFile.delete(); } logoFileDir.mkdirs(); Files.copy(uploadedFile.toPath(), newFile.toPath(), StandardCopyOption.REPLACE_EXISTING); } // save updated dataverse to db return ctxt.dataverses().save(editedDv); } catch (IOException e) { throw new CommandException("Error saving logo file", e,this); // improve error handling } } }