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