/** * FPrintTasks.java * Author: Francesco Rosso (rosso@eurix.it) * * This file is part of PrestoPRIME Preservation Platform (P4). * * Copyright (C) 2012 EURIX Srl, Torino, Italy * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package eu.prestoprime.plugin.fprint; import it.eurix.archtools.data.DataException; import it.eurix.archtools.data.model.AIP; import it.eurix.archtools.data.model.DIP; import it.eurix.archtools.data.model.IPException; import it.eurix.archtools.workflow.exceptions.TaskExecutionFailedException; import it.eurix.archtools.workflow.plugin.WfPlugin; import it.eurix.archtools.workflow.plugin.WfPlugin.WfService; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.List; import java.util.Map; import javax.xml.parsers.DocumentBuilderFactory; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPReply; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Node; import eu.prestoprime.datamanagement.P4DataManager; @WfPlugin(name = "FPrintPlugin") public class FPrintTasks { private static final Logger logger = LoggerFactory.getLogger(FPrintTasks.class); @WfService(name = "fprint_upload", version = "0.8.0") public void upload(Map<String, String> sParams, Map<String, String> dParamsString, Map<String, File> dParamsFile) throws TaskExecutionFailedException { logger.debug("Called " + this.getClass().getName()); // prepare dynamic variables String id = dParamsString.get("id"); String targetName = id + ".webm"; String fileLocation = null; // prepare static variables String host = sParams.get("host"); int port = Integer.parseInt(sParams.get("port")); String username = sParams.get("username"); String password = sParams.get("password"); String workdir = sParams.get("workdir"); // retrieve AIP try { DIP dip = P4DataManager.getInstance().getDIPByID(id); List<String> fLocatList = dip.getAVMaterial("video/webm", "FILE"); fileLocation = fLocatList.get(0); } catch (DataException | IPException e) { e.printStackTrace(); throw new TaskExecutionFailedException("Unable to retrieve the fileLocation of the Master Quality..."); } logger.debug("Found video/webm location: " + fileLocation); // send to remote FTP folder FTPClient client = new FTPClient(); try { client.connect(host, port); if (FTPReply.isPositiveCompletion(client.getReplyCode())) { if (client.login(username, password)) { client.setFileType(FTP.BINARY_FILE_TYPE); if (client.changeWorkingDirectory(workdir)) { // TODO add behavior if file name is already present in // remote ftp folder // now OVERWRITES File file = new File(fileLocation); if (file.isFile()) { if (client.storeFile(targetName, new FileInputStream(file))) { logger.info("Stored file on server " + host + ":" + port + workdir); } else { throw new TaskExecutionFailedException("Cannot store file on server"); } } else { throw new TaskExecutionFailedException("Local file doesn't exist or is not acceptable"); } } else { throw new TaskExecutionFailedException("Cannot browse directory " + workdir + " on server"); } } else { throw new TaskExecutionFailedException("Username and Password not accepted by the server"); } } else { throw new TaskExecutionFailedException("Cannot establish connection with server " + host + ":" + port); } } catch (IOException e) { e.printStackTrace(); throw new TaskExecutionFailedException("General exception with FTPClient"); } logger.debug("Executed without errors " + this.getClass().getName()); } @WfService(name = "fprint_update", version = "0.8.0") public void update(Map<String, String> sParams, Map<String, String> dParamsString, Map<String, File> dParamsFile) throws TaskExecutionFailedException { // retrieve dynamic parameters String id = dParamsString.get("id"); File resultFile = dParamsFile.get("resultFile"); // update AIP try { // parse resultFile DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setNamespaceAware(true); Node node = dbf.newDocumentBuilder().parse(resultFile); // get AIP AIP aip = P4DataManager.getInstance().getAIPByID(id); // update AIP aip.updateSection(node, "fprint"); // release AIP P4DataManager.getInstance().releaseIP(aip); logger.debug("Updated FPrint section..."); } catch (Exception e) { throw new TaskExecutionFailedException("Unable to update AIP...\n" + e.getMessage()); } } }