package org.apereo.cas.monitor; import java.util.Arrays; import java.util.Objects; import java.util.stream.Collectors; import java.util.stream.Stream; /** * Describes meaningful health metrics on the status of a cache. * * @author Marvin S. Addison * @since 3.5.1 */ public class CacheStatus extends Status { private final CacheStatistics[] statistics; /** * Creates a new instance describing cache status. * * @param code Status code. * @param description Optional status description. * @param statistics One or more sets of cache statistics. */ public CacheStatus(final StatusCode code, final String description, final CacheStatistics... statistics) { super(code, buildDescription(description, statistics)); this.statistics = statistics; } /** * Creates a new instance when cache statistics are unavailable due to given exception. * * @param e Cause of unavailable statistics. */ public CacheStatus(final Exception e) { super(StatusCode.ERROR, String.format("Error fetching cache status: %s::%s", e.getClass().getSimpleName(), e.getMessage())); this.statistics = null; } /** * Gets the current cache statistics. * * @return Cache statistics. */ public CacheStatistics[] getStatistics() { return Arrays.copyOf(this.statistics, this.statistics.length); } /** * Builds the description string for the retrieved statistics. * * @param desc the desc * @param statistics the statistics * @return the string */ private static String buildDescription(final String desc, final CacheStatistics... statistics) { if (statistics == null || statistics.length == 0) { return desc; } final StringBuilder sb = new StringBuilder(); if (desc != null) { sb.append(desc); if (!desc.endsWith(".")) { sb.append('.'); } sb.append(' '); } return Stream.of(statistics) .filter(Objects::nonNull) .map(s -> { s.toString(sb); return sb.toString(); }) .collect(Collectors.joining("|", sb.toString() + "Cache statistics: [", "]")); } }