blob: 182a24a9f5e99a9939ec174f7639e34bdd54a9bf [file] [log] [blame]
/* 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
// ----------------------------------------------------------------------------