| /* Copyright (C) 2003 Vladimir Roubtsov. All rights reserved. |
| * |
| * This program and the accompanying materials are made available under |
| * the terms of the Common Public License v1.0 which accompanies this distribution, |
| * and is available at http://www.eclipse.org/legal/cpl-v10.html |
| * |
| * $Id: Item.java,v 1.1.1.1.2.1 2004/06/20 20:14:39 vlad_r Exp $ |
| */ |
| package com.vladium.emma.report; |
| |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.Iterator; |
| import java.util.List; |
| |
| import com.vladium.util.asserts.$assert; |
| |
| // ---------------------------------------------------------------------------- |
| /** |
| * @author Vlad Roubtsov, (C) 2003 |
| */ |
| abstract class Item implements IItem |
| { |
| // public: ................................................................ |
| |
| |
| // IItem: |
| |
| public final int getChildCount () |
| { |
| return m_children.size (); |
| } |
| |
| public final IItem getParent () |
| { |
| return m_parent; |
| } |
| |
| public final Iterator getChildren () |
| { |
| return m_children.iterator (); |
| } |
| |
| public final Iterator getChildren (final ItemComparator /* IItem */ order) |
| { |
| // TODO: soft caching keyed off 'order' |
| |
| if (order == null) |
| return getChildren (); |
| else |
| { |
| final IItem [] items = new IItem [m_children.size ()]; |
| m_children.toArray (items); |
| |
| Arrays.sort (items, order); |
| |
| return Arrays.asList (items).iterator (); |
| } |
| } |
| |
| public final IItemAttribute getAttribute (final int attributeID, final int unitsID) |
| { |
| //if ($assert.ENABLED) $assert.ASSERT ((attributeID & getMetadata ().getAttributeIDs ()) != 0, "invalid attribute ID [" + attributeID + "] for type [" + getMetadata ().getTypeID () + "]"); |
| |
| if ((getMetadata ().getAttributeIDs () & (1 << attributeID)) == 0) |
| return null; |
| else |
| return IItemAttribute.Factory.getAttribute (attributeID, unitsID); |
| } |
| |
| public int getAggregate (final int type) |
| { |
| final int [] aggregates = m_aggregates; |
| int value = aggregates [type]; |
| |
| if (value < 0) |
| { |
| // don't fault aggregate types all at once since there are |
| // plenty of exceptions to the additive roll up rule: |
| |
| value = 0; |
| for (Iterator children = m_children.iterator (); children.hasNext (); ) |
| { |
| value += ((IItem) children.next ()).getAggregate (type); |
| } |
| aggregates [type] = value; |
| |
| return value; |
| } |
| |
| return value; |
| } |
| |
| // protected: ............................................................. |
| |
| |
| protected static final class ItemMetadata implements IItemMetadata |
| { |
| public int getTypeID () |
| { |
| return m_typeID; |
| } |
| |
| public String getTypeName () |
| { |
| return m_typeName; |
| } |
| |
| public long getAttributeIDs () |
| { |
| return m_attributeIDs; |
| } |
| |
| ItemMetadata (final int typeID, final String typeName, final long attributeIDs) |
| { |
| if ($assert.ENABLED) $assert.ASSERT (typeID >= TYPE_ID_ALL && typeID <= TYPE_ID_METHOD, "invalid type ID: " + typeID); |
| if ($assert.ENABLED) $assert.ASSERT (typeName != null, "typeName = null"); |
| |
| |
| m_typeID = typeID; |
| m_typeName = typeName; |
| m_attributeIDs = attributeIDs; |
| } |
| |
| |
| private final int m_typeID; |
| private final String m_typeName; |
| private final long m_attributeIDs; |
| |
| } // end of nested class |
| |
| |
| protected void addChild (final IItem item) |
| { |
| if (item == null) throw new IllegalArgumentException ("null input: item"); |
| |
| m_children.add (item); |
| } |
| |
| |
| protected final IItem m_parent; |
| protected final int [] m_aggregates; |
| |
| // package: ............................................................... |
| |
| |
| Item (final IItem parent) |
| { |
| m_parent = parent; |
| m_children = new ArrayList (); |
| |
| m_aggregates = new int [NUM_OF_AGGREGATES]; |
| for (int i = 0; i < m_aggregates.length; ++ i) m_aggregates [i] = -1; |
| } |
| |
| // private: ............................................................... |
| |
| |
| private final List m_children; |
| |
| } // end of class |
| // ---------------------------------------------------------------------------- |