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