eu.prestoprime.plugin.fprint.FPrintTasks.java Source code

Java tutorial

Introduction

Here is the source code for eu.prestoprime.plugin.fprint.FPrintTasks.java

Source

/**
 * 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());
        }
    }
}