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