1f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes/*
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
8f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
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 * Copyright (C) 2008 The Android Open Source Project
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * you may not use this file except in compliance with the License.
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * You may obtain a copy of the License at
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License.
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.lang;
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport dalvik.system.VMStack;
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.lang.annotation.Annotation;
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.lang.reflect.AnnotatedElement;
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.URL;
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Contains information about a Java package. This includes implementation and
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * specification versions. Typically this information is retrieved from the
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * manifest.
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Packages are managed by class loaders. All classes loaded by the same loader
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * from the same package share a {@code Package} instance.
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </p>
48f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see java.lang.ClassLoader
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class Package implements AnnotatedElement {
52172232d3d82076fbee6f04a5f4b7b4672029e2edElliott Hughes    private static final Annotation[] NO_ANNOTATIONS = new Annotation[0];
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
54172232d3d82076fbee6f04a5f4b7b4672029e2edElliott Hughes    private final String name;
55172232d3d82076fbee6f04a5f4b7b4672029e2edElliott Hughes    private final String specTitle;
56172232d3d82076fbee6f04a5f4b7b4672029e2edElliott Hughes    private final String specVersion;
57172232d3d82076fbee6f04a5f4b7b4672029e2edElliott Hughes    private final String specVendor;
58172232d3d82076fbee6f04a5f4b7b4672029e2edElliott Hughes    private final String implTitle;
59172232d3d82076fbee6f04a5f4b7b4672029e2edElliott Hughes    private final String implVersion;
60172232d3d82076fbee6f04a5f4b7b4672029e2edElliott Hughes    private final String implVendor;
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final URL sealBase;
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    Package(String name, String specTitle, String specVersion, String specVendor,
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String implTitle, String implVersion, String implVendor, URL sealBase) {
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.name = name;
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.specTitle = specTitle;
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.specVersion = specVersion;
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.specVendor = specVendor;
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.implTitle = implTitle;
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.implVersion = implVersion;
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.implVendor = implVendor;
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.sealBase = sealBase;
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the annotation associated with the specified annotation type and
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * this package, if present.
78f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param annotationType
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the annotation type to look for.
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return an instance of {@link Annotation} or {@code null}.
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see java.lang.reflect.AnnotatedElement#getAnnotation(java.lang.Class)
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unchecked")
85b43c9fb9c581d94304e9a54ec96cf4d752e8d917Elliott Hughes    public <A extends Annotation> A getAnnotation(Class<A> annotationType) {
862fc5dcd5614f910f25d794d272834752a72e63b1Elliott Hughes        for (Annotation annotation : getAnnotations()) {
872fc5dcd5614f910f25d794d272834752a72e63b1Elliott Hughes            if (annotationType.isInstance(annotation)) {
882fc5dcd5614f910f25d794d272834752a72e63b1Elliott Hughes                return (A) annotation;
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return null;
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
95172232d3d82076fbee6f04a5f4b7b4672029e2edElliott Hughes     * Returns an empty array. Package annotations are not supported on Android.
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Annotation[] getAnnotations() {
98172232d3d82076fbee6f04a5f4b7b4672029e2edElliott Hughes        return NO_ANNOTATIONS;
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
102172232d3d82076fbee6f04a5f4b7b4672029e2edElliott Hughes     * Returns an empty array. Package annotations are not supported on Android.
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Annotation[] getDeclaredAnnotations() {
105172232d3d82076fbee6f04a5f4b7b4672029e2edElliott Hughes        return NO_ANNOTATIONS;
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether the specified annotation is present.
110f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param annotationType
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the annotation type to look for.
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the annotation is present; {@code false}
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         otherwise.
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see java.lang.reflect.AnnotatedElement#isAnnotationPresent(java.lang.Class)
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1172fc5dcd5614f910f25d794d272834752a72e63b1Elliott Hughes    public boolean isAnnotationPresent(Class<? extends Annotation> annotationType) {
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getAnnotation(annotationType) != null;
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the title of the implementation of this package, or {@code null}
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * if this is unknown. The format of this string is unspecified.
124f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the implementation title, may be {@code null}.
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getImplementationTitle() {
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return implTitle;
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the name of the vendor or organization that provides this
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * implementation of the package, or {@code null} if this is unknown. The
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * format of this string is unspecified.
135f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the implementation vendor name, may be {@code null}.
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getImplementationVendor() {
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return implVendor;
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the version of the implementation of this package, or {@code
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * null} if this is unknown. The format of this string is unspecified.
145f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the implementation version, may be {@code null}.
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getImplementationVersion() {
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return implVersion;
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the name of this package in the standard dot notation; for
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * example: "java.lang".
155f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the name of this package.
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getName() {
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return name;
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Attempts to locate the requested package in the caller's class loader. If
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * no package information can be located, {@code null} is returned.
165f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param packageName
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the package to find.
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the requested package, or {@code null}.
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see ClassLoader#getPackage(java.lang.String)
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Package getPackage(String packageName) {
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ClassLoader classloader = VMStack.getCallingClassLoader();
1730432d7db07f16409d05ba4095a0c3a442a9c77b9Jesse Wilson        if (classloader == null) {
1740432d7db07f16409d05ba4095a0c3a442a9c77b9Jesse Wilson            classloader = ClassLoader.getSystemClassLoader();
1750432d7db07f16409d05ba4095a0c3a442a9c77b9Jesse Wilson        }
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return classloader.getPackage(packageName);
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns all the packages known to the caller's class loader.
181f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return all the packages known to the caller's class loader.
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see ClassLoader#getPackages
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Package[] getPackages() {
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ClassLoader classloader = VMStack.getCallingClassLoader();
1870432d7db07f16409d05ba4095a0c3a442a9c77b9Jesse Wilson        if (classloader == null) {
1880432d7db07f16409d05ba4095a0c3a442a9c77b9Jesse Wilson            classloader = ClassLoader.getSystemClassLoader();
1890432d7db07f16409d05ba4095a0c3a442a9c77b9Jesse Wilson        }
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return classloader.getPackages();
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the title of the specification this package implements, or
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code null} if this is unknown.
196f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the specification title, may be {@code null}.
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getSpecificationTitle() {
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return specTitle;
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the name of the vendor or organization that owns and maintains
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the specification this package implements, or {@code null} if this is
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * unknown.
207f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the specification vendor name, may be {@code null}.
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getSpecificationVendor() {
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return specVendor;
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the version of the specification this package implements, or
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code null} if this is unknown. The version string is a sequence of
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * non-negative integers separated by dots; for example: "1.2.3".
218f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the specification version string, may be {@code null}.
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getSpecificationVersion() {
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return specVersion;
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int hashCode() {
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return name.hashCode();
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether this package's specification version is compatible with
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the specified version string. Version strings are compared by comparing
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * each dot separated part of the version as an integer.
234f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param version
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the version string to compare against.
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the package versions are compatible; {@code
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         false} otherwise.
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NumberFormatException
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this package's version string or the one provided are not
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             in the correct format.
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
2432fc5dcd5614f910f25d794d272834752a72e63b1Elliott Hughes    public boolean isCompatibleWith(String version) throws NumberFormatException {
244f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        String[] requested = version.split("\\.");
245f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        String[] provided = specVersion.split("\\.");
246f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < Math.min(requested.length, provided.length); i++) {
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int reqNum = Integer.parseInt(requested[i]);
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int provNum = Integer.parseInt(provided[i]);
250f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (reqNum > provNum) {
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return false;
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } else if (reqNum < provNum) {
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return true;
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (requested.length > provided.length) {
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
261f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return true;
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether this package is sealed.
267f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if this package is sealed; {@code false} otherwise.
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isSealed() {
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return sealBase != null;
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether this package is sealed with respect to the specified
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * URL.
277f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param url
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the URL to check.
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if this package is sealed with {@code url}; {@code
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         false} otherwise
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isSealed(URL url) {
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return sealBase != null && sealBase.sameFile(url);
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toString() {
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return "package " + name;
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
292