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