package org.springframework.roo.metadata.internal; import org.apache.commons.lang3.Validate; import org.springframework.roo.metadata.MetadataTimingStatistic; /** * Standard implementation of {@link MetadataTimingStatistic}. * * @author Ben Alex */ public class StandardMetadataTimingStatistic implements MetadataTimingStatistic { // Chosen to match the maximum private static final int MAXIMUM_EXPECTED_INVOCATIONS = 5; private static final String INVOCATION_COUNT_FORMAT = "%" + MAXIMUM_EXPECTED_INVOCATIONS + "d"; static final long NANOSECONDS_IN_MILLISECOND = 1000000L; private static final String TIME_FORMAT = "%" + (String.valueOf(NANOSECONDS_IN_MILLISECOND).length() - 1) + "d"; private final long invocations; private final String name; private final long nanoseconds; /** * Constructor * * @param name (required) * @param nanoseconds the elasped time in nanoseconds (zero or more) * @param invocations (zero or more) */ public StandardMetadataTimingStatistic(final String name, final long nanoseconds, final long invocations) { Validate.notBlank(name, "Name required"); Validate.isTrue(invocations >= 0, "Invocations must be zero or more"); Validate.isTrue(nanoseconds >= 0, "Nanoseconds must be zero or more"); this.invocations = invocations; this.name = name; this.nanoseconds = nanoseconds; } public int compareTo(final MetadataTimingStatistic o) { int result = Long.valueOf(nanoseconds).compareTo(o.getTime()); if (result == 0) { result = Long.valueOf(invocations).compareTo(o.getInvocations()); } if (result == 0) { result = name.compareTo(o.getName()); } return result; } @Override public boolean equals(final Object obj) { return obj instanceof MetadataTimingStatistic && compareTo((MetadataTimingStatistic) obj) == 0; } public long getInvocations() { return invocations; } public String getName() { return name; } public long getTime() { return nanoseconds; } @Override public int hashCode() { return Long.valueOf(nanoseconds).hashCode() * Long.valueOf(invocations).hashCode() * name.hashCode(); } @Override public String toString() { final StringBuilder sb = new StringBuilder(); if (nanoseconds < NANOSECONDS_IN_MILLISECOND) { // Display as nanoseconds sb.append(String.format(TIME_FORMAT, nanoseconds)).append(" ns; "); } else { // Display as milliseconds sb.append(String.format(TIME_FORMAT, nanoseconds / 1000000)).append(" ms; "); } sb.append(String.format(INVOCATION_COUNT_FORMAT, invocations)).append(" call(s): "); sb.append(name); return sb.toString(); } }