@RvdAuth
 @PUT
 @Path("{name}/rename")
 public Response renameProject(
     @PathParam("name") String projectName,
     @QueryParam("newName") String projectNewName,
     @QueryParam("ticket") String ticket)
     throws StorageException, ProjectDoesNotExist {
   if (!RvdUtils.isEmpty(projectName) && !RvdUtils.isEmpty(projectNewName)) {
     assertProjectAvailable(projectName);
     try {
       ProjectApplicationsApi applicationsApi =
           new ProjectApplicationsApi(servletContext, workspaceStorage, marshaler);
       applicationsApi.renameApplication(ticket, projectName, projectNewName);
       projectService.renameProject(projectName, projectNewName);
       return Response.ok().build();
     } catch (ProjectDirectoryAlreadyExists e) {
       logger.error(e.getMessage(), e);
       return Response.status(Status.CONFLICT).build();
     } catch (StorageException e) {
       return Response.status(Status.INTERNAL_SERVER_ERROR).build();
     } catch (ApplicationAlreadyExists e) {
       return Response.status(Status.CONFLICT).build();
     } catch (ApplicationsApiSyncException e) {
       logger.error(e.getMessage(), e);
       return Response.status(Status.INTERNAL_SERVER_ERROR).build();
     }
   } else return Response.status(Status.BAD_REQUEST).build();
 }
  @RvdAuth
  @PUT
  @Path("{name}")
  public Response createProject(
      @PathParam("name") String name,
      @QueryParam("kind") String kind,
      @QueryParam("ticket") String ticket) {
    Principal loggedUser = securityContext.getUserPrincipal();
    ProjectApplicationsApi applicationsApi = null;

    logger.info("Creating project " + name);
    try {
      applicationsApi = new ProjectApplicationsApi(servletContext, workspaceStorage, marshaler);
      applicationsApi.createApplication(ticket, name, kind);
      ProjectState projectState = projectService.createProject(name, kind, loggedUser.getName());
      BuildService buildService = new BuildService(workspaceStorage);
      buildService.buildProject(name, projectState);
    } catch (ProjectAlreadyExists e) {
      logger.error(e.getMessage(), e);
      try {
        applicationsApi.rollbackCreateApplication(ticket, name);
      } catch (ApplicationsApiSyncException e1) {
        logger.error(e1.getMessage(), e1);
        return Response.status(Status.INTERNAL_SERVER_ERROR).build();
      }
      return Response.status(Status.CONFLICT).build();
    } catch (StorageException e) {
      logger.error(e.getMessage(), e);
      return Response.status(Status.INTERNAL_SERVER_ERROR).build();
    } catch (InvalidServiceParameters e) {
      logger.error(e);
      return Response.status(Status.BAD_REQUEST).build();
    } catch (ApplicationAlreadyExists e) {
      logger.error(e.getMessage(), e);
      return Response.status(Status.CONFLICT).build();
    } catch (ApplicationsApiSyncException e) {
      logger.error(e.getMessage(), e);
      return Response.status(Status.INTERNAL_SERVER_ERROR).build();
    } catch (UnsupportedEncodingException e) {
      logger.error(e.getMessage(), e);
      return Response.status(Status.INTERNAL_SERVER_ERROR).build();
    }

    return Response.ok().build();
  }
  @RvdAuth
  @POST
  // @Path("{name}/archive")
  public Response importProjectArchive(
      @Context HttpServletRequest request, @QueryParam("ticket") String ticket) {
    logger.info("Importing project from raw archive");
    ProjectApplicationsApi applicationsApi = null;
    String projectName = null;

    try {
      if (request.getHeader("Content-Type") != null
          && request.getHeader("Content-Type").startsWith("multipart/form-data")) {
        Gson gson = new Gson();
        ServletFileUpload upload = new ServletFileUpload();
        FileItemIterator iterator = upload.getItemIterator(request);

        JsonArray fileinfos = new JsonArray();

        while (iterator.hasNext()) {
          FileItemStream item = iterator.next();
          JsonObject fileinfo = new JsonObject();
          fileinfo.addProperty("fieldName", item.getFieldName());

          // is this a file part (talking about multipart requests, there might be parts that are
          // not actual files).
          // They will be ignored
          if (item.getName() != null) {
            String effectiveProjectName =
                projectService.importProjectFromArchive(item.openStream(), item.getName());
            // buildService.buildProject(effectiveProjectName);

            // Load project kind
            String projectString =
                FsProjectStorage.loadProjectString(effectiveProjectName, workspaceStorage);
            ProjectState state = marshaler.toModel(projectString, ProjectState.class);
            String projectKind = state.getHeader().getProjectKind();
            projectName = effectiveProjectName;

            // Create application
            applicationsApi =
                new ProjectApplicationsApi(servletContext, workspaceStorage, marshaler);
            applicationsApi.createApplication(ticket, effectiveProjectName, projectKind);

            fileinfo.addProperty("name", item.getName());
            fileinfo.addProperty("projectName", effectiveProjectName);
          }
          if (item.getName() == null) {
            logger.warn("non-file part found in upload");
            fileinfo.addProperty("value", read(item.openStream()));
          }
          fileinfos.add(fileinfo);
        }
        return Response.ok(gson.toJson(fileinfos), MediaType.APPLICATION_JSON).build();
      } else {
        String json_response = "{\"result\":[{\"size\":" + size(request.getInputStream()) + "}]}";
        return Response.ok(json_response, MediaType.APPLICATION_JSON).build();
      }
    } catch (StorageException e) {
      logger.warn(e, e);
      logger.debug(e, e);
      return buildErrorResponse(Status.BAD_REQUEST, RvdResponse.Status.ERROR, e);
    } catch (ApplicationAlreadyExists e) {
      logger.warn(e, e);
      logger.debug(e, e);
      try {
        applicationsApi.rollbackCreateApplication(ticket, projectName);
      } catch (ApplicationsApiSyncException e1) {
        logger.error(e1.getMessage(), e1);
        return buildErrorResponse(Status.INTERNAL_SERVER_ERROR, RvdResponse.Status.ERROR, e);
      }
      return buildErrorResponse(Status.CONFLICT, RvdResponse.Status.ERROR, e);
    } catch (Exception e /* TODO - use a more specific type !!! */) {
      logger.error(e.getMessage(), e);
      return Response.status(Status.INTERNAL_SERVER_ERROR).build();
    }
  }