package com.insightfullogic.honest_profiler.core.aggregation.grouping; import static java.util.Objects.hash; import java.util.function.BiFunction; import com.insightfullogic.honest_profiler.core.aggregation.AggregationProfile; import com.insightfullogic.honest_profiler.core.profiles.lean.LeanNode; import com.insightfullogic.honest_profiler.core.profiles.lean.LeanThreadNode; /** * A CombinedGrouping is a utility class for combining a {@link ThreadGrouping} and a {@link FrameGrouping}. It can be * applied to any {@link LeanNode} in a collection irrespective of whether it is a {@link LeanThreadNode} or not. */ public class CombinedGrouping implements BiFunction<AggregationProfile, LeanNode, String> { /** * Factory method for creating CombinedGroupings. * <p> * @param threadGrouping the {@link ThreadGrouping} in the resulting CombinedGrouping * @param frameGrouping the {@link FrameGrouping} in the resulting CombinedGrouping * @return a CombinedGrouping wrapping the specified {@link ThreadGrouping} and {@link FrameGrouping}/ */ public static final CombinedGrouping combine(ThreadGrouping threadGrouping, FrameGrouping frameGrouping) { return new CombinedGrouping(threadGrouping, frameGrouping); } // Instance Properties private ThreadGrouping threadGrouping; private FrameGrouping frameGrouping; // Instance Accessors public ThreadGrouping getThreadGrouping() { return threadGrouping; } public FrameGrouping getFrameGrouping() { return frameGrouping; } // Instance Constructors private CombinedGrouping(ThreadGrouping threadGrouping, FrameGrouping frameGrouping) { super(); this.threadGrouping = threadGrouping; this.frameGrouping = frameGrouping; } // BiFunction implementation /** * Calculate the key for a {@link LeanNode}, based on the provided groupings. * <p> * @param profile the input {@link AggregationProfile} * @param node the {@link LeanNode} for which the key will be calculated * @return the calculated key */ @Override public String apply(AggregationProfile profile, LeanNode node) { return (node instanceof LeanThreadNode) ? threadGrouping.apply((LeanThreadNode)node) : frameGrouping.apply(profile, node); } // Object implementation @Override public boolean equals(Object other) { return (other instanceof CombinedGrouping) && (threadGrouping == ((CombinedGrouping)other).threadGrouping) && (frameGrouping == ((CombinedGrouping)other).frameGrouping); } @Override public int hashCode() { return hash(threadGrouping, frameGrouping); } @Override public String toString() { return threadGrouping + " - " + frameGrouping; } }