1f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License.  You may obtain a copy of the License at
8f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.util.jar;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Collection;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.HashMap;
224acd18f3adaaf8ac542f8fef20a4ef27bffa49f0Jesse Wilsonimport java.util.Locale;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Map;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Set;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The {@code Attributes} class is used to store values for manifest entries.
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Attribute keys are generally instances of {@code Attributes.Name}. Values
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * associated with attribute keys are of type {@code String}.
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class Attributes implements Cloneable, Map<Object, Object> {
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The {@code Attributes} as name/value pairs. Maps the attribute names (as
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@link Attributes.Name}) of a JAR file manifest to arbitrary values. The
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * attribute names thus are obtained from the {@link Manifest} for
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * convenience.
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected Map<Object, Object> map;
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The name part of the name/value pairs constituting an attribute as
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * defined by the specification of the JAR manifest. May be composed of the
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * following ASCII signs as defined in the EBNF below:
4557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <pre>
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * name       = alphanum *headerchar
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * headerchar = alphanum | - | _
4957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     * alphanum   = {A-Z} | {a-z} | {0-9}
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * </pre>
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static class Name {
53678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        /** The class path (a main attribute). */
54f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        public static final Name CLASS_PATH = new Name("Class-Path");
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
56678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        /** The version of the manifest file (a main attribute). */
57f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        public static final Name MANIFEST_VERSION = new Name("Manifest-Version");
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
59678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        /** The main class's name (for stand-alone applications). */
60f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        public static final Name MAIN_CLASS = new Name("Main-Class");
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
62678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        /** Defines the signature version of the JAR file. */
63678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        public static final Name SIGNATURE_VERSION = new Name("Signature-Version");
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
65678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        /** The {@code Content-Type} manifest attribute. */
66f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        public static final Name CONTENT_TYPE = new Name("Content-Type");
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Sealed} manifest attribute which may have the value
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * {@code true} for sealed archives.
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
72f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        public static final Name SEALED = new Name("Sealed");
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Implementation-Title} attribute whose value is a string
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * that defines the title of the extension implementation.
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
78678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        public static final Name IMPLEMENTATION_TITLE = new Name("Implementation-Title");
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Implementation-Version} attribute defining the version of
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * the extension implementation.
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
84678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        public static final Name IMPLEMENTATION_VERSION = new Name("Implementation-Version");
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Implementation-Vendor} attribute defining the organization
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * that maintains the extension implementation.
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
90678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        public static final Name IMPLEMENTATION_VENDOR = new Name("Implementation-Vendor");
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Specification-Title} attribute defining the title of the
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * extension specification.
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
96678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        public static final Name SPECIFICATION_TITLE = new Name("Specification-Title");
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Specification-Version} attribute defining the version of
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * the extension specification.
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
102678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        public static final Name SPECIFICATION_VERSION = new Name("Specification-Version");
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Specification-Vendor} attribute defining the organization
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * that maintains the extension specification.
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
108678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        public static final Name SPECIFICATION_VENDOR = new Name("Specification-Vendor");
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Extension-List} attribute defining the extensions that are
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * needed by the applet.
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
114f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        public static final Name EXTENSION_LIST = new Name("Extension-List");
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Extension-Name} attribute which defines the unique name of
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * the extension.
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
120f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        public static final Name EXTENSION_NAME = new Name("Extension-Name");
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Extension-Installation} attribute.
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
125678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        public static final Name EXTENSION_INSTALLATION = new Name("Extension-Installation");
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Implementation-Vendor-Id} attribute specifies the vendor
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * of an extension implementation if the applet requires an
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * implementation from a specific vendor.
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
132678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        public static final Name IMPLEMENTATION_VENDOR_ID = new Name("Implementation-Vendor-Id");
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Implementation-URL} attribute specifying a URL that can be
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * used to obtain the most recent version of the extension if the
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * required version is not already installed.
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
139678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        public static final Name IMPLEMENTATION_URL = new Name("Implementation-URL");
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
14159675dbb837c2a92352032e2ef0c8fc3305da9c8Elliott Hughes        /**
14259675dbb837c2a92352032e2ef0c8fc3305da9c8Elliott Hughes         * @hide
14359675dbb837c2a92352032e2ef0c8fc3305da9c8Elliott Hughes         */
14459675dbb837c2a92352032e2ef0c8fc3305da9c8Elliott Hughes        public static final Name NAME = new Name("Name");
14559675dbb837c2a92352032e2ef0c8fc3305da9c8Elliott Hughes
14659675dbb837c2a92352032e2ef0c8fc3305da9c8Elliott Hughes        private final String name;
14757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
148678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        public Name(String name) {
149678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson            // encoded name + "\r\n" must be <= 72 bytes; ASCII-only so byte count equals char count
150678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson            if (name.isEmpty() || name.length() > Manifest.LINE_LENGTH_LIMIT - 2) {
151678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson                throw new IllegalArgumentException(name);
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
15357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
154678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson            for (int i = 0; i < name.length(); i++) {
155678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson                char ch = name.charAt(i);
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (!((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        || ch == '_' || ch == '-' || (ch >= '0' && ch <= '9'))) {
158678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson                    throw new IllegalArgumentException(name);
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
16157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
162678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson            this.name = name;
16357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        }
16457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
165678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        String getName() {
16657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            return name;
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
169678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        @Override public boolean equals(Object object) {
170678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson            return object instanceof Name
1714acd18f3adaaf8ac542f8fef20a4ef27bffa49f0Jesse Wilson                    && ((Name) object).name.equalsIgnoreCase(name);
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
174678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        @Override public int hashCode() {
1754acd18f3adaaf8ac542f8fef20a4ef27bffa49f0Jesse Wilson            return name.toLowerCase(Locale.US).hashCode();
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
178678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        @Override public String toString() {
179678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson            return name;
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs an {@code Attributes} instance.
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Attributes() {
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        map = new HashMap<Object, Object>();
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs an {@code Attributes} instance obtaining keys and values from
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the parameter {@code attrib}.
19357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param attrib
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            The attributes to obtain entries from.
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unchecked")
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Attributes(Attributes attrib) {
19957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        map = (Map<Object, Object>) ((HashMap) attrib.map).clone();
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs an {@code Attributes} instance with initial capacity of size
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code size}.
20557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param size
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            Initial size of this {@code Attributes} instance.
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Attributes(int size) {
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        map = new HashMap<Object, Object>(size);
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Removes all key/value pairs from this {@code Attributes}.
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void clear() {
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        map.clear();
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Determines whether this {@code Attributes} contains the specified key.
22257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param key
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            The key to search for.
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the key is found, {@code false} otherwise.
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean containsKey(Object key) {
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return map.containsKey(key);
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Determines whether this {@code Attributes} contains the specified value.
23357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the value to search for.
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the value is found, {@code false} otherwise.
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean containsValue(Object value) {
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return map.containsValue(value);
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a set containing map entries for each of the key/value pair
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * contained in this {@code Attributes}.
24557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a set of Map.Entry's
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Set<Map.Entry<Object, Object>> entrySet() {
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return map.entrySet();
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the value associated with the parameter key.
25457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param key
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the key to search for.
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return Object associated with key, or {@code null} if key does not
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         exist.
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object get(Object key) {
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return map.get(key);
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Determines whether this {@code Attributes} contains any keys.
26657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if one or more keys exist, {@code false} otherwise.
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isEmpty() {
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return map.isEmpty();
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code Set} containing all the keys found in this {@code
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Attributes}.
27657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code Set} of all keys.
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Set<Object> keySet() {
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return map.keySet();
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Stores key/value pairs in this {@code Attributes}.
28557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param key
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the key to associate with value.
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the value to store in this {@code Attributes}.
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value being stored.
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @exception ClassCastException
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                when key is not an {@code Attributes.Name} or value is not
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                a {@code String}.
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
29557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    @SuppressWarnings("cast")
29657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    // Require cast to force ClassCastException
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object put(Object key, Object value) {
29857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        return map.put((Name) key, (String) value);
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
30257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     * Stores all the key/value pairs in the argument in this {@code
30357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     * Attributes}.
30457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param attrib
30657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *            the associations to store (must be of type {@code
30757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *            Attributes}).
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void putAll(Map<?, ?> attrib) {
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (attrib == null || !(attrib instanceof Attributes)) {
311415c7497ec02890a73eb293f98f69c1f6983389bElliott Hughes            throw new ClassCastException(attrib.getClass().getName() + " not an Attributes");
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.map.putAll(attrib);
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Deletes the key/value pair with key {@code key} from this {@code
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Attributes}.
31957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param key
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the key to remove.
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the values associated with the removed key, {@code null} if not
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         present.
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object remove(Object key) {
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return map.remove(key);
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the number of key/value pairs associated with this {@code
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Attributes}.
33257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the size of this {@code Attributes}.
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int size() {
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return map.size();
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
34057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     * Returns a collection of all the values present in this {@code
34157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     * Attributes}.
34257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a collection of all values present.
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Collection<Object> values() {
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return map.values();
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unchecked")
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object clone() {
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Attributes clone;
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            clone = (Attributes) super.clone();
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (CloneNotSupportedException e) {
356fb0ec0e650bf8be35acb0d47da0311a7c446aa33Elliott Hughes            throw new AssertionError(e);
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        clone.map = (Map<Object, Object>) ((HashMap) map).clone();
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return clone;
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the hash code of this {@code Attributes}.
36457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the hash code of this object.
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int hashCode() {
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return map.hashCode();
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Determines if this {@code Attributes} and the parameter {@code
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Attributes} are equal. Two {@code Attributes} instances are equal if they
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * contain the same keys and values.
37657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param obj
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object with which this {@code Attributes} is compared.
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the {@code Attributes} are equal, {@code false}
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         otherwise.
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean equals(Object obj) {
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (this == obj) {
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (obj instanceof Attributes) {
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return map.equals(((Attributes) obj).map);
389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return false;
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the value associated with the parameter {@code Attributes.Name}
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * key.
39657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the key to obtain the value for.
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code String} associated with name, or {@code null} if name
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         is not a valid key.
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getValue(Attributes.Name name) {
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (String) map.get(name);
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the string associated with the parameter name.
40857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the key to obtain the value for.
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the string associated with name, or {@code null} if name is not a
412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         valid key.
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getValue(String name) {
41559675dbb837c2a92352032e2ef0c8fc3305da9c8Elliott Hughes        return getValue(new Attributes.Name(name));
416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
41959675dbb837c2a92352032e2ef0c8fc3305da9c8Elliott Hughes     * Stores the value {@code value} associated with the key {@code name} in this
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code Attributes}.
42157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value being stored.
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
42459675dbb837c2a92352032e2ef0c8fc3305da9c8Elliott Hughes    public String putValue(String name, String value) {
42559675dbb837c2a92352032e2ef0c8fc3305da9c8Elliott Hughes        return (String) map.put(new Attributes.Name(name), value);
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
428