Class ConfigUtils

java.lang.Object
ai.timefold.solver.core.config.util.ConfigUtils

public class ConfigUtils extends Object
  • Method Details

    • newInstance

      public static <T> T newInstance(Object configBean, String propertyName, Class<T> clazz)
      Create a new instance of clazz from a config's property.

      If the instantiation fails, the simple class name of configBean will be used as the owner of propertyName.

      Intended usage:

       selectionFilter = ConfigUtils.newInstance(config, "filterClass", config.getFilterClass());
       
      Type Parameters:
      T - the new instance type
      Parameters:
      configBean - the bean holding the clazz to be instantiated
      propertyName - configBean's property holding clazz
      clazz - Class representation of the type T
      Returns:
      new instance of clazz
    • newInstance

      public static <T> T newInstance(Supplier<String> ownerDescriptor, String propertyName, Class<T> clazz)
      Create a new instance of clazz from a general source.

      If the instantiation fails, the result of ownerDescriptor will be used to describe the owner of propertyName.

      Type Parameters:
      T - the new instance type
      Parameters:
      ownerDescriptor - describes the owner of propertyName
      propertyName - property holding the clazz
      clazz - Class representation of the type T
      Returns:
      new instance of clazz
    • applyCustomProperties

      public static void applyCustomProperties(Object bean, String beanClassPropertyName, Map<String,String> customProperties, String customPropertiesPropertyName)
    • inheritConfig

      public static <Config_ extends AbstractConfig<Config_>> Config_ inheritConfig(Config_ original, Config_ inherited)
    • inheritMergeableListConfig

      public static <Config_ extends AbstractConfig<Config_>> List<Config_> inheritMergeableListConfig(List<Config_> originalList, List<Config_> inheritedList)
    • inheritOverwritableProperty

      public static <T> T inheritOverwritableProperty(T original, T inherited)
    • inheritMergeableListProperty

      public static <T> List<T> inheritMergeableListProperty(List<T> originalList, List<T> inheritedList)
    • inheritUniqueMergeableListProperty

      public static <T> List<T> inheritUniqueMergeableListProperty(List<T> originalList, List<T> inheritedList)
    • inheritMergeableMapProperty

      public static <K, T> Map<K,T> inheritMergeableMapProperty(Map<K,T> originalMap, Map<K,T> inheritedMap)
    • mergeProperty

      public static <T> T mergeProperty(T a, T b)
    • meldProperty

      public static <T> T meldProperty(T a, T b)
      A relaxed version of mergeProperty(Object, Object). Used primarily for merging failed benchmarks, where a property remains the same over benchmark runs (for example: dataset problem size), but the property in the failed benchmark isn't initialized, therefore null. When merging, we can still use the correctly initialized property of the benchmark that didn't fail.

      Null-handling:

      • if both properties are null, returns null
      • if only one of the properties is not null, returns that property
      • if both properties are not null, returns mergeProperty(Object, Object)
      Type Parameters:
      T - the type of property a and b
      Parameters:
      a - property a
      b - property b
      Returns:
      sometimes null
      See Also:
    • isEmptyCollection

      public static boolean isEmptyCollection(Collection<?> collection)
    • ceilDivide

      public static int ceilDivide(int dividend, int divisor)
      Divides and ceils the result without using floating point arithmetic. For floor division, see Math.floorDiv(long, long).
      Parameters:
      dividend - the dividend
      divisor - the divisor
      Returns:
      dividend / divisor, ceiled
      Throws:
      ArithmeticException - if divisor == 0
    • resolvePoolSize

      public static int resolvePoolSize(String propertyName, String value, String... magicValues)
    • getAllParents

      public static List<Class<?>> getAllParents(Class<?> bottomClass)
    • getAllAnnotatedLineageClasses

      public static List<Class<?>> getAllAnnotatedLineageClasses(Class<?> bottomClass, Class<? extends Annotation> annotation)
    • getDeclaredMembers

      public static List<Member> getDeclaredMembers(Class<?> baseClass)
      Parameters:
      baseClass - never null
      Returns:
      never null, sorted by type (fields before methods), then by AlphabeticMemberComparator.
    • getAllMembers

      public static List<Member> getAllMembers(Class<?> baseClass, Class<? extends Annotation> annotationClass)
      Parameters:
      baseClass - never null
      annotationClass - never null
      Returns:
      never null, sorted by type (fields before methods), then by AlphabeticMemberComparator.
    • extractAnnotationClass

      @SafeVarargs public static Class<? extends Annotation> extractAnnotationClass(Member member, Class<? extends Annotation>... annotationClasses)
    • extractGenericTypeParameterOrFail

      public static Class<?> extractGenericTypeParameterOrFail(String parentClassConcept, Class<?> parentClass, Class<?> type, Type genericType, Class<? extends Annotation> annotationClass, String memberName)
    • extractGenericTypeParameter

      public static Optional<Class<?>> extractGenericTypeParameter(String parentClassConcept, Class<?> parentClass, Class<?> type, Type genericType, Class<? extends Annotation> annotationClass, String memberName)
    • findPlanningIdMemberAccessor

      public static <C> MemberAccessor findPlanningIdMemberAccessor(Class<C> clazz, MemberAccessorFactory memberAccessorFactory, DomainAccessType domainAccessType)
      This method is heavy, and it is effectively a computed constant. It is recommended that its results are cached at call sites.
      Type Parameters:
      C - the class type
      Parameters:
      clazz - never null
      memberAccessorFactory - never null
      domainAccessType - never null
      Returns:
      null if no accessor found
    • abbreviate

      public static String abbreviate(List<String> list, int limit)
    • abbreviate

      public static String abbreviate(List<String> list)