@Path("/resubmitasync")
 @POST
 @Consumes("application/xml")
 @Produces("application/xml")
 public MessageResponse submitRecoverJobAsync(Message message) {
   MessageResponse response = new MessageResponse();
   String messageXML = MessageUtil.readRequestMessage(message);
   String expID = message.getHeader().getExperimentid();
   log.info(
       "Async Resuest recived from client at :"
           + new Date()
           + " : and assigned experiment id :"
           + expID
           + "with message "
           + messageXML);
   try {
     submitAsyncRequest(message);
   } catch (Exception e) {
     try {
       response.setMessage("Failed to submit job to gfac");
     } catch (Exception e1) {
       response.setStatus(ServiceConstants.ERROR);
       response.setMessage(e1.getLocalizedMessage());
     }
     response.setStatus(ServiceConstants.ERROR);
     response.setMessage(e.getLocalizedMessage());
   }
   response.setExperimentid(message.getHeader().getExperimentid());
   return response;
 }
  private void writeJobXML(String experimentID, Message message) throws Exception {
    try {
      String inputLocation = properties.getProperty(ServiceConstants.INPUTLOCATION);
      if (inputLocation == null) {
        inputLocation = ".";
      }
      File file = new File(inputLocation + File.separatorChar + experimentID);
      log.info("Input Location " + file.getAbsolutePath());
      if (file != null && !file.exists()) {
        file.mkdir();
      }
      File jobFile = new File(file.getAbsolutePath() + File.separator + "jobxmlfile.xml");
      String filePath = "file://" + jobFile.getAbsolutePath();
      Parameters parameters = new Parameters();
      parameters.setName("jobxml");
      parameters.setValue(filePath);
      message.getBody().getInput().getParameters().add(parameters);

      log.info("Job File Location " + jobFile.getAbsolutePath());
      BufferedWriter out = new BufferedWriter(new FileWriter(jobFile));
      out.write(MessageUtil.readRequestMessage(message));
      out.close();

    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      throw e;
    }
  }
 @Path("/sync")
 @POST
 @Consumes("application/xml")
 @Produces("application/xml")
 public MessageResponse submitJobSync(Message message) {
   if (message.getHeader().getExperimentid() == null
       || message.getHeader().getExperimentid().isEmpty()) {
     String newexpID = createExperimentID();
     message.getHeader().setExperimentid(newexpID);
   }
   String expID = message.getHeader().getExperimentid();
   MessageResponse response = new MessageResponse();
   String messageXML = MessageUtil.readRequestMessage(message);
   log.info(
       "Sync Resuest recived from client at :"
           + new Date()
           + " : and assigned experiment id :"
           + expID
           + "with message"
           + messageXML);
   try {
     insertExperimentStatus(
         expID,
         ServiceConstants.SUBMITTED,
         messageXML,
         message.getHeader().getCluster(),
         message.getHeader().getUs3Db());
     submitSyncRequest(message);
   } catch (Exception e) {
     try {
       updateExperimentStatus(expID, ServiceConstants.FAILED, e.getLocalizedMessage());
       response.setMessage("Failed to submit job to gfac");
     } catch (Exception e1) {
       response.setStatus(ServiceConstants.ERROR);
       response.setMessage(e1.getLocalizedMessage());
     }
     response.setStatus(ServiceConstants.ERROR);
     response.setMessage(e.getLocalizedMessage());
   }
   response.setExperimentid(expID);
   return response;
 }
 @Path("/async")
 @POST
 @Consumes("multipart/mixed")
 @Produces("application/xml")
 public MessageResponse submitJobAsync(MultiPart multiPart) {
   String messageXML = null;
   String expID = null;
   MessageResponse response = new MessageResponse();
   try {
     Message message = readMulipartData(multiPart);
     expID = message.getHeader().getExperimentid();
     messageXML = MessageUtil.readRequestMessage(message);
     log.info(
         "Async multipart resuest recived from client at :"
             + new Date()
             + " : and assigned experiment id :"
             + message.getHeader().getExperimentid()
             + "with message "
             + messageXML);
     insertExperimentStatus(
         expID,
         ServiceConstants.SUBMITTED,
         messageXML,
         message.getHeader().getCluster(),
         message.getHeader().getUs3Db());
     submitAsyncRequest(message);
   } catch (Exception e) {
     e.printStackTrace();
     try {
       updateExperimentStatus(
           expID, ServiceConstants.FAILED, "Failed to submit job :" + e.getMessage());
       response.setMessage("Failed to submit job to gfac" + e.getMessage());
     } catch (Exception e1) {
       response.setStatus(ServiceConstants.ERROR);
       response.setMessage(e.getLocalizedMessage());
     }
     response.setStatus(ServiceConstants.ERROR);
     response.setMessage(e.getLocalizedMessage());
   }
   response.setExperimentid(expID);
   return response;
 }
  private Message readMulipartData(MultiPart multiPart) throws Exception {
    Message message = multiPart.getBodyParts().get(0).getEntityAs(Message.class);
    InputStream inputStream = null;
    FileOutputStream outputStream = null;
    try {
      if (message.getHeader().getExperimentid() == null
          || message.getHeader().getExperimentid().isEmpty()) {
        String newexpID = createExperimentID();
        message.getHeader().setExperimentid(newexpID);
      }
      String expID = message.getHeader().getExperimentid();

      BodyPartEntity entity = (BodyPartEntity) multiPart.getBodyParts().get(1).getEntity();
      List<String> list =
          multiPart.getBodyParts().get(1).getHeaders().get("Content-Transfer-Encoding");
      if (list != null && list.contains("base64")) {
        log.info("Encoded data recieved from the server");
        inputStream = new Base64InputStream(entity.getInputStream());
      } else {
        log.info("Data recieved from the server");
        inputStream = entity.getInputStream();
      }
      String inputLocation = properties.getProperty(ServiceConstants.INPUTLOCATION);
      if (inputLocation == null) {
        inputLocation = ".";
      }
      File file = new File(inputLocation + File.separatorChar + expID);
      log.info("Input Location " + file.getAbsolutePath());
      if (file != null && !file.exists()) {
        file.mkdir();
      }
      File tarfile = new File(file.getAbsolutePath() + File.separator + "hpcinput.tar");
      outputStream = new FileOutputStream(tarfile);
      int i;
      while ((i = inputStream.read()) != -1) {
        outputStream.write(i);
      }
      String filePath = "file://" + tarfile.getAbsolutePath();
      Parameters parameters = new Parameters();
      parameters.setName("inputData");
      parameters.setValue(filePath);
      message.getBody().getInput().getParameters().add(parameters);
      writeJobXML(expID, message);
    } finally {
      if (multiPart != null) {
        multiPart.cleanup();
        multiPart.close();
      }
      if (inputStream != null) {
        inputStream.close();
      }
      if (outputStream != null) {
        outputStream.flush();
        outputStream.close();
      }
    }
    return message;
  }