Identity.java revision adc854b798c1cfe3bfd4c27d68d5cee38ca617da
1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project* @author Alexander V. Astapchuk
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project* @version $Revision$
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project*/
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// BEGIN android-note
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// Added Deprecated annotation.
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// END android-note
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.security;
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.Serializable;
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Vector;
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Arrays;
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.internal.nls.Messages;
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Identity} represents an identity like a person or a company.
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @deprecated The functionality of this class has been replace by
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *             {@link Principal}, {@link KeyStore} and the {@code
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *             java.security.cert} package.
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @since Android 1.0
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project@Deprecated
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class Identity implements Principal, Serializable {
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final long serialVersionUID = 3609922007826600659L;
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private String name;
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private PublicKey publicKey;
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private String info = "no additional info"; //$NON-NLS-1$
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private IdentityScope scope;
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private Vector<Certificate> certificates;
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new instance of {@code Identity}.
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @since Android 1.0
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected Identity() {
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new instance of {@code Identity} with the specified name.
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of this {@code Identity}.
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @since Android 1.0
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Identity(String name) {
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.name = name;
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new instance of {@code Identity} with the specified name and
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the scope of this {@code Identity}.
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param name
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of this {@code Identity}.
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param scope
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code IdentityScope} of this {@code Identity}.
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws KeyManagementException
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an {@code Identity} with the same name is already present
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             in the specified scope.
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @since Android 1.0
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Identity(String name, IdentityScope scope)
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws KeyManagementException {
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(name);
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (scope != null) {
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            scope.addIdentity(this);
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            this.scope = scope;
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Adds a {@code Certificate} to this {@code Identity}.
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If a {@code SecurityManager} is installed, code calling this method needs
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the {@code SecurityPermission} {@code addIdentityCertificate} to be
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * granted, otherwise a {@code SecurityException} will be thrown.
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * </p>
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param certificate
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code Certificate} to be added to this {@code Identity}.
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws KeyManagementException
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the certificate is not valid.
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SecurityException
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if a {@code SecurityManager} is installed and the caller does
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             not have permission to invoke this method.
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @since Android 1.0
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void addCertificate(Certificate certificate)
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws KeyManagementException {
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        SecurityManager sm = System.getSecurityManager();
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (sm != null) {
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            sm.checkSecurityAccess("addIdentityCertificate"); //$NON-NLS-1$
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        PublicKey certPK = certificate.getPublicKey();
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (publicKey != null) {
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (!checkKeysEqual(publicKey, certPK)) {
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new KeyManagementException(Messages.getString("security.13")); //$NON-NLS-1$
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else {
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            publicKey = certPK;
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (certificates == null) {
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            certificates = new Vector<Certificate>();
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        certificates.add(certificate);
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static boolean checkKeysEqual(PublicKey pk1, PublicKey pk2) {
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // first, they should have the same format
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // second, their encoded form must be the same
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // assert(pk1 != null);
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // assert(pk2 != null);
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String format1 = pk1.getFormat();
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String format2;
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if ((pk2 == null)
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                || (((format2 = pk2.getFormat()) != null) ^ (format1 != null))
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                || ((format1 != null) && !format1.equals(format2))) {
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return Arrays.equals(pk1.getEncoded(), pk2.getEncoded());
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Removes the specified {@code Certificate} from this {@code Identity}.
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If a {@code SecurityManager} is installed, code calling this method needs
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the {@code SecurityPermission} {@code "removeIdentityCertificate"} to be
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * granted, otherwise a {@code SecurityException} will be thrown.
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param certificate
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code Certificate} to be removed.
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws KeyManagementException
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the certificate is not found.
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SecurityException
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if a {@code SecurityManager} is installed and the caller does
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             not have permission to invoke this method.
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @since Android 1.0
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void removeCertificate(Certificate certificate)
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws KeyManagementException {
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        SecurityManager sm = System.getSecurityManager();
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (sm != null) {
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            sm.checkSecurityAccess("removeIdentityCertificate"); //$NON-NLS-1$
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (certificates != null) {
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // BEGIN android-added
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (!certificates.contains(certificate)) {
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new KeyManagementException("Certificate not found");
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // END android-added
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            certificates.removeElement(certificate);
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the certificates for this {@code Identity}. External
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * modifications of the returned array has no impact on this {@code
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Identity}.
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code Certificates} for this {@code Identity}
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @since Android 1.0
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Certificate[] certificates() {
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (certificates == null) {
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return new Certificate[0];
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Certificate[] ret = new Certificate[certificates.size()];
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        certificates.copyInto(ret);
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return ret;
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares the specified {@code Identity} with this {@code Identity} for
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * equality and returns {@code true} if the specified object is equal,
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code false} otherwise.
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * To be equal, two {@code Identity} objects need to have the same name and
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the same public keys.
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * </p>
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param identity
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the identity to check for equality.
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the {@code Identity} objects are equal, {@code
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         false} otherwise.
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @since Android 1.0
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected boolean identityEquals(Identity identity) {
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!name.equals(identity.name)) {
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (publicKey == null) {
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return (identity.publicKey == null);
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return checkKeysEqual(publicKey, identity.publicKey);
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a string containing a concise, human-readable description of the
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * this {@code Identity}.
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param detailed
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            whether or not this method should return detailed information.
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a printable representation for this {@code Permission}.
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @since Android 1.0
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toString(boolean detailed) {
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String s = toString();
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (detailed) {
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            s += " " + info; //$NON-NLS-1$
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return s;
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the {@code IdentityScope} of this {@code Identity}.
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code IdentityScope} of this {@code Identity}.
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @since Android 1.0
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final IdentityScope getScope() {
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return scope;
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the specified {@code PublicKey} to this {@code Identity}.
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If a {@code SecurityManager} is installed, code calling this method needs
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the {@code SecurityPermission} {@code setIdentityPublicKey} to be
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * granted, otherwise a {@code SecurityException} will be thrown.
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * </p>
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param key
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code PublicKey} to be set.
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws KeyManagementException
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if another {@code Identity} in the same scope as this {@code
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             Identity} already has the same {@code PublicKey}.
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SecurityException
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if a {@code SecurityManager} is installed and the caller does
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             not have permission to invoke this method.
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @since Android 1.0
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setPublicKey(PublicKey key) throws KeyManagementException {
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        SecurityManager sm = System.getSecurityManager();
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (sm != null) {
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            sm.checkSecurityAccess("setIdentityPublicKey"); //$NON-NLS-1$
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // this check does not always work
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if ((scope != null) && (key != null)) {
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Identity i = scope.getIdentity(key);
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //System.out.println("###DEBUG## Identity: "+i);
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if ((i != null) && (i != this)) {
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new KeyManagementException(Messages.getString("security.14")); //$NON-NLS-1$
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.publicKey = key;
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        certificates = null;
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the {@code PublicKey} associated with this {@code Identity}.
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the {@code PublicKey} associated with this {@code Identity}.
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @since Android 1.0
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public PublicKey getPublicKey() {
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return publicKey;
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets an information string for this {@code Identity}.
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If a {@code SecurityManager} is installed, code calling this method needs
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the {@code SecurityPermission} {@code setIdentityInfo} to be granted,
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * otherwise a {@code SecurityException} will be thrown.
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param info
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the information to be set.
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SecurityException
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if a {@code SecurityManager} is installed and the caller does
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             not have permission to invoke this method.
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @since Android 1.0
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setInfo(String info) {
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        SecurityManager sm = System.getSecurityManager();
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (sm != null) {
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            sm.checkSecurityAccess("setIdentityInfo"); //$NON-NLS-1$
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.info = info;
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the information string of this {@code Identity}.
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the information string of this {@code Identity}.
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @since Android 1.0
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getInfo() {
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return info;
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares the specified object with this {@code Identity} for equality and
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * returns {@code true} if the specified object is equal, {@code false}
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * otherwise. {@code Identity} objects are considered equal, if they have
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the same name and are in the same scope.
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param obj
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            object to be compared for equality with this {@code
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            Identity}.
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the specified object is equal to this {@code
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         Identity}, otherwise {@code false}.
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @since Android 1.0
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final boolean equals(Object obj) {
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (this == obj) {
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!(obj instanceof Identity)) {
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Identity i = (Identity) obj;
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if ((name == i.name || (name != null && name.equals(i.name)))
389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                && (scope == i.scope || (scope != null && scope.equals(i.scope)))) {
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return identityEquals(i);
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the name of this {@code Identity}.
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the name of this {@code Identity}.
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @since Android 1.0
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final String getName() {
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return name;
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the hash code value for this {@code Identity}. Returns the same
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * hash code for {@code Identity}s that are equal to each other as required
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * by the general contract of {@link Object#hashCode}.
415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the hash code value for this {@code Identity}.
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see Object#equals(Object)
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see Identity#equals(Object)
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @since Android 1.0
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int hashCode() {
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int hash = 0;
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (name != null) {
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            hash += name.hashCode();
425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (scope != null) {
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            hash += scope.hashCode();
428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return hash;
430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a string containing a concise, human-readable description of the
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * this {@code Identity} including its name and its scope.
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If a {@code SecurityManager} is installed, code calling this method
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * needs the {@code SecurityPermission} {@code printIdentity} to be granted,
441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * otherwise a {@code SecurityException} will be thrown.
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * </p>
443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a printable representation for this {@code Identity}.
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SecurityException
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if a {@code SecurityManager} is installed and the caller does
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             not have permission to invoke this method.
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @since Android 1.0
449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toString() {
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        SecurityManager sm = System.getSecurityManager();
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (sm != null) {
453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            sm.checkSecurityAccess("printIdentity"); //$NON-NLS-1$
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String s = (this.name == null? "" : this.name);
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (scope != null) {
457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            s += " [" + scope.getName() + "]"; //$NON-NLS-1$ //$NON-NLS-2$
458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return s;
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
462