1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage com.android.dx.rop.annotation;
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
19333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilsonimport com.android.dx.rop.cst.CstString;
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstType;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.util.MutabilityControl;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.util.ToHuman;
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Collection;
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Collections;
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Iterator;
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.TreeMap;
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * An annotation on an element of a class. Annotations have an
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * associated type and additionally consist of a set of (name, value)
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * pairs, where the names are unique.
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
34de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiropublic final class Annotation extends MutabilityControl
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        implements Comparable<Annotation>, ToHuman {
3699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code non-null;} type of the annotation */
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final CstType type;
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code non-null;} the visibility of the annotation */
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final AnnotationVisibility visibility;
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code non-null;} map from names to {@link NameValuePair} instances */
43333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson    private final TreeMap<CstString, NameValuePair> elements;
44de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Construct an instance. It initially contains no elements.
47de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
4899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param type {@code non-null;} type of the annotation
4999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param visibility {@code non-null;} the visibility of the annotation
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Annotation(CstType type, AnnotationVisibility visibility) {
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (type == null) {
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException("type == null");
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (visibility == null) {
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException("visibility == null");
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.type = type;
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.visibility = visibility;
62333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson        this.elements = new TreeMap<CstString, NameValuePair>();
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean equals(Object other) {
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (! (other instanceof Annotation)) {
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return false;
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Annotation otherAnnotation = (Annotation) other;
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (! (type.equals(otherAnnotation.type)
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        && (visibility == otherAnnotation.visibility))) {
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return false;
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return elements.equals(otherAnnotation.elements);
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int hashCode() {
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int hash = type.hashCode();
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        hash = (hash * 31) + elements.hashCode();
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        hash = (hash * 31) + visibility.hashCode();
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return hash;
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int compareTo(Annotation other) {
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int result = type.compareTo(other.type);
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (result != 0) {
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return result;
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        result = visibility.compareTo(other.visibility);
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (result != 0) {
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return result;
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Iterator<NameValuePair> thisIter = elements.values().iterator();
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Iterator<NameValuePair> otherIter = other.elements.values().iterator();
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (thisIter.hasNext() && otherIter.hasNext()) {
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            NameValuePair thisOne = thisIter.next();
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            NameValuePair otherOne = otherIter.next();
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            result = thisOne.compareTo(otherOne);
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (result != 0) {
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return result;
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (thisIter.hasNext()) {
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return 1;
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else if (otherIter.hasNext()) {
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return -1;
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return 0;
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String toString() {
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return toHuman();
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
131de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String toHuman() {
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        StringBuilder sb = new StringBuilder();
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sb.append(visibility.toHuman());
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sb.append("-annotation ");
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sb.append(type.toHuman());
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sb.append(" {");
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        boolean first = true;
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (NameValuePair pair : elements.values()) {
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (first) {
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                first = false;
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else {
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                sb.append(", ");
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            sb.append(pair.getName().toHuman());
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            sb.append(": ");
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            sb.append(pair.getValue().toHuman());
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sb.append("}");
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return sb.toString();
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the type of this instance.
159de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
16099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the type
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public CstType getType() {
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return type;
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the visibility of this instance.
168de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
16999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the visibility
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public AnnotationVisibility getVisibility() {
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return visibility;
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Put an element into the set of (name, value) pairs for this instance.
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If there is a preexisting element with the same name, it will be
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * replaced by this method.
179de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
18099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param pair {@code non-null;} the (name, value) pair to place into this instance
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void put(NameValuePair pair) {
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throwIfImmutable();
184de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (pair == null) {
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException("pair == null");
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        elements.put(pair.getName(), pair);
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Add an element to the set of (name, value) pairs for this instance.
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * It is an error to call this method if there is a preexisting element
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * with the same name.
196de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
19799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param pair {@code non-null;} the (name, value) pair to add to this instance
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void add(NameValuePair pair) {
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throwIfImmutable();
201de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (pair == null) {
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException("pair == null");
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
206333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson        CstString name = pair.getName();
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (elements.get(name) != null) {
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IllegalArgumentException("name already added: " + name);
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
211de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        elements.put(name, pair);
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the set of name-value pairs contained in this instance. The
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * result is always unmodifiable.
218de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
21999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the set of name-value pairs
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Collection<NameValuePair> getNameValuePairs() {
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return Collections.unmodifiableCollection(elements.values());
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
225