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
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.Constant;
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstAnnotation;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstFieldRef;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstLiteralBits;
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstMethodRef;
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstNat;
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstType;
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstUtf8;
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.TypedConstant;
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.util.Hex;
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.util.MutabilityControl;
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.util.ToHuman;
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Collection;
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Collections;
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Iterator;
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.TreeMap;
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * An annotation on an element of a class. Annotations have an
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * associated type and additionally consist of a set of (name, value)
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * pairs, where the names are unique.
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic final class Annotation extends MutabilityControl
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        implements Comparable<Annotation>, ToHuman {
4499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code non-null;} type of the annotation */
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final CstType type;
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code non-null;} the visibility of the annotation */
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final AnnotationVisibility visibility;
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code non-null;} map from names to {@link NameValuePair} instances */
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final TreeMap<CstUtf8, NameValuePair> elements;
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Construct an instance. It initially contains no elements.
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param type {@code non-null;} type of the annotation
5799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param visibility {@code non-null;} the visibility of the annotation
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Annotation(CstType type, AnnotationVisibility visibility) {
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (type == null) {
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException("type == null");
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (visibility == null) {
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException("visibility == null");
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.type = type;
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.visibility = visibility;
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.elements = new TreeMap<CstUtf8, NameValuePair>();
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean equals(Object other) {
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (! (other instanceof Annotation)) {
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return false;
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Annotation otherAnnotation = (Annotation) other;
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (! (type.equals(otherAnnotation.type)
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        && (visibility == otherAnnotation.visibility))) {
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return false;
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return elements.equals(otherAnnotation.elements);
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int hashCode() {
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int hash = type.hashCode();
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        hash = (hash * 31) + elements.hashCode();
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        hash = (hash * 31) + visibility.hashCode();
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return hash;
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int compareTo(Annotation other) {
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int result = type.compareTo(other.type);
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (result != 0) {
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return result;
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        result = visibility.compareTo(other.visibility);
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (result != 0) {
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return result;
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Iterator<NameValuePair> thisIter = elements.values().iterator();
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Iterator<NameValuePair> otherIter = other.elements.values().iterator();
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        while (thisIter.hasNext() && otherIter.hasNext()) {
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            NameValuePair thisOne = thisIter.next();
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            NameValuePair otherOne = otherIter.next();
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            result = thisOne.compareTo(otherOne);
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (result != 0) {
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return result;
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (thisIter.hasNext()) {
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return 1;
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else if (otherIter.hasNext()) {
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return -1;
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return 0;
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String toString() {
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return toHuman();
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String toHuman() {
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        StringBuilder sb = new StringBuilder();
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sb.append(visibility.toHuman());
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sb.append("-annotation ");
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sb.append(type.toHuman());
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sb.append(" {");
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        boolean first = true;
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (NameValuePair pair : elements.values()) {
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (first) {
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                first = false;
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else {
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                sb.append(", ");
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            sb.append(pair.getName().toHuman());
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            sb.append(": ");
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            sb.append(pair.getValue().toHuman());
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sb.append("}");
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return sb.toString();
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the type of this instance.
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
16899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the type
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public CstType getType() {
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return type;
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the visibility of this instance.
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
17799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the visibility
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public AnnotationVisibility getVisibility() {
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return visibility;
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Put an element into the set of (name, value) pairs for this instance.
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If there is a preexisting element with the same name, it will be
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * replaced by this method.
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
18899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param pair {@code non-null;} the (name, value) pair to place into this instance
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void put(NameValuePair pair) {
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throwIfImmutable();
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (pair == null) {
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException("pair == null");
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        elements.put(pair.getName(), pair);
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Add an element to the set of (name, value) pairs for this instance.
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * It is an error to call this method if there is a preexisting element
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * with the same name.
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
20599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param pair {@code non-null;} the (name, value) pair to add to this instance
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void add(NameValuePair pair) {
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        throwIfImmutable();
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (pair == null) {
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException("pair == null");
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        CstUtf8 name = pair.getName();
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (elements.get(name) != null) {
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IllegalArgumentException("name already added: " + name);
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        elements.put(name, pair);
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the set of name-value pairs contained in this instance. The
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * result is always unmodifiable.
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
22799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the set of name-value pairs
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Collection<NameValuePair> getNameValuePairs() {
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return Collections.unmodifiableCollection(elements.values());
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
233