@Path("deleteBundle/{archive: .+}")
 @DELETE
 @Produces(MediaType.APPLICATION_JSON)
 public Response deleteBundle(@PathParam("archive") String archive) throws Exception {
   if (authorizationService.isAnonymous() || !authorizationService.isAdmin()) {
     return Response.status(Response.Status.UNAUTHORIZED).build();
   }
   return runService(advancedServiceFactory.getSupportServiceDeleteBundle(), archive);
 }
 @Path("listBundles")
 @GET
 @Produces(MediaType.APPLICATION_JSON)
 public Response listBundles() throws Exception {
   if (authorizationService.isAnonymous() || !authorizationService.isAdmin()) {
     return Response.status(Response.Status.UNAUTHORIZED).build();
   }
   return runService(advancedServiceFactory.getSupportServiceListBundles());
 }
 @Path("generateBundle")
 @POST
 @Consumes(MediaType.APPLICATION_JSON)
 @Produces(MediaType.APPLICATION_JSON)
 public Response generateBundle(BundleConfigurationImpl bundleConfiguration) throws Exception {
   if (authorizationService.isAnonymous() || !authorizationService.isAdmin()) {
     return Response.status(Response.Status.UNAUTHORIZED).build();
   }
   return runService(
       advancedServiceFactory.getSupportServiceGenerateBundle(),
       new BundleConfigurationWrapper(bundleConfiguration, httpServletRequest));
 }
  @SuppressWarnings({"unchecked"})
  private InfoRestSearchResult search(List<String> reposToSearch) throws IOException {
    Map<String, String[]> parametersMap = request.getParameterMap();
    if (parametersMap.isEmpty()) {
      RestUtils.sendNotFoundResponse(response, NOT_FOUND);
      return null;
    }

    // build the search controls using the query parameters
    PropertySearchControls searchControls = new PropertySearchControls();
    searchControls.setLimitSearchResults(authorizationService.isAnonymous());
    searchControls.setSelectedRepoForSearch(reposToSearch);
    for (Map.Entry<String, String[]> parameterEntry : parametersMap.entrySet()) {
      String parameterName = parameterEntry.getKey();
      // don't use the repos parameter and the properties parameter as a property name parameter
      if (!SearchRestConstants.PARAM_REPO_TO_SEARCH.equals(parameterName)
          && !SearchRestConstants.PARAM_PROPERTIES.equals(parameterName)) {
        String[] values = parameterEntry.getValue();
        for (String value : values) {
          // all searches are "open" ones
          searchControls.put(parameterName, value, true);
        }
      }
    }

    if (searchControls.isEmpty()) {
      response.sendError(HttpServletResponse.SC_BAD_REQUEST, "The search term cannot be empty");
      return null;
    }
    if (searchControls.isWildcardsOnly()) {
      response.sendError(
          HttpServletResponse.SC_BAD_REQUEST,
          "Search term containing only wildcards is not permitted");
      return null;
    }

    ItemSearchResults<PropertySearchResult> searchResults;
    try {
      searchResults = searchService.searchProperty(searchControls);
    } catch (RepositoryRuntimeException e) {
      RestUtils.sendNotFoundResponse(response, e.getMessage());
      return null;
    }

    List<PropertySearchResult> results = searchResults.getResults();
    InfoRestSearchResult infoSearchResult = new InfoRestSearchResult();
    for (PropertySearchResult result : results) {
      ItemInfo itemInfo = result.getItemInfo();
      StorageInfoHelper storageInfoHelper =
          new StorageInfoHelper(request, repositoryService, repoBrowsingService, itemInfo);
      infoSearchResult.results.add(storageInfoHelper.createStorageInfo());
    }
    return infoSearchResult;
  }
  /** @return */
  private Properties getTemplateProperties(
      String servletContextUrl, GradleSettingModel gradleSettingModel, RestResponse response) {
    Properties repoDetailsProperties = new Properties();

    // General
    repoDetailsProperties.setProperty("artifactory.contextUrl", servletContextUrl);
    repoDetailsProperties.setProperty("gradle.build.1tab", "    ");
    repoDetailsProperties.setProperty("gradle.build.2tabs", "        ");
    repoDetailsProperties.setProperty("gradle.build.3tabs", "            ");
    repoDetailsProperties.setProperty("gradle.build.4tabs", "                ");

    // jcenter overrides both maven and ivy
    if (gradleSettingModel.getPluginRepoKey().equals(JCENTER_DUMMY_REPO_KEY)) {
      repoDetailsProperties.setProperty("maven.repo", "jcenter()");
      repoDetailsProperties.setProperty("ivy.repo", "");
      // Plugins
    } else {
      repoDetailsProperties.setProperty(
          "plugins.repository.url",
          getFullRepositoryUrl(servletContextUrl, gradleSettingModel.getPluginRepoKey()));
      if (gradleSettingModel.getPluginUseMaven()) {
        repoDetailsProperties.setProperty(
            "maven.repo",
            replaceValuesAndGetTemplateValue(
                "/build.gradle.maven.repo.template", repoDetailsProperties, response));
      } else {
        repoDetailsProperties.setProperty("maven.repo", "");
      }

      if (gradleSettingModel.getPluginUseIvy()) {
        repoDetailsProperties.setProperty(
            "ivy.repo",
            replaceValuesAndGetTemplateValue(
                "/build.gradle.ivy.repo.template", repoDetailsProperties, response));
      } else {
        repoDetailsProperties.setProperty("ivy.repo", "");
      }
    }
    // Publisher
    if (gradleSettingModel.getPublisherUseIvy()) {
      repoDetailsProperties.setProperty(
          "ivy.publisher",
          replaceValuesAndGetTemplateValue(
              "/build.gradle.ivy.publisher.template", repoDetailsProperties, response));
      repoDetailsProperties.setProperty(
          "libs.publisher.ivy.pattern",
          getDescriptorPattern(getLayout(gradleSettingModel.getLibsPublisherLayouts())));
      repoDetailsProperties.setProperty(
          "libs.publisher.artifact.pattern",
          getArtifactPattern(getLayout(gradleSettingModel.getLibsPublisherLayouts())));
      repoDetailsProperties.setProperty(
          "libs.publisher.maven.compatible",
          Boolean.toString(
              getFullDescriptorPattern(
                      servletContextUrl,
                      gradleSettingModel.getLibsPublisherRepoKey(),
                      getLayout(gradleSettingModel.getLibsPublisherLayouts()))
                  .contains("pom")));
    } else {
      repoDetailsProperties.setProperty("ivy.publisher", "");
    }
    repoDetailsProperties.setProperty(
        "libs.publisher.repoKey", gradleSettingModel.getLibsPublisherRepoKey());
    repoDetailsProperties.setProperty(
        "libs.publisher.maven", Boolean.toString(gradleSettingModel.getPublisherUseMaven()));

    // Resolver
    if (gradleSettingModel.getResolverUseIvy()) {
      repoDetailsProperties.setProperty(
          "ivy.resolver",
          replaceValuesAndGetTemplateValue(
              "/build.gradle.ivy.resolver.template", repoDetailsProperties, response));
      repoDetailsProperties.setProperty(
          "libs.resolver.ivy.pattern",
          getDescriptorPattern(getLayout(gradleSettingModel.getLibsResolverLayout())));
      repoDetailsProperties.setProperty(
          "libs.resolver.artifact.pattern",
          getArtifactPattern(getLayout(gradleSettingModel.getLibsResolverLayout())));
      repoDetailsProperties.setProperty(
          "libs.resolver.maven.compatible",
          Boolean.toString(
              getFullDescriptorPattern(
                      servletContextUrl,
                      gradleSettingModel.getLibsResolverRepoKey(),
                      getLayout(gradleSettingModel.getLibsResolverLayout()))
                  .contains("pom")));
    } else {
      repoDetailsProperties.setProperty("ivy.resolver", "");
    }
    repoDetailsProperties.setProperty(
        "libs.resolver.repoKey", gradleSettingModel.getLibsResolverRepoKey());
    repoDetailsProperties.setProperty(
        "libs.resolver.maven", Boolean.toString(gradleSettingModel.getResolverUseMaven()));

    // Credentials
    Properties credentialProperties = new Properties();
    String resolveCreds;
    String publishCreds;
    String pluginsCreds;
    if (!authorizationService.isAnonymous() || !authorizationService.isAnonAccessEnabled()) {
      credentialProperties.setProperty("creds.line.break", "\n            ");
      resolveCreds =
          replaceValuesAndGetTemplateValue(
              "/build.gradle.resolve.creds.template", credentialProperties, response);
      publishCreds =
          replaceValuesAndGetTemplateValue(
              "/build.gradle.publish.creds.template", credentialProperties, response);
      pluginsCreds =
          replaceValuesAndGetTemplateValue(
              "/build.gradle.creds.template", credentialProperties, response);
    } else {
      resolveCreds = "";
      publishCreds = "";
      pluginsCreds = "";
    }
    repoDetailsProperties.setProperty("resolve.creds", resolveCreds);
    repoDetailsProperties.setProperty("publish.creds", publishCreds);
    repoDetailsProperties.setProperty("repo.creds", pluginsCreds);

    return repoDetailsProperties;
  }
 @Override
 public void filterActions(AuthorizationService authService) {
   if (getRepoPath() != null && authService.canRead(getRepoPath())) {
     getActions().add(new ShowInTreeAction());
   }
 }
  @Override
  public ContainerRequest filter(ContainerRequest request) {
    // validate session still active
    AuthUtils.validateSession(this.request, uriInfo, response);
    boolean authenticated = authorizationService.isAuthenticated();
    boolean anonAccessEnabled = authorizationService.isAnonAccessEnabled();
    if (!authenticated) {
      if (anonAccessEnabled || uriInfo.getPath().indexOf("auth") != -1) {
        // If anon access is allowed and we didn't bother authenticating try to perform the action
        // as a user
        request.setSecurityContext(
            new RoleAuthenticator(UserInfo.ANONYMOUS, AuthorizationService.ROLE_USER));
      } else {
        throw new AuthorizationRestException();
      }
    } else {
      // Block all the REST calls that pass trough 'mc' entry point and are not authenticated by the
      // MS token authentication,
      // except the FIRST and only the FIRST call to the setupMC that can be authenticated by the
      // basic authentication,
      if (isMissionControlAccesPoint(request)) {
        boolean firstCallToSetupMC = isFirstCallToSetupMC(request);
        boolean tokenAuthentication = isTokenAuthentication(request);
        if (!firstCallToSetupMC && !tokenAuthentication) {
          // Block all the REST calls that pass trough 'mc' entry point and are not authenticated by
          // the MS token authentication,
          throw new AuthorizationRestException(
              "The access trough the 'mc' entry point is allowed only with token authentication");
        } else if ((firstCallToSetupMC && tokenAuthentication)) {
          // Block the setupMC REST calls that pass trough 'mc' entry point and are authenticated by
          // basic authentication except the first time.
          throw new AuthorizationRestException(
              "To initialize mission control chanel for the first time use user name and password ");
        } else {
          String username = authorizationService.currentUsername();
          request.setSecurityContext(
              new RoleAuthenticator(username, AuthorizationService.ROLE_ADMIN));
          return request;
        }
      }

      // Set the authenticated user and role
      String username = authorizationService.currentUsername();
      boolean admin = authorizationService.isAdmin();

      boolean ha =
          SecurityContextHolder.getContext().getAuthentication()
              instanceof HaSystemAuthenticationToken;
      if (ha) {
        request.setSecurityContext(new RoleAuthenticator(username, HaRestConstants.ROLE_HA));
        return request;
      }

      if (admin) {
        request.setSecurityContext(
            new RoleAuthenticator(username, AuthorizationService.ROLE_ADMIN));
      } else {
        request.setSecurityContext(new RoleAuthenticator(username, AuthorizationService.ROLE_USER));
      }
    }
    return request;
  }