Attributes.java revision f33eae7e84eb6d3b0f4e86b59605bb3de73009f3
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
2057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilsonimport java.io.UnsupportedEncodingException;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Collection;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.HashMap;
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 Projectimport org.apache.harmony.archive.util.Util;
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The {@code Attributes} class is used to store values for manifest entries.
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Attribute keys are generally instances of {@code Attributes.Name}. Values
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * associated with attribute keys are of type {@code String}.
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class Attributes implements Cloneable, Map<Object, Object> {
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The {@code Attributes} as name/value pairs. Maps the attribute names (as
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@link Attributes.Name}) of a JAR file manifest to arbitrary values. The
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * attribute names thus are obtained from the {@link Manifest} for
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * convenience.
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected Map<Object, Object> map;
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The name part of the name/value pairs constituting an attribute as
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * defined by the specification of the JAR manifest. May be composed of the
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * following ASCII signs as defined in the EBNF below:
4757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <pre>
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * name       = alphanum *headerchar
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * headerchar = alphanum | - | _
5157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     * alphanum   = {A-Z} | {a-z} | {0-9}
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * </pre>
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static class Name {
5557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        private final byte[] name;
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private int hashCode;
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The class path (a main attribute).
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
62f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        public static final Name CLASS_PATH = new Name("Class-Path");
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The version of the manifest file (a main attribute).
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
67f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        public static final Name MANIFEST_VERSION = new Name("Manifest-Version");
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The main class's name (for stand-alone applications).
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
72f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        public static final Name MAIN_CLASS = new Name("Main-Class");
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Defines the signature version of the JAR file.
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public static final Name SIGNATURE_VERSION = new Name(
78f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes                "Signature-Version");
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Content-Type} manifest attribute.
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
83f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        public static final Name CONTENT_TYPE = new Name("Content-Type");
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Sealed} manifest attribute which may have the value
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * {@code true} for sealed archives.
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
89f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        public static final Name SEALED = new Name("Sealed");
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Implementation-Title} attribute whose value is a string
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * that defines the title of the extension implementation.
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public static final Name IMPLEMENTATION_TITLE = new Name(
96f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes                "Implementation-Title");
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Implementation-Version} attribute defining the version of
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * the extension implementation.
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public static final Name IMPLEMENTATION_VERSION = new Name(
103f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes                "Implementation-Version");
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Implementation-Vendor} attribute defining the organization
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * that maintains the extension implementation.
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public static final Name IMPLEMENTATION_VENDOR = new Name(
110f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes                "Implementation-Vendor");
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Specification-Title} attribute defining the title of the
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * extension specification.
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public static final Name SPECIFICATION_TITLE = new Name(
117f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes                "Specification-Title");
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Specification-Version} attribute defining the version of
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * the extension specification.
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public static final Name SPECIFICATION_VERSION = new Name(
124f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes                "Specification-Version");
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Specification-Vendor} attribute defining the organization
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * that maintains the extension specification.
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public static final Name SPECIFICATION_VENDOR = new Name(
131f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes                "Specification-Vendor");
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Extension-List} attribute defining the extensions that are
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * needed by the applet.
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
137f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        public static final Name EXTENSION_LIST = new Name("Extension-List");
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Extension-Name} attribute which defines the unique name of
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * the extension.
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
143f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        public static final Name EXTENSION_NAME = new Name("Extension-Name");
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Extension-Installation} attribute.
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public static final Name EXTENSION_INSTALLATION = new Name(
149f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes                "Extension-Installation");
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Implementation-Vendor-Id} attribute specifies the vendor
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * of an extension implementation if the applet requires an
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * implementation from a specific vendor.
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public static final Name IMPLEMENTATION_VENDOR_ID = new Name(
157f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes                "Implementation-Vendor-Id");
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * The {@code Implementation-URL} attribute specifying a URL that can be
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * used to obtain the most recent version of the extension if the
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * required version is not already installed.
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public static final Name IMPLEMENTATION_URL = new Name(
165f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes                "Implementation-URL");
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
167f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        static final Name NAME = new Name("Name");
16857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * A String which must satisfy the following EBNF grammar to specify an
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * additional attribute:
17257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson         *
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * <pre>
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * name       = alphanum *headerchar
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * headerchar = alphanum | - | _
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * alphanum   = {A-Z} | {a-z} | {0-9}
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * </pre>
17857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson         *
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param s
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *            The Attribute string.
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @exception IllegalArgumentException
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *                if the string does not satisfy the EBNF grammar.
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public Name(String s) {
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int i = s.length();
18657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            if (i == 0 || i > Manifest.LINE_LENGTH_LIMIT - 2) {
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new IllegalArgumentException();
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
18957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
19057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            name = new byte[i];
19157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (; --i >= 0;) {
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                char ch = s.charAt(i);
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (!((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        || ch == '_' || ch == '-' || (ch >= '0' && ch <= '9'))) {
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    throw new IllegalArgumentException(s);
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
19857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                name[i] = (byte) ch;
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
20057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        }
20157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
20257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        /**
20357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson         * A private constructor for a trusted attribute name.
20457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson         */
20557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        Name(byte[] buf) {
20657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            name = buf;
20757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        }
20857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
20957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        byte[] getBytes() {
21057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            return name;
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Returns this attribute name.
21557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson         *
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @return the attribute name.
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public String toString() {
22057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            try {
221f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes                return new String(name, "ISO-8859-1");
22257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            } catch (UnsupportedEncodingException iee) {
22357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                throw new InternalError(iee.getLocalizedMessage());
22457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            }
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
228f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson         * Returns whether the argument provided is the same as the attribute
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * name.
23057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson         *
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @return if the attribute names correspond.
23257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson         * @param object
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *            An attribute name to be compared with this name.
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
23657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        public boolean equals(Object object) {
23757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            if (object == null || object.getClass() != getClass()
23857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    || object.hashCode() != hashCode()) {
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return false;
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
24157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
242f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson            return Util.asciiEqualsIgnoreCase(name, ((Name) object).name);
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Computes a hash code of the name.
24757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson         *
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @return the hash value computed from the name.
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public int hashCode() {
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (hashCode == 0) {
25357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                int hash = 0, multiplier = 1;
25457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                for (int i = name.length - 1; i >= 0; i--) {
25557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    // 'A' & 0xDF == 'a' & 0xDF, ..., 'Z' & 0xDF == 'z' & 0xDF
25657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    hash += (name[i] & 0xDF) * multiplier;
25757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    int shifted = multiplier << 5;
25857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    multiplier = shifted - multiplier;
25957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                }
26057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                hashCode = hash;
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return hashCode;
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
26457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs an {@code Attributes} instance.
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Attributes() {
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        map = new HashMap<Object, Object>();
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs an {@code Attributes} instance obtaining keys and values from
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the parameter {@code attrib}.
27757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param attrib
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            The attributes to obtain entries from.
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unchecked")
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Attributes(Attributes attrib) {
28357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        map = (Map<Object, Object>) ((HashMap) attrib.map).clone();
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs an {@code Attributes} instance with initial capacity of size
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code size}.
28957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param size
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            Initial size of this {@code Attributes} instance.
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Attributes(int size) {
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        map = new HashMap<Object, Object>(size);
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Removes all key/value pairs from this {@code Attributes}.
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void clear() {
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        map.clear();
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Determines whether this {@code Attributes} contains the specified key.
30657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param key
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            The key to search for.
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the key is found, {@code false} otherwise.
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean containsKey(Object key) {
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return map.containsKey(key);
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Determines whether this {@code Attributes} contains the specified value.
31757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the value to search for.
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the value is found, {@code false} otherwise.
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean containsValue(Object value) {
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return map.containsValue(value);
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a set containing map entries for each of the key/value pair
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * contained in this {@code Attributes}.
32957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a set of Map.Entry's
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Set<Map.Entry<Object, Object>> entrySet() {
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return map.entrySet();
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the value associated with the parameter key.
33857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param key
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the key to search for.
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return Object associated with key, or {@code null} if key does not
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         exist.
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object get(Object key) {
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return map.get(key);
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Determines whether this {@code Attributes} contains any keys.
35057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if one or more keys exist, {@code false} otherwise.
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isEmpty() {
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return map.isEmpty();
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code Set} containing all the keys found in this {@code
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Attributes}.
36057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code Set} of all keys.
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Set<Object> keySet() {
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return map.keySet();
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Stores key/value pairs in this {@code Attributes}.
36957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param key
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the key to associate with value.
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the value to store in this {@code Attributes}.
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value being stored.
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @exception ClassCastException
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                when key is not an {@code Attributes.Name} or value is not
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                a {@code String}.
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
37957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    @SuppressWarnings("cast")
38057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    // Require cast to force ClassCastException
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object put(Object key, Object value) {
38257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        return map.put((Name) key, (String) value);
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
38657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     * Stores all the key/value pairs in the argument in this {@code
38757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     * Attributes}.
38857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param attrib
39057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *            the associations to store (must be of type {@code
39157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *            Attributes}).
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void putAll(Map<?, ?> attrib) {
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (attrib == null || !(attrib instanceof Attributes)) {
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new ClassCastException();
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.map.putAll(attrib);
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Deletes the key/value pair with key {@code key} from this {@code
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Attributes}.
40357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param key
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the key to remove.
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the values associated with the removed key, {@code null} if not
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         present.
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object remove(Object key) {
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return map.remove(key);
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the number of key/value pairs associated with this {@code
415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Attributes}.
41657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the size of this {@code Attributes}.
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int size() {
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return map.size();
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
42457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     * Returns a collection of all the values present in this {@code
42557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     * Attributes}.
42657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a collection of all values present.
428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Collection<Object> values() {
430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return map.values();
431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unchecked")
434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Object clone() {
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Attributes clone;
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            clone = (Attributes) super.clone();
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (CloneNotSupportedException e) {
4401c422fc0ab0692e10a05af6f48c6276c4dad4beaJesse Wilson            throw new AssertionError(e); // android-changed
441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        clone.map = (Map<Object, Object>) ((HashMap) map).clone();
443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return clone;
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the hash code of this {@code Attributes}.
44857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the hash code of this object.
450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int hashCode() {
453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return map.hashCode();
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Determines if this {@code Attributes} and the parameter {@code
458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Attributes} are equal. Two {@code Attributes} instances are equal if they
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * contain the same keys and values.
46057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param obj
462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object with which this {@code Attributes} is compared.
463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the {@code Attributes} are equal, {@code false}
464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         otherwise.
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean equals(Object obj) {
468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (this == obj) {
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (obj instanceof Attributes) {
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return map.equals(((Attributes) obj).map);
473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return false;
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the value associated with the parameter {@code Attributes.Name}
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * key.
48057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the key to obtain the value for.
483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code String} associated with name, or {@code null} if name
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         is not a valid key.
485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getValue(Attributes.Name name) {
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (String) map.get(name);
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the string associated with the parameter name.
49257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the key to obtain the value for.
495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the string associated with name, or {@code null} if name is not a
496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         valid key.
497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getValue(String name) {
499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (String) map.get(new Attributes.Name(name));
500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Stores the value {@code val} associated with the key {@code name} in this
504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code Attributes}.
50557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson     *
506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the key to store.
508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param val
509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the value to store in this {@code Attributes}.
510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the value being stored.
511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String putValue(String name, String val) {
513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (String) map.put(new Attributes.Name(name), val);
514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
516