/**
   * 파일을 업로드한다.
   *
   * @return REST Response JAXB Object
   */
  @RequestMapping(
      value = "/upload",
      method = RequestMethod.POST,
      consumes = {"multipart/form-data"})
  @ResponseStatus(HttpStatus.OK)
  public ResponseEntity<String> upload(HttpServletRequest req) throws IOException {
    Response response = new Response();

    if (!(req instanceof DefaultMultipartHttpServletRequest)) {
      response.setSuccess(false);
      response.getError().setCause("Invalid Request.");
      response.getError().setMessage("Invalid Request.");
      String json = new ObjectMapper().writeValueAsString(response);
      return new ResponseEntity(json, HttpStatus.BAD_REQUEST);
    }

    try {
      DefaultMultipartHttpServletRequest request = (DefaultMultipartHttpServletRequest) req;
      logger.debug(
          "Uploaded File >> Path : {}, Filename : {}, Size: {} bytes",
          new Object[] {
            request.getParameter("path"),
            request.getFile("file").getOriginalFilename(),
            request.getFile("file").getSize()
          });

      String clusterName = request.getParameter("clusterName");
      Map params = new HashMap();

      EngineService engineService = this.getEngineService(clusterName);
      VisualService service = engineService.getVisualService();
      Map resultMap = service.saveFile(request.getFile("file"), request.getParameter("options"));

      response.getMap().putAll(resultMap);
      response.setSuccess(true);
      String json = new ObjectMapper().writeValueAsString(response);
      HttpStatus statusCode = HttpStatus.OK;
      return new ResponseEntity(json, statusCode);
    } catch (Exception ex) {
      response.setSuccess(false);
      response.getError().setMessage(ex.getMessage());
      if (ex.getCause() != null) response.getError().setCause(ex.getCause().getMessage());
      response.getError().setException(ExceptionUtils.getFullStackTrace(ex));

      String json = new ObjectMapper().writeValueAsString(response);
      HttpStatus statusCode = HttpStatus.INTERNAL_SERVER_ERROR;

      logger.debug(ExceptionUtils.getFullStackTrace(ex));

      return new ResponseEntity(json, statusCode);
    }
  }
  @RequestMapping(value = "/listVariablesHdfs", method = RequestMethod.POST)
  @ResponseStatus(HttpStatus.OK)
  public Response listVariablesHdfs(@RequestBody Map params) {

    Response response = new Response();
    try {
      String clusterName = params.get("clusterName").toString();
      EngineService engineService = this.getEngineService(clusterName);

      VisualService service = engineService.getVisualService();
      Map resultMap = service.listVariablesHdfs(params);

      if ((boolean) resultMap.get("success")) {
        response.setSuccess(true);
        response.getMap().putAll(resultMap);
      } else {
        response.setSuccess(false);
      }

    } catch (Exception ex) {
      response.setSuccess(false);
      response.getError().setMessage(ex.getMessage());
      if (ex.getCause() != null) response.getError().setCause(ex.getCause().getMessage());
      response.getError().setException(ExceptionUtils.getFullStackTrace(ex));
      logger.info(ex.toString());
    }
    return response;
  }
  @RequestMapping(value = "/task/log", method = RequestMethod.GET)
  @ResponseStatus(HttpStatus.OK)
  public Response getTaskLog(
      @RequestParam(defaultValue = "") String clusterName,
      @RequestParam(defaultValue = "") Long id) {
    EngineService engineService = getEngineService(clusterName);

    Response response = new Response();
    try {
      TaskHistory taskHistories = engineService.getTaskHistoryRemoteService().select(id);
      String filename = null;
      String task = taskHistories.getLogDirectory() + "/task.log";
      if (new File(task).exists() && new File(task).length() == 0) {
        String err = taskHistories.getLogDirectory() + "/err.log";
        if (new File(err).exists()) {
          filename = err;
        }
      } else {
        filename = task;
      }

      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      FileUtils.copyFile(new File(filename), baos);
      response.getMap().put("text", new String(baos.toByteArray()));
      response.setSuccess(true);
    } catch (Exception ex) {
      // FIXME 여기 WholeBodyException을 수정해야하지 않을까??
      response.setSuccess(false);
      response.getError().setMessage("Unable to load a log file.");
      response.getError().setException(ExceptionUtils.getFullStackTrace(ex));
      if (ex.getCause() != null) response.getError().setCause(ex.getCause().getMessage());
    }
    return response;
  }