151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 22c87ad3a45cecf9e344487cad1abfdebe79f2c7cNarayan Kamath * Copyright (C) 2014 The Android Open Source Project 303d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code). 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions. 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage java.util.jar; 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.DataInputStream; 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.DataOutputStream; 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.IOException; 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.HashMap; 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Map; 3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Set; 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Collection; 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.AbstractSet; 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Iterator; 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.util.logging.PlatformLogger; 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Comparator; 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.misc.ASCIICaseInsensitiveComparator; 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/** 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The Attributes class maps Manifest attribute names to associated string 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * values. Valid attribute names are case-insensitive, are restricted to 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the ASCII characters in the set [0-9a-zA-Z_-], and cannot exceed 70 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * characters in length. Attribute values can contain any characters and 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * will be UTF8-encoded when written to the output stream. See the 48d2449bb576ad1e3a3877364e5e1ae28625f69e35Yi Kong * <a href="{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/jar/jar.html">JAR File Specification</a> 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * for more information about valid attribute names and values. 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author David Connelly 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see Manifest 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.2 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic class Attributes implements Map<Object,Object>, Cloneable { 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The attribute name-value mappings. 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected Map<Object,Object> map; 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Constructs a new, empty Attributes object with default size. 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Attributes() { 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this(11); 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Constructs a new, empty Attributes object with the specified 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * initial size. 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param size the initial number of attributes 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Attributes(int size) { 7503d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak map = new HashMap<>(size); 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Constructs a new Attributes object with the same attribute name-value 8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * mappings as in the specified Attributes. 8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param attr the specified Attributes 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Attributes(Attributes attr) { 8503d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak map = new HashMap<>(attr); 8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the value of the specified attribute name, or null if the 9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * attribute name was not found. 9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param name the attribute name 9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the value of the specified attribute name, or null if 9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * not found. 9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Object get(Object name) { 9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return map.get(name); 9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the value of the specified attribute name, specified as 10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * a string, or null if the attribute was not found. The attribute 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * name is case-insensitive. 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This method is defined as: 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <pre> 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * return (String)get(new Attributes.Name((String)name)); 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </pre> 11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param name the attribute name as a string 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the String value of the specified attribute name, or null if 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * not found. 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IllegalArgumentException if the attribute name is invalid 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public String getValue(String name) { 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return (String)get(new Attributes.Name(name)); 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the value of the specified Attributes.Name, or null if the 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * attribute was not found. 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This method is defined as: 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <pre> 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * return (String)get(name); 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </pre> 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param name the Attributes.Name object 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the String value of the specified Attribute.Name, or null if 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * not found. 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public String getValue(Name name) { 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return (String)get(name); 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Associates the specified value with the specified attribute name 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (key) in this Map. If the Map previously contained a mapping for 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the attribute name, the old value is replaced. 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param name the attribute name 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param value the attribute value 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the previous value of the attribute, or null if none 14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception ClassCastException if the name is not a Attributes.Name 14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or the value is not a String 14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Object put(Object name, Object value) { 14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return map.put((Attributes.Name)name, (String)value); 15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Associates the specified value with the specified attribute name, 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * specified as a String. The attributes name is case-insensitive. 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If the Map previously contained a mapping for the attribute name, 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the old value is replaced. 15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This method is defined as: 15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <pre> 16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * return (String)put(new Attributes.Name(name), value); 16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </pre> 16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param name the attribute name as a string 16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param value the attribute value 16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the previous value of the attribute, or null if none 16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IllegalArgumentException if the attribute name is invalid 16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public String putValue(String name, String value) { 16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return (String)put(new Name(name), value); 17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Removes the attribute with the specified name (key) from this Map. 17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the previous attribute value, or null if none. 17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param name attribute name 17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the previous value of the attribute, or null if none 17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Object remove(Object name) { 18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return map.remove(name); 18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns true if this Map maps one or more attribute names (keys) 18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * to the specified value. 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param value the attribute value 18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return true if this Map maps one or more attribute names to 18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the specified value 19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean containsValue(Object value) { 19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return map.containsValue(value); 19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns true if this Map contains the specified attribute name (key). 19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param name the attribute name 19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return true if this Map contains the specified attribute name 20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean containsKey(Object name) { 20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return map.containsKey(name); 20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copies all of the attribute name-value mappings from the specified 20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Attributes to this Map. Duplicate mappings will be replaced. 20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param attr the Attributes to be stored in this map 21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception ClassCastException if attr is not an Attributes 21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void putAll(Map<?,?> attr) { 21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // ## javac bug? 21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!Attributes.class.isInstance(attr)) 21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new ClassCastException(); 21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for (Map.Entry<?,?> me : (attr).entrySet()) 21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski put(me.getKey(), me.getValue()); 21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Removes all attributes from this Map. 22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void clear() { 22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski map.clear(); 22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the number of attributes in this Map. 22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public int size() { 23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return map.size(); 23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns true if this Map contains no attributes. 23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean isEmpty() { 23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return map.isEmpty(); 23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns a Set view of the attribute names (keys) contained in this Map. 24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Set<Object> keySet() { 24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return map.keySet(); 24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns a Collection view of the attribute values contained in this Map. 25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Collection<Object> values() { 25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return map.values(); 25351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 25451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 25551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 25651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns a Collection view of the attribute name-value mappings 25751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * contained in this Map. 25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 25951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Set<Map.Entry<Object,Object>> entrySet() { 26051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return map.entrySet(); 26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Compares the specified Attributes object with this Map for equality. 26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns true if the given object is also an instance of Attributes 26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * and the two Attributes objects represent the same mappings. 26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param o the Object to be compared 26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return true if the specified Object is equal to this Map 27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 27151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean equals(Object o) { 27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return map.equals(o); 27351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 27551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the hash code value for this Map. 27751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public int hashCode() { 27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return map.hashCode(); 28051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 28151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 28251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 28351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns a copy of the Attributes, implemented as follows: 28451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <pre> 28551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * public Object clone() { return new Attributes(this); } 28651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </pre> 28751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Since the attribute names and values are themselves immutable, 28851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the Attributes returned can be safely modified without affecting 28951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the original. 29051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 29151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Object clone() { 29251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return new Attributes(this); 29351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 29451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 29551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* 29651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Writes the current attributes to the specified data output stream. 29751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * XXX Need to handle UTF8 values and break up lines longer than 72 bytes 29851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 29951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski void write(DataOutputStream os) throws IOException { 30003d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak Iterator<Map.Entry<Object, Object>> it = entrySet().iterator(); 30151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while (it.hasNext()) { 30203d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak Map.Entry<Object, Object> e = it.next(); 30351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski StringBuffer buffer = new StringBuffer( 30451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ((Name)e.getKey()).toString()); 30551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski buffer.append(": "); 30651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 30751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String value = (String)e.getValue(); 30851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (value != null) { 30951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski byte[] vb = value.getBytes("UTF8"); 31051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski value = new String(vb, 0, 0, vb.length); 31151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 31251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski buffer.append(value); 31351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 31451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski buffer.append("\r\n"); 31551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Manifest.make72Safe(buffer); 31651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski os.writeBytes(buffer.toString()); 31751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 31851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski os.writeBytes("\r\n"); 31951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 32051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 32151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* 32251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Writes the current attributes to the specified data output stream, 32351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * make sure to write out the MANIFEST_VERSION or SIGNATURE_VERSION 32451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * attributes first. 32551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 32651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * XXX Need to handle UTF8 values and break up lines longer than 72 bytes 32751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 32851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski void writeMain(DataOutputStream out) throws IOException 32951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski { 33051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // write out the *-Version header first, if it exists 33151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String vername = Name.MANIFEST_VERSION.toString(); 33251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String version = getValue(vername); 33351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (version == null) { 33451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski vername = Name.SIGNATURE_VERSION.toString(); 33551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski version = getValue(vername); 33651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 33751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 33851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (version != null) { 33951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski out.writeBytes(vername+": "+version+"\r\n"); 34051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 34151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 34251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // write out all attributes except for the version 34351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // we wrote out earlier 34403d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak Iterator<Map.Entry<Object, Object>> it = entrySet().iterator(); 34551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while (it.hasNext()) { 34603d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak Map.Entry<Object, Object> e = it.next(); 34751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String name = ((Name)e.getKey()).toString(); 34851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if ((version != null) && ! (name.equalsIgnoreCase(vername))) { 34951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 35051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski StringBuffer buffer = new StringBuffer(name); 35151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski buffer.append(": "); 35251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 35351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String value = (String)e.getValue(); 35451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (value != null) { 35551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski byte[] vb = value.getBytes("UTF8"); 35651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski value = new String(vb, 0, 0, vb.length); 35751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 35851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski buffer.append(value); 35951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 36051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski buffer.append("\r\n"); 36151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Manifest.make72Safe(buffer); 36251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski out.writeBytes(buffer.toString()); 36351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 36451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 36551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski out.writeBytes("\r\n"); 36651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 36751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 36851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /* 36951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Reads attributes from the specified input stream. 37051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * XXX Need to handle UTF8 values. 37151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 37251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski void read(Manifest.FastInputStream is, byte[] lbuf) throws IOException { 37351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String name = null, value = null; 37451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski byte[] lastline = null; 37551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 37651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int len; 37751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while ((len = is.readLine(lbuf)) != -1) { 37851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski boolean lineContinued = false; 37951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (lbuf[--len] != '\n') { 38051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IOException("line too long"); 38151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 38251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (len > 0 && lbuf[len-1] == '\r') { 38351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski --len; 38451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 38551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (len == 0) { 38651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski break; 38751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 38851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int i = 0; 38951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (lbuf[0] == ' ') { 39051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // continuation of previous line 39151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (name == null) { 39251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IOException("misplaced continuation line"); 39351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 39451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski lineContinued = true; 39551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski byte[] buf = new byte[lastline.length + len - 1]; 39651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.arraycopy(lastline, 0, buf, 0, lastline.length); 39751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.arraycopy(lbuf, 1, buf, lastline.length, len - 1); 39851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (is.peek() == ' ') { 39951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski lastline = buf; 40051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski continue; 40151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 40251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski value = new String(buf, 0, buf.length, "UTF8"); 40351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski lastline = null; 40451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 40551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while (lbuf[i++] != ':') { 40651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (i >= len) { 40751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IOException("invalid header field"); 40851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 40951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 41051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (lbuf[i++] != ' ') { 41151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IOException("invalid header field"); 41251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 41351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski name = new String(lbuf, 0, 0, i - 2); 41451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (is.peek() == ' ') { 41551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski lastline = new byte[len - i]; 41651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski System.arraycopy(lbuf, i, lastline, 0, len - i); 41751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski continue; 41851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 41951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski value = new String(lbuf, i, len - i, "UTF8"); 42051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 42151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 42251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if ((putValue(name, value) != null) && (!lineContinued)) { 42351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski PlatformLogger.getLogger("java.util.jar").warning( 42451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski "Duplicate name in Manifest: " + name 42551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski + ".\n" 42651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski + "Ensure that the manifest does not " 42751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski + "have duplicate entries, and\n" 42851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski + "that blank lines separate " 42951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski + "individual sections in both your\n" 43051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski + "manifest and in the META-INF/MANIFEST.MF " 43151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski + "entry in the jar file."); 43251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 43351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (IllegalArgumentException e) { 43451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IOException("invalid header field name: " + name); 43551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 43651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 43751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 43851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 43951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 44051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The Attributes.Name class represents an attribute name stored in 44151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * this Map. Valid attribute names are case-insensitive, are restricted 44251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * to the ASCII characters in the set [0-9a-zA-Z_-], and cannot exceed 44351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 70 characters in length. Attribute values can contain any characters 44451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * and will be UTF8-encoded when written to the output stream. See the 445d2449bb576ad1e3a3877364e5e1ae28625f69e35Yi Kong * <a href="{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/jar/jar.html">JAR File Specification</a> 44651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * for more information about valid attribute names and values. 44751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 44851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static class Name { 44951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private String name; 45051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private int hashCode = -1; 45151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 45251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 45351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Constructs a new attribute name using the given string name. 45451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 45551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param name the attribute string name 45651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IllegalArgumentException if the attribute name was 45751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * invalid 45851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception NullPointerException if the attribute name was null 45951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 46051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Name(String name) { 46151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (name == null) { 46251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new NullPointerException("name"); 46351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 46451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!isValid(name)) { 46551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IllegalArgumentException(name); 46651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 46751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.name = name.intern(); 46851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 46951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 47051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static boolean isValid(String name) { 47151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int len = name.length(); 47251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (len > 70 || len == 0) { 47351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 47451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 47551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for (int i = 0; i < len; i++) { 47651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!isValid(name.charAt(i))) { 47751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 47851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 47951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 48051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return true; 48151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 48251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 48351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static boolean isValid(char c) { 48451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return isAlpha(c) || isDigit(c) || c == '_' || c == '-'; 48551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 48651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 48751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static boolean isAlpha(char c) { 48851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'); 48951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 49051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 49151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static boolean isDigit(char c) { 49251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return c >= '0' && c <= '9'; 49351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 49451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 49551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 49651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Compares this attribute name to another for equality. 49751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param o the object to compare 49851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return true if this attribute name is equal to the 49951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * specified attribute object 50051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 50151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean equals(Object o) { 50251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (o instanceof Name) { 50303d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak Comparator<String> c = ASCIICaseInsensitiveComparator.CASE_INSENSITIVE_ORDER; 50451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return c.compare(name, ((Name)o).name) == 0; 50551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 50651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 50751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 50851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 50951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 51051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 51151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Computes the hash value for this attribute name. 51251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 51351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public int hashCode() { 51451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (hashCode == -1) { 51551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski hashCode = ASCIICaseInsensitiveComparator.lowerCaseHashCode(name); 51651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 51751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return hashCode; 51851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 51951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 52051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 52151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the attribute name as a String. 52251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 52351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public String toString() { 52451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return name; 52551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 52651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 52751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 52851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>Name</code> object for <code>Manifest-Version</code> 52951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * manifest attribute. This attribute indicates the version number 53051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * of the manifest standard to which a JAR file's manifest conforms. 531d2449bb576ad1e3a3877364e5e1ae28625f69e35Yi Kong * @see <a href="{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/jar/jar.html#JAR Manifest"> 53251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Manifest and Signature Specification</a> 53351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 53451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final Name MANIFEST_VERSION = new Name("Manifest-Version"); 53551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 53651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 53751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>Name</code> object for <code>Signature-Version</code> 53851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * manifest attribute used when signing JAR files. 539d2449bb576ad1e3a3877364e5e1ae28625f69e35Yi Kong * @see <a href="{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/jar/jar.html#JAR Manifest"> 54051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Manifest and Signature Specification</a> 54151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 54251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final Name SIGNATURE_VERSION = new Name("Signature-Version"); 54351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 54451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 54551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>Name</code> object for <code>Content-Type</code> 54651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * manifest attribute. 54751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 54851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final Name CONTENT_TYPE = new Name("Content-Type"); 54951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 55051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 55151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>Name</code> object for <code>Class-Path</code> 55251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * manifest attribute. Bundled extensions can use this attribute 55351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * to find other JAR files containing needed classes. 55403d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak * @see <a href="{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/jar/jar.html#classpath"> 55503d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak * JAR file specification</a> 55651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 55751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final Name CLASS_PATH = new Name("Class-Path"); 55851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 55951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 56051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>Name</code> object for <code>Main-Class</code> manifest 56151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * attribute used for launching applications packaged in JAR files. 56251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The <code>Main-Class</code> attribute is used in conjunction 56351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * with the <code>-jar</code> command-line option of the 56451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>java</tt> application launcher. 56551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 56651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final Name MAIN_CLASS = new Name("Main-Class"); 56751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 56851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 56951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>Name</code> object for <code>Sealed</code> manifest attribute 57051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * used for sealing. 57103d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak * @see <a href="{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/jar/jar.html#sealing"> 57203d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak * Package Sealing</a> 57351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 57451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final Name SEALED = new Name("Sealed"); 57551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 57651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 57751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>Name</code> object for <code>Extension-List</code> manifest attribute 57851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * used for declaring dependencies on installed extensions. 579d2449bb576ad1e3a3877364e5e1ae28625f69e35Yi Kong * @see <a href="{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/extensions/spec.html#dependency"> 58051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Installed extension dependency</a> 58151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 58251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final Name EXTENSION_LIST = new Name("Extension-List"); 58351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 58451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 58551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>Name</code> object for <code>Extension-Name</code> manifest attribute 58651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * used for declaring dependencies on installed extensions. 587d2449bb576ad1e3a3877364e5e1ae28625f69e35Yi Kong * @see <a href="{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/extensions/spec.html#dependency"> 58851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Installed extension dependency</a> 58951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 59051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final Name EXTENSION_NAME = new Name("Extension-Name"); 59151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 59251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 59351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>Name</code> object for <code>Extension-Name</code> manifest attribute 59451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * used for declaring dependencies on installed extensions. 59503d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak * @deprecated Extension mechanism will be removed in a future release. 59603d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak * Use class path instead. 597d2449bb576ad1e3a3877364e5e1ae28625f69e35Yi Kong * @see <a href="{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/extensions/spec.html#dependency"> 59851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Installed extension dependency</a> 59951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 60003d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak @Deprecated 60151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final Name EXTENSION_INSTALLATION = new Name("Extension-Installation"); 60251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 60351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 60451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>Name</code> object for <code>Implementation-Title</code> 60551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * manifest attribute used for package versioning. 606d2449bb576ad1e3a3877364e5e1ae28625f69e35Yi Kong * @see <a href="{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/versioning/spec/versioning2.html#wp90779"> 60751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Java Product Versioning Specification</a> 60851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 60951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final Name IMPLEMENTATION_TITLE = new Name("Implementation-Title"); 61051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 61151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 61251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>Name</code> object for <code>Implementation-Version</code> 61351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * manifest attribute used for package versioning. 614d2449bb576ad1e3a3877364e5e1ae28625f69e35Yi Kong * @see <a href="{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/versioning/spec/versioning2.html#wp90779"> 61551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Java Product Versioning Specification</a> 61651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 61751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final Name IMPLEMENTATION_VERSION = new Name("Implementation-Version"); 61851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 61951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 62051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>Name</code> object for <code>Implementation-Vendor</code> 62151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * manifest attribute used for package versioning. 622d2449bb576ad1e3a3877364e5e1ae28625f69e35Yi Kong * @see <a href="{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/versioning/spec/versioning2.html#wp90779"> 62351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Java Product Versioning Specification</a> 62451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 62551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final Name IMPLEMENTATION_VENDOR = new Name("Implementation-Vendor"); 62651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 62751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 62851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>Name</code> object for <code>Implementation-Vendor-Id</code> 62951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * manifest attribute used for package versioning. 63003d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak * @deprecated Extension mechanism will be removed in a future release. 63103d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak * Use class path instead. 63203d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak * @see <a href="{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/extensions/versioning.html#applet"> 63303d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak * Optional Package Versioning</a> 63451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 63503d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak @Deprecated 63651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final Name IMPLEMENTATION_VENDOR_ID = new Name("Implementation-Vendor-Id"); 63751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 63851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 63903d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak * <code>Name</code> object for <code>Implementation-URL</code> 64051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * manifest attribute used for package versioning. 64103d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak * @deprecated Extension mechanism will be removed in a future release. 64203d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak * Use class path instead. 64303d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak * @see <a href="{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/extensions/versioning.html#applet"> 64403d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak * Optional Package Versioning</a> 64551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 64603d2687dfc9b84bb16ea2b5f6a85da539696b30cPrzemyslaw Szczepaniak @Deprecated 64751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final Name IMPLEMENTATION_URL = new Name("Implementation-URL"); 64851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 64951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 65051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>Name</code> object for <code>Specification-Title</code> 65151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * manifest attribute used for package versioning. 652d2449bb576ad1e3a3877364e5e1ae28625f69e35Yi Kong * @see <a href="{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/versioning/spec/versioning2.html#wp90779"> 65351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Java Product Versioning Specification</a> 65451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 65551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final Name SPECIFICATION_TITLE = new Name("Specification-Title"); 65651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 65751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 65851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>Name</code> object for <code>Specification-Version</code> 65951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * manifest attribute used for package versioning. 660d2449bb576ad1e3a3877364e5e1ae28625f69e35Yi Kong * @see <a href="{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/versioning/spec/versioning2.html#wp90779"> 66151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Java Product Versioning Specification</a> 66251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 66351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final Name SPECIFICATION_VERSION = new Name("Specification-Version"); 66451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 66551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 66651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>Name</code> object for <code>Specification-Vendor</code> 66751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * manifest attribute used for package versioning. 668d2449bb576ad1e3a3877364e5e1ae28625f69e35Yi Kong * @see <a href="{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/versioning/spec/versioning2.html#wp90779"> 66951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Java Product Versioning Specification</a> 67051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 67151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static final Name SPECIFICATION_VENDOR = new Name("Specification-Vendor"); 6721d958dba8b5c9589e3375446045e1672eee0e1b1Piotr Jastrzebski 6731d958dba8b5c9589e3375446045e1672eee0e1b1Piotr Jastrzebski /** 6741d958dba8b5c9589e3375446045e1672eee0e1b1Piotr Jastrzebski * @hide 6751d958dba8b5c9589e3375446045e1672eee0e1b1Piotr Jastrzebski */ 6761d958dba8b5c9589e3375446045e1672eee0e1b1Piotr Jastrzebski public static final Name NAME = new Name("Name"); 67751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 67851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 679