eu.prestoprime.p4gui.connection.WorkflowConnection.java Source code

Java tutorial

Introduction

Here is the source code for eu.prestoprime.p4gui.connection.WorkflowConnection.java

Source

/**
 * WorkflowConnection.java
 * Author: Francesco Rosso (rosso@eurix.it)
 * 
 * This file is part of PrestoPRIME Preservation Platform (P4).
 * 
 * Copyright (C) 2009-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.p4gui.connection;

import it.eurix.archtools.workflow.jaxb.StatusType;
import it.eurix.archtools.workflow.jaxb.WfDescriptor;
import it.eurix.archtools.workflow.jaxb.WfStatus;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

import javax.xml.bind.JAXBException;
import javax.xml.datatype.DatatypeFactory;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.StringBody;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import eu.prestoprime.model.ModelUtils;
import eu.prestoprime.model.ModelUtils.P4JAXBPackage;
import eu.prestoprime.p4gui.model.JobList;
import eu.prestoprime.p4gui.model.P4Service;
import eu.prestoprime.p4gui.services.workflow.WorkflowRequestException;

public abstract class WorkflowConnection {

    private static final Logger logger = LoggerFactory.getLogger(WorkflowConnection.class);

    public static class P4Workflow {

        private String wfID;

        private P4Workflow(String wfID) {
            this.wfID = wfID;
        }

        public static P4Workflow valueOf(String wfID) {
            // TODO check workflow availability
            return new P4Workflow(wfID);
        }

        @Override
        public String toString() {
            return wfID;
        }
    }

    public static WfDescriptor getWfDescriptor(P4Service service) {

        String path = service.getURL() + "/wf/descriptor";

        try {
            P4HttpClient client = new P4HttpClient(service.getUserID());
            HttpRequestBase request = new HttpGet(path);
            HttpResponse response = client.executeRequest(request);
            HttpEntity entity = response.getEntity();
            if (entity != null) {
                WfDescriptor descriptor = (WfDescriptor) ModelUtils.getUnmarshaller(P4JAXBPackage.CONF)
                        .unmarshal(entity.getContent());
                return descriptor;
            }
        } catch (JAXBException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new WfDescriptor();
    }

    public static String executeWorkflow(P4Service service, P4Workflow workflow, Map<String, String> dParamsString,
            Map<String, File> dParamsFile) throws WorkflowRequestException {

        if (dParamsString == null)
            dParamsString = new HashMap<>();
        if (dParamsFile == null)
            dParamsFile = new HashMap<>();

        dParamsString.put("wfID", workflow.toString());

        try {
            MultipartEntity part = new MultipartEntity();

            for (String key : dParamsString.keySet()) {
                String value = dParamsString.get(key);
                part.addPart(key, new StringBody(value));
            }

            for (String key : dParamsFile.keySet()) {
                File value = dParamsFile.get(key);
                part.addPart(key, new FileBody(value));
            }

            String path = service.getURL() + "/wf/execute/" + workflow;

            logger.debug("Calling " + path);

            P4HttpClient client = new P4HttpClient(service.getUserID());
            HttpRequestBase request = new HttpPost(path);
            request.setHeader("content-data", "multipart/form-data");
            ((HttpPost) request).setEntity(part);
            HttpResponse response = client.executeRequest(request);
            if (response.getStatusLine().getStatusCode() == 200) {
                HttpEntity entity = response.getEntity();
                if (entity != null) {
                    BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent()));
                    String line;
                    if ((line = reader.readLine()) != null) {
                        logger.debug("Requested new job: " + line);
                        return line;
                    }
                }
            } else {
                logger.debug(response.getStatusLine().toString());
                throw new WorkflowRequestException("Unable to request execution of workflow " + workflow + "...");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        throw new WorkflowRequestException(
                "Something wrong in WorkflowConnection requesting a workflow: no wfID returned...");
    }

    public static JobList getMyJobs(P4Service service) {
        JobList jobList = new JobList();
        try {
            String path = service.getURL() + "/wf/myjobs";
            P4HttpClient client = new P4HttpClient(service.getUserID());
            HttpRequestBase request = new HttpGet(path);
            HttpEntity entity = client.executeRequest(request).getEntity();
            if (entity != null) {
                BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent()));
                String line;
                while ((line = reader.readLine()) != null) {
                    String[] fields = line.split("\\t");
                    jobList.addJob(jobList.new Job(fields[0], // jobID
                            StatusType.valueOf(fields[1].toUpperCase()), // status
                            fields[2], // wfID
                            fields[3].equals("") ? null
                                    : DatatypeFactory.newInstance().newXMLGregorianCalendar(fields[3]), // startup
                            fields[4].equals("") ? 0L : Long.parseLong(fields[4]), // duration
                            Integer.parseInt(fields[5]), // totalSteps
                            Integer.parseInt(fields[6]), // lastCompletedStep
                            fields.length < 8 ? null : fields[7])); // lastCompletedService
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return jobList;
    }

    public static WfStatus getWorkflowStatus(P4Service service, String id) {
        String path = service.getURL() + "/wf/" + id + "/status";

        try {
            P4HttpClient client = new P4HttpClient(service.getUserID());
            HttpRequestBase request = new HttpGet(path);
            HttpResponse response = client.executeRequest(request);
            HttpEntity entity = response.getEntity();

            BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent()));
            StringBuffer sb = new StringBuffer();
            String line;
            while ((line = reader.readLine()) != null)
                sb.append(line.trim());

            // parse wfStatus
            return (WfStatus) ModelUtils.getUnmarshaller(P4JAXBPackage.CONF)
                    .unmarshal(new ByteArrayInputStream(sb.toString().getBytes()));
        } catch (IOException | JAXBException e) {
            e.printStackTrace();
            return new WfStatus();
        }
    }

    public static void deleteWorkflowStatus(P4Service service, String id) throws WorkflowRequestException {
        String path = service.getURL() + "/wf/" + id + "/status";

        try {
            P4HttpClient client = new P4HttpClient(service.getUserID());
            HttpRequestBase request = new HttpDelete(path);
            HttpResponse response = client.executeRequest(request);

            if (response.getStatusLine().getStatusCode() == 200)
                return;
            else
                throw new WorkflowRequestException("Unable to delete this wfStatus...");
        } catch (IOException e) {
            e.printStackTrace();
            throw new WorkflowRequestException("Unable to execute request...");
        }
    }
}