FlagInstanceFilter.java

/*
 * SPDX-FileCopyrightText: none
 * SPDX-License-Identifier: CC0-1.0
 */

package gov.nist.secauto.metaschema.schemagen;

import gov.nist.secauto.metaschema.core.model.IFlagInstance;
import gov.nist.secauto.metaschema.core.util.ObjectUtils;

import java.util.Collection;
import java.util.function.Predicate;
import java.util.stream.Collectors;

import edu.umd.cs.findbugs.annotations.NonNull;

public final class FlagInstanceFilter {
  private FlagInstanceFilter() {
    // disable construction
  }

  @NonNull
  public static Collection<? extends IFlagInstance> filterFlags(
      @NonNull Collection<? extends IFlagInstance> flags,
      IFlagInstance jsonKeyFlag) {
    Predicate<IFlagInstance> filter = null;

    // determine if we need to filter a JSON key
    if (jsonKeyFlag != null) {
      filter = filterFlag(jsonKeyFlag);
    }
    return applyFilter(flags, filter);
  }

  @NonNull
  public static Collection<? extends IFlagInstance> filterFlags(
      @NonNull Collection<? extends IFlagInstance> flags,
      IFlagInstance jsonKeyFlag,
      IFlagInstance jsonValueKeyFlag) {
    Predicate<IFlagInstance> filter = null;

    // determine if we need to filter a JSON key
    if (jsonKeyFlag != null) {
      filter = filterFlag(jsonKeyFlag);
    }

    // determine if we need to filter a JSON value key
    if (jsonValueKeyFlag != null) {
      Predicate<IFlagInstance> jsonValueKeyFilter
          = filterFlag(jsonValueKeyFlag);
      if (filter == null) {
        filter = jsonValueKeyFilter;
      } else {
        filter = filter.and(jsonValueKeyFilter);
      }
    }

    return applyFilter(flags, filter);
  }

  @NonNull
  private static Predicate<IFlagInstance>
      filterFlag(@NonNull IFlagInstance flagToFilter) {
    return flag -> flag != flagToFilter;
  }

  @NonNull
  private static Collection<? extends IFlagInstance> applyFilter(
      @NonNull Collection<? extends IFlagInstance> flags,
      Predicate<IFlagInstance> filter) {
    Collection<? extends IFlagInstance> retval;
    if (filter == null) {
      retval = flags;
    } else {
      retval = ObjectUtils.notNull(flags.stream()
          .filter(filter)
          .collect(Collectors.toList()));
    }
    return retval;
  }
}