}
else {
//TODO
}
GridFtp ftp = new GridFtp();
File localStdErrFile = null;
Map<String, ActualParameter> stringMap = new HashMap<String, ActualParameter>();
DataTransferDetails detail = new DataTransferDetails();
TransferStatus status = new TransferStatus();
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 = GramProviderUtils.createGsiftpURI(endpoint, app.getStandardOutput());
URI stderrURI = GramProviderUtils.createGsiftpURI(endpoint, app.getStandardError());
status.setTransferState(TransferState.COMPLETE);
detail.setTransferStatus(status);
detail.setTransferDescription("STDOUT:" + stdoutURI.toString());
registry.add(ChildDataType.DATA_TRANSFER_DETAIL,detail, jobExecutionContext.getTaskData().getTaskID());
status.setTransferState(TransferState.COMPLETE);
detail.setTransferStatus(status);
detail.setTransferDescription("STDERR:" + stderrURI.toString());
registry.add(ChildDataType.DATA_TRANSFER_DETAIL,detail, jobExecutionContext.getTaskData().getTaskID());
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());
}
List<DataObjectType> outputArray = new ArrayList<DataObjectType>();
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 = GramProviderUtils.createGsiftpURI(endpoint, app.getOutputDataDirectory());
List<String> outputList = ftp.listDir(outputURI, gssCred);
String[] valueList = outputList.toArray(new String[outputList.size()]);
((URIArrayType) actualParameter.getType()).setValueArray(valueList);
stringMap.put(paramName, actualParameter);
}else if ("StringArray".equals(actualParameter.getType().getType().toString())) {
String[] valueList = OutputUtils.parseStdoutArray(stdout, paramName);
((StringArrayType) actualParameter.getType()).setValueArray(valueList);
stringMap.put(paramName, actualParameter);
} else if ("URI".equals(actualParameter.getType().getType().toString())) {
URI outputURI = GramProviderUtils.createGsiftpURI(endpoint, app.getOutputDataDirectory());
List<String> outputList = ftp.listDir(outputURI, gssCred);
if (outputList.size() == 0 || outputList.get(0).isEmpty()) {
OutputUtils.fillOutputFromStdout(output, stdout, stderr,outputArray);
} else {
String valueList = outputList.get(0);
((URIParameterType) actualParameter.getType()).setValue(valueList);