}
else {
//TODO
}
GridFtp ftp = new GridFtp();
File localStdErrFile = null;
Map<String, ActualParameter> stringMap = new HashMap<String, ActualParameter>();
try {
GSSCredential gssCred = ((GSISecurityContext)jobExecutionContext.getSecurityContext(GSISecurityContext.GSI_SECURITY_CONTEXT)).getGssCredentials();
String[] hostgridFTP = gridFTPEndpointArray;
if (hostgridFTP == null || hostgridFTP.length == 0) {
hostgridFTP = new String[]{hostName};
}
for (String endpoint : gridFTPEndpointArray) {
try {
/*
* Read Stdout and Stderror
*/
URI stdoutURI = GFacUtils.createGsiftpURI(endpoint, app.getStandardOutput());
URI stderrURI = GFacUtils.createGsiftpURI(endpoint, app.getStandardError());
log.info("STDOUT:" + stdoutURI.toString());
log.info("STDERR:" + stderrURI.toString());
File logDir = new File("./service_logs");
if (!logDir.exists()) {
logDir.mkdir();
}
String timeStampedServiceName = GFacUtils.createUniqueNameForService(jobExecutionContext
.getServiceName());
File localStdOutFile = File.createTempFile(timeStampedServiceName, "stdout");
localStdErrFile = File.createTempFile(timeStampedServiceName, "stderr");
String stdout = null;
String stderr = null;
// TODO: what if job is failed
// and this handler is not able to find std* files?
try {
stdout = ftp.readRemoteFile(stdoutURI, gssCred, localStdOutFile);
stderr = ftp.readRemoteFile(stderrURI, gssCred, localStdErrFile);
//TODO: do we also need to set them as output parameters for another job
ApplicationDescription application = jobExecutionContext.getApplicationContext().getApplicationDeploymentDescription();
ApplicationDeploymentDescriptionType appDesc = application.getType();
appDesc.setStandardOutput(stdout);
appDesc.setStandardError(stderr);
jobExecutionContext.getApplicationContext().setApplicationDeploymentDescription(application);
}
catch(ToolsException e) {
log.error("Cannot download stdout/err files. One reason could be the job is not successfully finished: "+e.getMessage());
}
Map<String, Object> output = jobExecutionContext.getOutMessageContext().getParameters();
Set<String> keys = output.keySet();
for (String paramName : keys) {
ActualParameter actualParameter = (ActualParameter) output.get(paramName);
if ("URIArray".equals(actualParameter.getType().getType().toString())) {
URI outputURI = GFacUtils.createGsiftpURI(endpoint, app.getOutputDataDirectory());
List<String> outputList = ftp.listDir(outputURI, gssCred);
String[] valueList = outputList.toArray(new String[outputList.size()]);
((URIArrayType) actualParameter.getType()).setValueArray(valueList);
// why to instantiate new instance?
// stringMap = new HashMap<String, ActualParameter>();
stringMap.put(paramName, actualParameter);
}else if ("StringArray".equals(actualParameter.getType().getType().toString())) {
String[] valueList = OutputUtils.parseStdoutArray(stdout, paramName);
((StringArrayType) actualParameter.getType()).setValueArray(valueList);
// stringMap = new HashMap<String, ActualParameter>();
stringMap.put(paramName, actualParameter);
} else if ("URI".equals(actualParameter.getType().getType().toString())) {
URI outputURI = GFacUtils.createGsiftpURI(endpoint, app.getOutputDataDirectory());
List<String> outputList = ftp.listDir(outputURI, gssCred);
if (outputList.size() == 0 || outputList.get(0).isEmpty()) {
stringMap = OutputUtils.fillOutputFromStdout(output, stdout, stderr);
} else {
String valueList = outputList.get(0);
((URIParameterType) actualParameter.getType()).setValue(valueList);