String xlogin = getCNFromUserDN(userDN);
// create storage
StorageCreator storageCreator = new StorageCreator(secProperties, factoryUrl, 5, xlogin);
StorageClient sc = null;
try {
try {
sc = storageCreator.createStorage();
} catch (Exception e2) {
log.error("Cannot create storage..");
throw new GFacProviderException("Cannot create storage..", e2);
}
CreateActivityDocument cad = CreateActivityDocument.Factory.newInstance();
JobDefinitionDocument jobDefDoc = JobDefinitionDocument.Factory.newInstance();
JobDefinitionType jobDefinition = jobDefDoc.addNewJobDefinition();
try {
jobDefinition = JSDLGenerator.buildJSDLInstance(jobExecutionContext, sc.getUrl()).getJobDefinition();
cad.addNewCreateActivity().addNewActivityDocument().setJobDefinition(jobDefinition);
log.info("JSDL" + jobDefDoc.toString());
} catch (Exception e1) {
throw new GFacProviderException("Cannot generate JSDL instance from the JobExecutionContext.", e1);
}
// upload files if any
DataTransferrer dt = new DataTransferrer(jobExecutionContext, sc);
dt.uploadLocalFiles();
FactoryClient factory = null;
try {
factory = new FactoryClient(eprt, secProperties);
} catch (Exception e) {
throw new GFacProviderException(e.getLocalizedMessage(), e);
}
CreateActivityResponseDocument response = null;
try {
log.info(String.format("Activity Submitting to %s ... \n", factoryUrl));
response = factory.createActivity(cad);
log.info(String.format("Activity Submitted to %s \n", factoryUrl));
} catch (Exception e) {
throw new GFacProviderException("Cannot create activity.", e);
}
EndpointReferenceType activityEpr = response.getCreateActivityResponse().getActivityIdentifier();
log.info("Activity : " + activityEpr.getAddress().getStringValue() + " Submitted.");
// factory.waitWhileActivityIsDone(activityEpr, 1000);
jobId = WSUtilities.extractResourceID(activityEpr);
if (jobId == null) {
jobId = new Long(Calendar.getInstance().getTimeInMillis()).toString();
}
log.info("JobID: " + jobId);
jobExecutionContext.getNotifier().publish(new UnicoreJobIDEvent(jobId));
saveApplicationJob(jobExecutionContext, jobDefinition, activityEpr.toString());
factory.getActivityStatus(activityEpr);
log.info(formatStatusMessage(activityEpr.getAddress().getStringValue(),
factory.getActivityStatus(activityEpr).toString()));
// TODO publish the status messages to the message bus
while ((factory.getActivityStatus(activityEpr) != ActivityStateEnumeration.FINISHED)
&& (factory.getActivityStatus(activityEpr) != ActivityStateEnumeration.FAILED)
&& (factory.getActivityStatus(activityEpr) != ActivityStateEnumeration.CANCELLED)) {
ActivityStatusType activityStatus = null;
try {
activityStatus = getStatus(factory, activityEpr);
JobState jobStatus = getApplicationJobStatus(activityStatus);
String jobStatusMessage = "Status of job " + jobId + "is " + jobStatus;
jobExecutionContext.getNotifier().publish(new StatusChangeEvent(jobStatusMessage));
details.setJobID(jobId);
GFacUtils.updateJobStatus(jobExecutionContext, details, jobStatus);
} catch (UnknownActivityIdentifierFault e) {
throw new GFacProviderException(e.getMessage(), e.getCause());
}catch (GFacException e) {
throw new GFacProviderException(e.getMessage(), e.getCause());
}
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
continue;
}
ActivityStatusType activityStatus = null;
try {
activityStatus = getStatus(factory, activityEpr);
} catch (UnknownActivityIdentifierFault e) {
throw new GFacProviderException(e.getMessage(), e.getCause());
}
log.info(formatStatusMessage(activityEpr.getAddress().getStringValue(), activityStatus.getState()
.toString()));
if ((activityStatus.getState() == ActivityStateEnumeration.FAILED)) {
String error = activityStatus.getFault().getFaultcode().getLocalPart() + "\n"
+ activityStatus.getFault().getFaultstring() + "\n EXITCODE: " + activityStatus.getExitCode();
log.info(error);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
dt.downloadStdOuts();
} else if (activityStatus.getState() == ActivityStateEnumeration.CANCELLED) {
String experimentID = (String) jobExecutionContext.getProperty(Constants.PROP_TOPIC);
JobState jobStatus = JobState.CANCELED;
String jobStatusMessage = "Status of job " + jobId + "is " + jobStatus;
jobExecutionContext.getNotifier().publish(new StatusChangeEvent(jobStatusMessage));
details.setJobID(jobId);
try {
GFacUtils.saveJobStatus(jobExecutionContext,details, jobStatus);
} catch (GFacException e) {
throw new GFacProviderException(e.getLocalizedMessage(),e);
}
throw new GFacProviderException(experimentID + "Job Canceled");
}
else if (activityStatus.getState() == ActivityStateEnumeration.FINISHED) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
if (activityStatus.getExitCode() == 0) {
dt.downloadRemoteFiles();
} else {
dt.downloadStdOuts();
}
}
} catch (UnknownActivityIdentifierFault e1) {
throw new GFacProviderException(e1.getLocalizedMessage(), e1);
} finally {
// destroy sms instance
try {
if (sc != null) {
sc.destroy();
}
} catch (Exception e) {
log.warn("Cannot destroy temporary SMS instance:" + sc.getUrl(), e);
}
}
}