package rocks.inspectit.shared.all.communication.data; import java.util.Collection; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import rocks.inspectit.shared.all.cmr.cache.IObjectSizes; import rocks.inspectit.shared.all.communication.IIdsAwareAggregatedData; /** * Aggregated {@link TimerData} object. * * @author Ivan Senic * */ public class AggregatedTimerData extends TimerData implements IIdsAwareAggregatedData<TimerData> { /** * Generated UID. */ private static final long serialVersionUID = 5458552145998385702L; /** * Aggregated IDs. We need a set functionality so we will simulate it with the Map (SetFromMap * is not available in Java5). The values in this map should always be the {@link Boolean#TRUE} * since the keys are only values we are interested in. */ @SuppressWarnings("CPD-START") private Map<Long, Boolean> aggregatedIds = new ConcurrentHashMap<Long, Boolean>(16, 0.75f, 4); /** * {@inheritDoc} */ @Override public void aggregate(TimerData data) { this.aggregateTimerData(data); if (data instanceof AggregatedTimerData) { AggregatedTimerData aggregatedData = (AggregatedTimerData) data; if (null != aggregatedData.getAggregatedIds()) { for (Long id : aggregatedData.getAggregatedIds()) { aggregatedIds.put(id, Boolean.TRUE); } } } else if (0 != data.getId()) { aggregatedIds.put(data.getId(), Boolean.TRUE); } } /** * * {@inheritDoc} */ @Override public Collection<Long> getAggregatedIds() { return aggregatedIds.keySet(); } /** * {@inheritDoc} */ @Override public void clearAggregatedIds() { aggregatedIds.clear(); } /** * {@inheritDoc} */ @Override public TimerData getData() { return this; } /** * {@inheritDoc} */ @Override public long getObjectSize(IObjectSizes objectSizes, boolean doAlign) { long size = super.getObjectSize(objectSizes, doAlign); size += objectSizes.getPrimitiveTypesSize(1, 0, 0, 0, 0, 0); if (null != aggregatedIds) { size += objectSizes.getSizeOfConcurrentHashMap(aggregatedIds.size(), 4); size += aggregatedIds.size() * objectSizes.getSizeOfLongObject(); } if (doAlign) { return objectSizes.alignTo8Bytes(size); } else { return size; } } /** * {@inheritDoc} */ @Override public int hashCode() { final int prime = 31; int result = super.hashCode(); result = (prime * result) + ((aggregatedIds == null) ? 0 : aggregatedIds.hashCode()); return result; } /** * {@inheritDoc} */ @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (!super.equals(obj)) { return false; } if (getClass() != obj.getClass()) { return false; } AggregatedTimerData other = (AggregatedTimerData) obj; if (aggregatedIds == null) { if (other.aggregatedIds != null) { return false; } } else if (!aggregatedIds.equals(other.aggregatedIds)) { return false; } return true; } }