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: MetaData.java,v 1.1.1.1.2.2 2004/07/16 23:32:29 vlad_r Exp $
8f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */
9f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectpackage com.vladium.emma.data;
10f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
11f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.DataInput;
12f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.DataOutput;
13f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.io.IOException;
14f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.util.HashMap;
15f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.util.HashSet;
16f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.util.Iterator;
17f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport java.util.Map;
18f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
19f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.logging.Logger;
20f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectimport com.vladium.util.asserts.$assert;
21f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
22f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------
23f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/*
24f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * Average mem size/class entry: 6166 bytes [1.4.1, rt.jar], 5764 bytes [1.3.1, rt.jar]
25f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */
26f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project/**
27f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project * @author Vlad Roubtsov, (C) 2003
28f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project */
29f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Projectfinal class MetaData implements IMetaData, Cloneable
30f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project{
31f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // public: ................................................................
32f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
33f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // TODO: MT-safety model
34f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
35f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // TODO: no duplicate detection is done here at the moment
36f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // [may require supporting fast lookup for already added descriptors]
37f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
38f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public IMetaData shallowCopy ()
39f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
40f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final MetaData _clone;
41f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        try
42f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
43f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            _clone = (MetaData) super.clone ();
44f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
45f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        catch (CloneNotSupportedException cnse)
46f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
47f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            throw new Error (cnse.toString ());
48f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
49f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
50f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final HashMap _classMap;
51f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
52f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        synchronized (lock ())
53f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
54f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            _classMap = (HashMap) m_classMap.clone ();
55f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
56f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
57f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        // [m_packagesWarned is not cloned by design]
58f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
59f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        _clone.m_classMap = _classMap;
60f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
61f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return _clone;
62f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
63f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
64f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public CoverageOptions getOptions ()
65f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
66f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return m_options;
67f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
68f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
69f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public int size ()
70f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
71f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return m_classMap.size ();
72f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
73f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
74f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public boolean hasSrcFileData ()
75f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
76f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return m_hasSrcFileInfo;
77f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
78f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
79f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public boolean hasLineNumberData ()
80f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
81f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return m_hasLineNumberInfo;
82f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
83f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
84f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public Iterator iterator ()
85f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
86f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return m_classMap.values ().iterator ();
87f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
88f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
89f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project//    public boolean hasDescriptor (final ClassDescriptor cls)
90f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project//    {
91f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project//        if ($assert.ENABLED) $assert.ASSERT (cls != null, "cls is null");
92f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project//
93f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project//        return m_classes.contains (cls);
94f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project//    }
95f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
96f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public boolean hasDescriptor (final String classVMName)
97f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
98f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if ($assert.ENABLED) $assert.ASSERT (classVMName != null, "className is null");
99f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
100f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return m_classMap.containsKey (classVMName);
101f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
102f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
103f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public Object lock ()
104f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
105f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return m_classMap;
106f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
107f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
108f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public boolean add (final ClassDescriptor cls, final boolean overwrite)
109f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
110f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if ($assert.ENABLED) $assert.ASSERT (cls != null, "cls is null");
111f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
112f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final String classVMName = cls.getClassVMName ();
113f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
114f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if (overwrite || ! m_classMap.containsKey (classVMName))
115f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
116f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            m_classMap.put (classVMName, cls);
117f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
118f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            boolean incompleteDebugInfo = false;
119f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
120f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (! cls.hasSrcFileInfo ())
121f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
122f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                m_hasSrcFileInfo = false;
123f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                incompleteDebugInfo = true;
124f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
125f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
126f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (! cls.hasCompleteLineNumberInfo ())
127f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
128f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                m_hasLineNumberInfo = false;
129f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                incompleteDebugInfo = true;
130f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
131f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
132f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            // SF FR 971176: provide user with sample classes that may later
133f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            // caused warnings about line coverage not available
134f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
135f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (incompleteDebugInfo)
136f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
137f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                final Logger log = Logger.getLogger ();
138f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
139f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                if (log.atINFO ())
140f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                {
141f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    final String packageVMName = cls.getPackageVMName ();
142f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
143f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    if (m_packagesWarned.add (packageVMName))
144f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    {
145f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                        log.info ("package [" + packageVMName + "] contains classes [" + cls.getName () + "] without full debug info");
146f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                    }
147f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                }
148f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
149f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
150f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return true;
151f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
152f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
153f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return false;
154f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
155f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
156f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // IMergeable:
157f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
158f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public boolean isEmpty ()
159f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
160f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return m_classMap.isEmpty ();
161f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
162f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
163f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    /*
164f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     * note: rhs entries must override current entries
165f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project     */
166f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    public IMergeable merge (final IMergeable rhs)
167f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
168f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if ((rhs == null) || rhs.isEmpty () || (rhs == this))
169f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return this;
170f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        else
171f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
172f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final MetaData rhsmdata = (MetaData) rhs; // TODO: redesign to avoid this cast?
173f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final Map rhsclasses = rhsmdata.m_classMap;
174f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
175f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            // rhs entries always override existing content:
176f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
177f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            for (Iterator entries = rhsclasses.entrySet ().iterator (); entries.hasNext (); )
178f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            {
179f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                final Map.Entry entry = (Map.Entry) entries.next ();
180f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
181f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                final String classVMName = (String) entry.getKey ();
182f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                final Object rhsdescriptor = entry.getValue ();
183f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
184f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                m_classMap.put (classVMName, rhsdescriptor);
185f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            }
186f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
187f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            // update debug info flags if necessary:
188f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
189f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (! rhsmdata.hasSrcFileData ()) m_hasSrcFileInfo = false;
190f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            if (! rhsmdata.hasLineNumberData ()) m_hasLineNumberInfo = false;
191f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
192f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            return this;
193f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
194f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
195f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
196f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // protected: .............................................................
197f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
198f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // package: ...............................................................
199f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
200f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
201f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    MetaData (final CoverageOptions options)
202f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
203f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if ($assert.ENABLED) $assert.ASSERT (options != null, "options is null");
204f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_options = options;
205f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
206f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_hasSrcFileInfo = true;
207f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_hasLineNumberInfo = true;
208f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
209f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_classMap = new HashMap ();
210f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_packagesWarned = new HashSet ();
211f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
212f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
213f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
214f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    static MetaData readExternal (final DataInput in)
215f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        throws IOException
216f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
217f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final CoverageOptions options = CoverageOptions.readExternal (in);
218f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
219f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final boolean hasSrcFileInfo = in.readBoolean ();
220f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final boolean hasLineNumberInfo = in.readBoolean ();
221f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
222f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final int size = in.readInt ();
223f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final HashMap classMap = new HashMap (size);
224f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
225f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        for (int i = 0; i < size; ++ i)
226f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
227f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final String classVMName = in.readUTF ();
228f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final ClassDescriptor cls = ClassDescriptor.readExternal (in);
229f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
230f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            classMap.put (classVMName, cls);
231f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
232f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
233f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        // [m_packagesWarned is not part of persisted state]
234f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
235f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        return new MetaData (options, classMap, hasSrcFileInfo, hasLineNumberInfo);
236f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
237f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
238f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    static void writeExternal (final MetaData mdata, final DataOutput out)
239f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        throws IOException
240f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
241f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        CoverageOptions.writeExternal (mdata.m_options, out);
242f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
243f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        out.writeBoolean (mdata.m_hasSrcFileInfo);
244f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        out.writeBoolean (mdata.m_hasLineNumberInfo);
245f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
246f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final Map classMap = mdata.m_classMap;
247f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
248f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final int size = classMap.size ();
249f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        out.writeInt (size); // too bad the capacity is not visible
250f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
251f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        final Iterator entries = classMap.entrySet ().iterator ();
252f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        for (int i = 0; i < size; ++ i)
253f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        {
254f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final Map.Entry entry = (Map.Entry) entries.next ();
255f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
256f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final String classVMName = (String) entry.getKey ();
257f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            final ClassDescriptor cls = (ClassDescriptor) entry.getValue ();
258f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
259f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            out.writeUTF (classVMName);
260f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project            ClassDescriptor.writeExternal (cls, out);
261f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        }
262f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
263f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        // [m_packagesWarned is not part of persisted state]
264f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
265f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
266f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    // private: ...............................................................
267f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
268f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
269f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private MetaData (final CoverageOptions options, final HashMap classMap,
270f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project                      final boolean hasSrcFileInfo, final boolean hasLineNumberInfo)
271f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    {
272f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        if ($assert.ENABLED) $assert.ASSERT (options != null, "options is null");
273f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_options = options;
274f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
275f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_hasSrcFileInfo = hasSrcFileInfo;
276f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_hasLineNumberInfo = hasLineNumberInfo;
277f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
278f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project        m_classMap = classMap;
279f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    }
280f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
281f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
282f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private final CoverageOptions m_options; // [never null]
283f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private boolean m_hasSrcFileInfo, m_hasLineNumberInfo;
284f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private /*final*/ HashMap /* classVMName:String->ClassDescriptor */ m_classMap; // [never null]
285f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
286f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project    private /*final*/ transient HashSet /*  packageVMName:String */ m_packagesWarned; // [never null]
287f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project
288f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project} // end of class
289f6fe897e173f4e4bda72a7dddb091b667066764aThe Android Open Source Project// ----------------------------------------------------------------------------