1f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/* Copyright (C) 2003 Vladimir Roubtsov. All rights reserved.
2f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *
3f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * This program and the accompanying materials are made available under
4f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * the terms of the Common Public License v1.0 which accompanies this distribution,
5f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * and is available at http://www.eclipse.org/legal/cpl-v10.html
6f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project *
7f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * $Id: Item.java,v 1.1.1.1.2.1 2004/06/20 20:14:39 vlad_r Exp $
8f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */
9f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpackage com.vladium.emma.report;
10f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
11f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.util.ArrayList;
12f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.util.Arrays;
13f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.util.Iterator;
14f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.util.List;
15f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
16f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.util.asserts.$assert;
17f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
18f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------
19f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/**
20f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @author Vlad Roubtsov, (C) 2003
21f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */
22f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectabstract class Item implements IItem
23f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project{
24f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // public: ................................................................
25f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
26f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
27f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // IItem:
28f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
29f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public final int getChildCount ()
30f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
31f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return m_children.size ();
32f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
33f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
34f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public final IItem getParent ()
35f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
36f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return m_parent;
37f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
38f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
39f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public final Iterator getChildren ()
40f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
41f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return m_children.iterator ();
42f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
43f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
44f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public final Iterator getChildren (final ItemComparator /* IItem */ order)
45f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
46f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        // TODO: soft caching keyed off 'order'
47f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
48f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (order == null)
49f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return getChildren ();
50f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        else
51f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
52f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final IItem [] items = new IItem [m_children.size ()];
53f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_children.toArray (items);
54f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
55f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            Arrays.sort (items, order);
56f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
57f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return Arrays.asList (items).iterator ();
58f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
59f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
60f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
61f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public final IItemAttribute getAttribute (final int attributeID, final int unitsID)
62f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
63f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        //if ($assert.ENABLED) $assert.ASSERT ((attributeID & getMetadata ().getAttributeIDs ()) != 0, "invalid attribute ID [" + attributeID + "] for type [" + getMetadata ().getTypeID () + "]");
64f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
65f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if ((getMetadata ().getAttributeIDs () & (1 << attributeID)) == 0)
66f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return null;
67f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        else
68f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return IItemAttribute.Factory.getAttribute (attributeID, unitsID);
69f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
70f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
71f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public int getAggregate (final int type)
72f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
73f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final int [] aggregates = m_aggregates;
74f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        int value = aggregates [type];
75f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
76f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (value < 0)
77f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
78f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            // don't fault aggregate types all at once since there are
79f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            // plenty of exceptions to the additive roll up rule:
80f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
81f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            value = 0;
82f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            for (Iterator children = m_children.iterator (); children.hasNext (); )
83f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
84f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                value += ((IItem) children.next ()).getAggregate (type);
85f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
86f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            aggregates [type] = value;
87f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
88f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return value;
89f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
90f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
91f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return value;
92f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
93f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
94f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // protected: .............................................................
95f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
96f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
97f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    protected static final class ItemMetadata implements IItemMetadata
98f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
99f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        public int getTypeID ()
100f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
101f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return m_typeID;
102f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
103f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
104f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        public String getTypeName ()
105f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
106f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return m_typeName;
107f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
108f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
109f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        public long getAttributeIDs ()
110f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
111f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return m_attributeIDs;
112f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
113f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
114f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        ItemMetadata (final int typeID, final String typeName, final long attributeIDs)
115f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
116f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if ($assert.ENABLED) $assert.ASSERT (typeID >= TYPE_ID_ALL && typeID <= TYPE_ID_METHOD, "invalid type ID: " + typeID);
117f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if ($assert.ENABLED) $assert.ASSERT (typeName != null, "typeName = null");
118f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
119f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
120f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_typeID = typeID;
121f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_typeName = typeName;
122f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_attributeIDs = attributeIDs;
123f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
124f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
125f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
126f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        private final int m_typeID;
127f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        private final String m_typeName;
128f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        private final long m_attributeIDs;
129f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
130f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    } // end of nested class
131f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
132f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
133f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    protected void addChild (final IItem item)
134f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
135f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (item == null) throw new IllegalArgumentException ("null input: item");
136f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
137f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_children.add (item);
138f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
139f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
140f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
141f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    protected final IItem m_parent;
142f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    protected final int [] m_aggregates;
143f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
144f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // package: ...............................................................
145f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
146f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
147f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    Item (final IItem parent)
148f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
149f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_parent = parent;
150f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_children = new ArrayList ();
151f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
152f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_aggregates = new int [NUM_OF_AGGREGATES];
153f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        for (int i = 0; i < m_aggregates.length; ++ i) m_aggregates [i] = -1;
154f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
155f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
156f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // private: ...............................................................
157f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
158f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
159f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private final List m_children;
160f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
161f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project} // end of class
162f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------