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        private final String name;
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
55678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        /** The class path (a main attribute). */
56f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        public static final Name CLASS_PATH = new Name("Class-Path");
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
58678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        /** The version of the manifest file (a main attribute). */
59f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        public static final Name MANIFEST_VERSION = new Name("Manifest-Version");
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
61678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        /** The main class's name (for stand-alone applications). */
62f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        public static final Name MAIN_CLASS = new Name("Main-Class");
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
64678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        /** Defines the signature version of the JAR file. */
65678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        public static final Name SIGNATURE_VERSION = new Name("Signature-Version");
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
67678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        /** The {@code Content-Type} manifest attribute. */
68f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        public static final Name CONTENT_TYPE = new Name("Content-Type");
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Sealed} manifest attribute which may have the value
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * {@code true} for sealed archives.
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
74f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        public static final Name SEALED = new Name("Sealed");
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Implementation-Title} attribute whose value is a string
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * that defines the title of the extension implementation.
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
80678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        public static final Name IMPLEMENTATION_TITLE = new Name("Implementation-Title");
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Implementation-Version} attribute defining the version of
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * the extension implementation.
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
86678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        public static final Name IMPLEMENTATION_VERSION = new Name("Implementation-Version");
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Implementation-Vendor} attribute defining the organization
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * that maintains the extension implementation.
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
92678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        public static final Name IMPLEMENTATION_VENDOR = new Name("Implementation-Vendor");
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Specification-Title} attribute defining the title of the
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * extension specification.
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
98678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        public static final Name SPECIFICATION_TITLE = new Name("Specification-Title");
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Specification-Version} attribute defining the version of
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * the extension specification.
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
104678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        public static final Name SPECIFICATION_VERSION = new Name("Specification-Version");
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Specification-Vendor} attribute defining the organization
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * that maintains the extension specification.
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
110678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        public static final Name SPECIFICATION_VENDOR = new Name("Specification-Vendor");
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Extension-List} attribute defining the extensions that are
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * needed by the applet.
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
116f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        public static final Name EXTENSION_LIST = new Name("Extension-List");
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Extension-Name} attribute which defines the unique name of
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * the extension.
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
122f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        public static final Name EXTENSION_NAME = new Name("Extension-Name");
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Extension-Installation} attribute.
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
127678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        public static final Name EXTENSION_INSTALLATION = new Name("Extension-Installation");
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Implementation-Vendor-Id} attribute specifies the vendor
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * of an extension implementation if the applet requires an
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * implementation from a specific vendor.
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
134678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        public static final Name IMPLEMENTATION_VENDOR_ID = new Name("Implementation-Vendor-Id");
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Implementation-URL} attribute specifying a URL that can be
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * used to obtain the most recent version of the extension if the
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * required version is not already installed.
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
141678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        public static final Name IMPLEMENTATION_URL = new Name("Implementation-URL");
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
143f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        static final Name NAME = new Name("Name");
14457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
145678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        public Name(String name) {
146678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson            // encoded name + "\r\n" must be <= 72 bytes; ASCII-only so byte count equals char count
147678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson            if (name.isEmpty() || name.length() > Manifest.LINE_LENGTH_LIMIT - 2) {
148678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson                throw new IllegalArgumentException(name);
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
15057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
151678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson            for (int i = 0; i < name.length(); i++) {
152678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson                char ch = name.charAt(i);
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (!((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        || ch == '_' || ch == '-' || (ch >= '0' && ch <= '9'))) {
155678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson                    throw new IllegalArgumentException(name);
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
15857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
159678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson            this.name = name;
16057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        }
16157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
162678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        String getName() {
16357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            return name;
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
166678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        @Override public boolean equals(Object object) {
167678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson            return object instanceof Name
1684acd18f3adaaf8ac542f8fef20a4ef27bffa49f0Jesse Wilson                    && ((Name) object).name.equalsIgnoreCase(name);
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
171678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        @Override public int hashCode() {
1724acd18f3adaaf8ac542f8fef20a4ef27bffa49f0Jesse Wilson            return name.toLowerCase(Locale.US).hashCode();
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
175678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson        @Override public String toString() {
176678e3d534e57c24e3a75a5153cc24714ebdaad8fJesse Wilson            return name;
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs an {@code Attributes} instance.
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Attributes() {
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        map = new HashMap<Object, Object>();
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs an {@code Attributes} instance obtaining keys and values from
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the parameter {@code attrib}.
19057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param attrib
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            The attributes to obtain entries from.
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unchecked")
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Attributes(Attributes attrib) {
19657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        map = (Map<Object, Object>) ((HashMap) attrib.map).clone();
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs an {@code Attributes} instance with initial capacity of size
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code size}.
20257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param size
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            Initial size of this {@code Attributes} instance.
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Attributes(int size) {
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        map = new HashMap<Object, Object>(size);
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Removes all key/value pairs from this {@code Attributes}.
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void clear() {
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        map.clear();
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Determines whether this {@code Attributes} contains the specified key.
21957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param key
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            The key to search for.
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the key is found, {@code false} otherwise.
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean containsKey(Object key) {
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return map.containsKey(key);
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Determines whether this {@code Attributes} contains the specified value.
23057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the value to search for.
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the value is found, {@code false} otherwise.
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean containsValue(Object value) {
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return map.containsValue(value);
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a set containing map entries for each of the key/value pair
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * contained in this {@code Attributes}.
24257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a set of Map.Entry's
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Set<Map.Entry<Object, Object>> entrySet() {
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return map.entrySet();
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the value associated with the parameter key.
25157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param key
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the key to search for.
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return Object associated with key, or {@code null} if key does not
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         exist.
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object get(Object key) {
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return map.get(key);
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Determines whether this {@code Attributes} contains any keys.
26357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if one or more keys exist, {@code false} otherwise.
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isEmpty() {
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return map.isEmpty();
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code Set} containing all the keys found in this {@code
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Attributes}.
27357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code Set} of all keys.
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Set<Object> keySet() {
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return map.keySet();
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Stores key/value pairs in this {@code Attributes}.
28257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param key
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the key to associate with value.
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the value to store in this {@code Attributes}.
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value being stored.
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @exception ClassCastException
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                when key is not an {@code Attributes.Name} or value is not
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                a {@code String}.
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
29257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    @SuppressWarnings("cast")
29357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    // Require cast to force ClassCastException
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object put(Object key, Object value) {
29557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        return map.put((Name) key, (String) value);
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
29957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     * Stores all the key/value pairs in the argument in this {@code
30057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     * Attributes}.
30157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param attrib
30357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *            the associations to store (must be of type {@code
30457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *            Attributes}).
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void putAll(Map<?, ?> attrib) {
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (attrib == null || !(attrib instanceof Attributes)) {
308415c7497ec02890a73eb293f98f69c1f6983389bElliott Hughes            throw new ClassCastException(attrib.getClass().getName() + " not an Attributes");
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.map.putAll(attrib);
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Deletes the key/value pair with key {@code key} from this {@code
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Attributes}.
31657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param key
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the key to remove.
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the values associated with the removed key, {@code null} if not
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         present.
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object remove(Object key) {
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return map.remove(key);
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the number of key/value pairs associated with this {@code
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Attributes}.
32957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the size of this {@code Attributes}.
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int size() {
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return map.size();
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
33757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     * Returns a collection of all the values present in this {@code
33857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     * Attributes}.
33957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a collection of all values present.
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Collection<Object> values() {
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return map.values();
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unchecked")
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object clone() {
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Attributes clone;
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            clone = (Attributes) super.clone();
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (CloneNotSupportedException e) {
353fb0ec0e650bf8be35acb0d47da0311a7c446aa33Elliott Hughes            throw new AssertionError(e);
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        clone.map = (Map<Object, Object>) ((HashMap) map).clone();
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return clone;
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the hash code of this {@code Attributes}.
36157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the hash code of this object.
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int hashCode() {
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return map.hashCode();
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Determines if this {@code Attributes} and the parameter {@code
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Attributes} are equal. Two {@code Attributes} instances are equal if they
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * contain the same keys and values.
37357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param obj
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object with which this {@code Attributes} is compared.
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the {@code Attributes} are equal, {@code false}
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         otherwise.
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean equals(Object obj) {
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (this == obj) {
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (obj instanceof Attributes) {
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return map.equals(((Attributes) obj).map);
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return false;
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the value associated with the parameter {@code Attributes.Name}
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * key.
39357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the key to obtain the value for.
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code String} associated with name, or {@code null} if name
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         is not a valid key.
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getValue(Attributes.Name name) {
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (String) map.get(name);
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the string associated with the parameter name.
40557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the key to obtain the value for.
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the string associated with name, or {@code null} if name is not a
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         valid key.
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getValue(String name) {
412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (String) map.get(new Attributes.Name(name));
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Stores the value {@code val} associated with the key {@code name} in this
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code Attributes}.
41857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the key to store.
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param val
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the value to store in this {@code Attributes}.
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value being stored.
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String putValue(String name, String val) {
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (String) map.put(new Attributes.Name(name), val);
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
429