@POST
  @Path("/syncronizeDashboard")
  @Produces(MimeTypes.JSON)
  public String syncronize(
      @FormParam(MethodParams.FILE) @DefaultValue("") String file,
      @FormParam(MethodParams.PATH) @DefaultValue("") String path,
      @FormParam(MethodParams.TITLE) @DefaultValue("") String title,
      @FormParam(MethodParams.AUTHOR) @DefaultValue("") String author,
      @FormParam(MethodParams.DESCRIPTION) @DefaultValue("") String description,
      @FormParam(MethodParams.STYLE) @DefaultValue("") String style,
      @FormParam(MethodParams.WIDGET_NAME) @DefaultValue("") String widgetName,
      @FormParam(MethodParams.WIDGET) boolean widget,
      @FormParam(MethodParams.RENDERER_TYPE) @DefaultValue("") String rendererType,
      @FormParam(MethodParams.WIDGET_PARAMETERS) List<String> widgetParams,
      @FormParam(MethodParams.DASHBOARD_STRUCTURE) String cdfStructure,
      @FormParam(MethodParams.OPERATION) String operation,
      @FormParam(MethodParams.REQUIRE) boolean require,
      @Context HttpServletRequest request,
      @Context HttpServletResponse response)
      throws Exception {

    boolean isPreview = false;

    if (!file.isEmpty() && !file.equals(UNSAVED_FILE_PATH)) {

      file = Utils.getURLDecoded(file, CharsetHelper.getEncoding());

      // check access to path folder
      String fileDir =
          file.contains(".wcdf") || file.contains(".cdfde")
              ? file.substring(0, file.lastIndexOf("/"))
              : file;

      isPreview = (file.contains("_tmp.cdfde") || file.contains("_tmp.wcdf"));

      IReadAccess rwAccess = Utils.getSystemOrUserRWAccess(file);

      if (rwAccess == null) {
        String msg =
            "Access denied for the syncronize method syncronizeDashboard."
                + operation
                + " : "
                + file;
        logger.warn(msg);
        return JsonUtils.getJsonResult(false, msg);
      }
    }

    try {
      final DashboardStructure dashboardStructure = new DashboardStructure();
      Object result = null;
      HashMap<String, Object> params = new HashMap<String, Object>();
      params.put(MethodParams.FILE, file);
      params.put(MethodParams.WIDGET, String.valueOf(widget));
      params.put(MethodParams.REQUIRE, String.valueOf(require));
      if (!author.isEmpty()) {
        params.put(MethodParams.AUTHOR, author);
      }
      if (!style.isEmpty()) {
        params.put(MethodParams.STYLE, style);
      }
      if (!widgetName.isEmpty()) {
        params.put(MethodParams.WIDGET_NAME, widgetName);
      }
      if (!rendererType.isEmpty()) {
        params.put(MethodParams.RENDERER_TYPE, rendererType);
      }
      if (!title.isEmpty()) {
        params.put(MethodParams.TITLE, title);
      }
      if (!description.isEmpty()) {
        params.put(MethodParams.DESCRIPTION, description);
      }
      String[] widgetParameters = widgetParams.toArray(new String[0]);
      if (widgetParameters.length > 0) {
        params.put(MethodParams.WIDGET_PARAMETERS, widgetParameters);
      }

      String wcdfdeFile = file.replace(".wcdf", ".cdfde");

      if (OPERATION_LOAD.equalsIgnoreCase(operation)) {
        return dashboardStructure.load(wcdfdeFile);
      } else if (OPERATION_DELETE.equalsIgnoreCase(operation)) {
        dashboardStructure.delete(params);
      } else if (OPERATION_DELETE_PREVIEW.equalsIgnoreCase(operation)) {
        dashboardStructure.deletePreviewFiles(wcdfdeFile);
      } else if (OPERATION_SAVE.equalsIgnoreCase(operation)) {
        result = dashboardStructure.save(file, cdfStructure);
      } else if (OPERATION_SAVE_AS.equalsIgnoreCase(operation)) {
        if (StringUtils.isEmpty(title)) {
          title = FilenameUtils.getBaseName(file);
        }
        result = dashboardStructure.saveAs(file, title, description, cdfStructure, isPreview);
      } else if (OPERATION_NEW_FILE.equalsIgnoreCase(operation)) {
        dashboardStructure.newfile(params);
      } else if (OPERATION_SAVE_SETTINGS.equalsIgnoreCase(operation)) {

        // check if user is attempting to save settings over a new (non yet saved)
        // dashboard/widget/template
        if (StringUtils.isEmpty(file) || file.equals(UNSAVED_FILE_PATH)) {
          logger.warn(getMessage("CdfTemplates.ERROR_003_SAVE_DASHBOARD_FIRST"));
          return JsonUtils.getJsonResult(
              false, getMessage("CdfTemplates.ERROR_003_SAVE_DASHBOARD_FIRST"));
        }
        dashboardStructure.savesettings(params);
      } else {
        logger.error("Unknown operation: " + operation);
      }
      return JsonUtils.getJsonResult(true, result);
    } catch (Exception e) {
      if (e.getCause() != null) {
        if (e.getCause() instanceof DashboardStructureException) {
          JsonUtils.buildJsonResult(response.getOutputStream(), false, e.getCause().getMessage());
        } else if (e instanceof InvocationTargetException) {
          throw (Exception) e.getCause();
        }
      }
      throw e;
    }
  }
  @POST
  @Path("/saveDashboard")
  @Produces(MimeTypes.JSON)
  @Consumes("multipart/form-data")
  public String saveDashboard(
      @FormDataParam(MethodParams.FILE) @DefaultValue("") String file,
      @FormDataParam(MethodParams.TITLE) @DefaultValue("") String title,
      @FormDataParam(MethodParams.DESCRIPTION) @DefaultValue("") String description,
      @FormDataParam(MethodParams.DASHBOARD_STRUCTURE) String cdfStructure,
      @FormDataParam(MethodParams.OPERATION) String operation,
      @Context HttpServletResponse response)
      throws Exception {

    boolean isPreview = false;

    if (!file.isEmpty()
        && !(file.equals(UNSAVED_FILE_PATH)
            || Utils.getURLDecoded(file).equals(UNSAVED_FILE_PATH))) {

      file = Utils.getURLDecoded(file, CharsetHelper.getEncoding());

      if (StringUtils.isEmpty(title)) {
        title = FilenameUtils.getBaseName(file);
      }

      // check access to path folder
      String fileDir =
          file.contains(".wcdf") || file.contains(".cdfde")
              ? file.substring(0, file.lastIndexOf("/"))
              : file;

      isPreview = (file.contains("_tmp.cdfde") || file.contains("_tmp.wcdf"));

      IReadAccess rwAccess;
      if (OPERATION_SAVE_AS.equalsIgnoreCase(operation) && !isPreview) {
        rwAccess = Utils.getSystemOrUserRWAccess(fileDir);
      } else {
        rwAccess = Utils.getSystemOrUserRWAccess(file);
      }

      if (rwAccess == null) {
        String msg =
            "Access denied for the syncronize method saveDashboard." + operation + " : " + file;
        logger.warn(msg);
        return JsonUtils.getJsonResult(false, msg);
      }
    }

    try {
      final DashboardStructure dashboardStructure = new DashboardStructure();
      Object result = null;

      if (OPERATION_SAVE.equalsIgnoreCase(operation)) {
        result = dashboardStructure.save(file, cdfStructure);
      } else if (OPERATION_SAVE_AS.equalsIgnoreCase(operation)) {
        result = dashboardStructure.saveAs(file, title, description, cdfStructure, isPreview);
      } else {
        logger.error("Unknown operation: " + operation);
      }
      return JsonUtils.getJsonResult(true, result);
    } catch (Exception e) {
      if (e.getCause() != null) {
        if (e.getCause() instanceof DashboardStructureException) {
          JsonUtils.buildJsonResult(response.getOutputStream(), false, e.getCause().getMessage());
        } else if (e instanceof InvocationTargetException) {
          throw (Exception) e.getCause();
        }
      }
      throw e;
    }
  }