content: /*
   * Copyright 2021-2024 Aklivity Inc.
   *
   * Aklivity licenses this file to you under the Apache License,
   * version 2.0 (the "License"); you may not use this file except in compliance
   * with the License. You may obtain a copy of the License at:
   *
   *   http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
   * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
   * License for the specific language governing permissions and limitations
   * under the License.
   */
  package io.aklivity.zilla.runtime.common.feature;
  
  import java.lang.module.ModuleDescriptor;
  import java.util.function.Predicate;
  import java.util.stream.StreamSupport;
  
  public final class FeatureFilter
  {
      private FeatureFilter()
      {
      }
  
      private static final boolean INCUBATOR_ENABLED = incubatorEnabled();
      private static final Predicate<Object> FEATURE_ENABLED = FeatureFilter::featureEnabled;
  
      public static <S> Iterable<S> filter(
          Iterable<S> providers)
      {
          return StreamSupport.stream(providers.spliterator(), false).filter(FEATURE_ENABLED)::iterator;
      }
  
      private static boolean featureEnabled(
          Object feature)
      {
          return INCUBATOR_ENABLED ||
              !feature.getClass().isAnnotationPresent(Incubating.class);
      }
  
      public static boolean featureEnabled(
          Class<?> feature)
      {
          return INCUBATOR_ENABLED ||
              !feature.isAnnotationPresent(Incubating.class);
      }
  
      private static boolean incubatorEnabled()
      {
          final Module module = FeatureFilter.class.getModule();
          final String override = System.getProperty("zilla.incubator.enabled");
  
          return override != null ? Boolean.parseBoolean(override) : module == null ||
              module.getDescriptor() == null || "develop-SNAPSHOT".equals(
                  module.getDescriptor().version().map(ModuleDescriptor.Version::toString)
                      .orElse("develop-SNAPSHOT"));
      }
  }
  