protected ModelAndView doHandle()

in server/src/jetbrains/buildServer/sharedResources/pages/EditFeatureController.java [84:153]


  protected ModelAndView doHandle(@NotNull final HttpServletRequest request,
                                  @NotNull final HttpServletResponse response) {
    final ModelAndView result = new ModelAndView(myDescriptor.getPluginResourcesPath(EDIT_FEATURE_PATH_JSP));
    final Map<String, Object> model = result.getModel();

    final EditableBuildTypeSettingsForm form = myFormFactory.getOrCreateForm(request);
    assert form != null;

    final BuildTypeSettings buildTypeSettings = form.getSettings();
    assert buildTypeSettings != null;

    final SProject project = form.getProject();
    final BuildFeaturesBean buildFeaturesBean = form.getBuildFeaturesBean();

    final String buildFeatureId = request.getParameter("featureId");
    final Map<String, Lock> locks = new HashMap<>();
    // map of all visible resources from this project and its subtree
    final List<Resource> projectResources = myResources.getResources(project);
    final Set<String> available = projectResources.stream().map(Resource::getName).collect(Collectors.toSet());
    // resource names locked by other features defined in current build type
    final Set<String> lockedByOtherFeatures = new HashSet<>();

    final Collection<Lock> invalidLocks = new ArrayList<>();
    boolean inherited = false;
    for (BuildFeatureBean bfb: buildFeaturesBean.getBuildFeatureDescriptors()) {
      SBuildFeatureDescriptor descriptor = bfb.getDescriptor();
      if (SharedResourcesBuildFeature.FEATURE_TYPE.equals(descriptor.getType())) {
        // we have build feature of needed type
        SharedResourcesFeature f = myFactory.createFeature(descriptor);
        if (buildFeatureId.equals(descriptor.getId())) {
          // we have feature that we need to edit
          locks.putAll(f.getLockedResources());
          invalidLocks.addAll(myInspector.inspect(project, f).keySet());
          inherited =  bfb.isInherited();
          String originExternalId = bfb.getOriginExternalId();
          if (!StringUtil.isEmptyOrSpaces(originExternalId)) {
            if (inherited) {
              model.put("template", myProjectManager.findBuildTypeTemplateByExternalId(originExternalId));
            }
          }
        } else {
          // if feature belongs to current build type settings (not inherited, not enforced etc),
          // we must remove resources locked by this feature from available
          if (!bfb.isInherited()) {
            lockedByOtherFeatures.addAll(f.getLockedResources().keySet());
          }
        }
      }
    }
    if (!inherited) { // we are editing build feature descriptor in current build type
      available.removeAll(lockedByOtherFeatures);
    }

    if (buildTypeSettings.isCompositeBuildType()) { // custom resources are not available for composite build types yet
      projectResources.stream()
                      .filter(resource -> resource.getType() == ResourceType.CUSTOM)
                      .map(Resource::getName)
                      .forEach(available::remove);
    }
    final EditFeatureBean bean = myBeansFactory.createEditFeatureBean(project, available);
    final Map<String, Lock> invalidLocksMap = new HashMap<>();
    for (Lock lock: invalidLocks) {
      invalidLocksMap.put(lock.getName(), lock);
    }
    model.put("inherited", inherited);
    model.put("invalidLocks", invalidLocksMap);
    model.put("locks", locks);
    model.put("bean", bean);
    return result;
  }