@POST
  @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
  public Response action(
      @Context HttpServletRequest httpRequest,
      @FormParam("csrfToken") String csrfToken,
      @FormParam("key") @DefaultValue("") String key,
      @FormParam("name") @DefaultValue("") String name,
      @FormParam("description") @DefaultValue("") String description,
      @FormParam("rollback") @DefaultValue("") String rollback,
      @FormParam("version") @DefaultValue("") String version,
      @FormParam("upgrade") @DefaultValue("") String upgrade,
      @FormParam("repository") @DefaultValue("") String repository,
      @FormParam("email") @DefaultValue("") String email,
      @FormParam("autoRelease") @DefaultValue("false") boolean autoRelease,
      @FormParam("action") @DefaultValue("") String action) {

    return shiroRequestHelper.csrfCall(
        csrfToken,
        "releases/action",
        (csrfToken1) -> {
          if (action.startsWith("export")) {
            String export =
                pluginRegion.doExport(
                    new ReleasesPluginRegionInput(
                        key,
                        name,
                        description,
                        rollback,
                        version,
                        upgrade,
                        repository,
                        email,
                        autoRelease,
                        "export"),
                    httpRequest.getRemoteUser());
            return Response.ok(export, MediaType.APPLICATION_OCTET_STREAM_TYPE);
          } else {
            String rendered =
                soyService.renderPlugin(
                    httpRequest.getRemoteUser(),
                    csrfToken1,
                    pluginRegion,
                    new ReleasesPluginRegionInput(
                        key,
                        name,
                        description,
                        rollback,
                        version,
                        upgrade,
                        repository,
                        email,
                        autoRelease,
                        action));
            return Response.ok(rendered, MediaType.TEXT_HTML);
          }
        });
  }
 @GET
 @Produces(MediaType.TEXT_HTML)
 @Path("/scm")
 public Response scm(@QueryParam("releaseKey") @DefaultValue("") String releaseKey)
     throws Exception {
   return shiroRequestHelper.call(
       "releases/scm",
       (csrfToken1) -> {
         return Response.ok(pluginRegion.renderScm(releaseKey));
       });
 }
 @POST
 @Path("/property/remove")
 @Produces(MediaType.APPLICATION_JSON)
 @Consumes(MediaType.APPLICATION_JSON)
 public Response remove(@Context HttpServletRequest httpRequest, PropertyUpdate update) {
   return shiroRequestHelper.call(
       "releases/property/remove",
       (csrfToken1) -> {
         pluginRegion.remove(httpRequest.getRemoteUser(), update);
         return Response.ok();
       });
 }
 @POST
 @Path("/import")
 @Consumes(MediaType.MULTIPART_FORM_DATA)
 public Response importTopology(
     @Context HttpServletRequest httpRequest,
     @FormDataParam("csrfToken") String csrfToken,
     @FormDataParam("file") InputStream fileInputStream,
     @FormDataParam("file") FormDataContentDisposition contentDispositionHeader) {
   return shiroRequestHelper.csrfCall(
       csrfToken,
       "releases/import",
       (csrfToken1) -> {
         String json = IOUtils.toString(fileInputStream, StandardCharsets.UTF_8);
         pluginRegion.doImport(json, httpRequest.getRemoteUser());
         URI location = new URI("/ui/releases");
         return Response.seeOther(location);
       });
 }