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    /**
76968c52b509328dcc9fda4e62e4e7a6b4e279dd65Elliott Hughes     * Returns 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    /**
95968c52b509328dcc9fda4e62e4e7a6b4e279dd65Elliott Hughes     * Returns an array of this package's annotations.
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Annotation[] getAnnotations() {
98968c52b509328dcc9fda4e62e4e7a6b4e279dd65Elliott Hughes        try {
99968c52b509328dcc9fda4e62e4e7a6b4e279dd65Elliott Hughes            Class<?> c = Class.forName(getName() + ".package-info");
100968c52b509328dcc9fda4e62e4e7a6b4e279dd65Elliott Hughes            return c.getAnnotations();
101968c52b509328dcc9fda4e62e4e7a6b4e279dd65Elliott Hughes        } catch (Exception ex) {
102968c52b509328dcc9fda4e62e4e7a6b4e279dd65Elliott Hughes            return NO_ANNOTATIONS;
103968c52b509328dcc9fda4e62e4e7a6b4e279dd65Elliott Hughes        }
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
107968c52b509328dcc9fda4e62e4e7a6b4e279dd65Elliott Hughes     * Returns an array of this package's declared annotations. Package annotations aren't
108968c52b509328dcc9fda4e62e4e7a6b4e279dd65Elliott Hughes     * inherited, so this is equivalent to {@link #getAnnotations}.
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Annotation[] getDeclaredAnnotations() {
111968c52b509328dcc9fda4e62e4e7a6b4e279dd65Elliott Hughes        return getAnnotations();
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether the specified annotation is present.
116f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param annotationType
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the annotation type to look for.
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the annotation is present; {@code false}
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         otherwise.
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see java.lang.reflect.AnnotatedElement#isAnnotationPresent(java.lang.Class)
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1232fc5dcd5614f910f25d794d272834752a72e63b1Elliott Hughes    public boolean isAnnotationPresent(Class<? extends Annotation> annotationType) {
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getAnnotation(annotationType) != null;
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the title of the implementation of this package, or {@code null}
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * if this is unknown. The format of this string is unspecified.
130f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the implementation title, may be {@code null}.
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getImplementationTitle() {
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return implTitle;
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the name of the vendor or organization that provides this
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * implementation of the package, or {@code null} if this is unknown. The
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * format of this string is unspecified.
141f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the implementation vendor name, may be {@code null}.
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getImplementationVendor() {
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return implVendor;
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the version of the implementation of this package, or {@code
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * null} if this is unknown. The format of this string is unspecified.
151f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the implementation version, may be {@code null}.
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getImplementationVersion() {
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return implVersion;
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the name of this package in the standard dot notation; for
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * example: "java.lang".
161f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the name of this package.
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getName() {
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return name;
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Attempts to locate the requested package in the caller's class loader. If
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * no package information can be located, {@code null} is returned.
171f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param packageName
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the package to find.
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the requested package, or {@code null}.
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see ClassLoader#getPackage(java.lang.String)
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Package getPackage(String packageName) {
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ClassLoader classloader = VMStack.getCallingClassLoader();
1790432d7db07f16409d05ba4095a0c3a442a9c77b9Jesse Wilson        if (classloader == null) {
1800432d7db07f16409d05ba4095a0c3a442a9c77b9Jesse Wilson            classloader = ClassLoader.getSystemClassLoader();
1810432d7db07f16409d05ba4095a0c3a442a9c77b9Jesse Wilson        }
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return classloader.getPackage(packageName);
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns all the packages known to the caller's class loader.
187f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return all the packages known to the caller's class loader.
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see ClassLoader#getPackages
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Package[] getPackages() {
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ClassLoader classloader = VMStack.getCallingClassLoader();
1930432d7db07f16409d05ba4095a0c3a442a9c77b9Jesse Wilson        if (classloader == null) {
1940432d7db07f16409d05ba4095a0c3a442a9c77b9Jesse Wilson            classloader = ClassLoader.getSystemClassLoader();
1950432d7db07f16409d05ba4095a0c3a442a9c77b9Jesse Wilson        }
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return classloader.getPackages();
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the title of the specification this package implements, or
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code null} if this is unknown.
202f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the specification title, may be {@code null}.
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getSpecificationTitle() {
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return specTitle;
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the name of the vendor or organization that owns and maintains
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the specification this package implements, or {@code null} if this is
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * unknown.
213f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the specification vendor name, may be {@code null}.
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getSpecificationVendor() {
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return specVendor;
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the version of the specification this package implements, or
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code null} if this is unknown. The version string is a sequence of
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * non-negative integers separated by dots; for example: "1.2.3".
224f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the specification version string, may be {@code null}.
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getSpecificationVersion() {
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return specVersion;
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int hashCode() {
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return name.hashCode();
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether this package's specification version is compatible with
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the specified version string. Version strings are compared by comparing
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * each dot separated part of the version as an integer.
240f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param version
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the version string to compare against.
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the package versions are compatible; {@code
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         false} otherwise.
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NumberFormatException
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this package's version string or the one provided are not
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             in the correct format.
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
2492fc5dcd5614f910f25d794d272834752a72e63b1Elliott Hughes    public boolean isCompatibleWith(String version) throws NumberFormatException {
250f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        String[] requested = version.split("\\.");
251f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        String[] provided = specVersion.split("\\.");
252f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < Math.min(requested.length, provided.length); i++) {
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int reqNum = Integer.parseInt(requested[i]);
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int provNum = Integer.parseInt(provided[i]);
256f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (reqNum > provNum) {
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return false;
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } else if (reqNum < provNum) {
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return true;
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (requested.length > provided.length) {
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
267f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return true;
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether this package is sealed.
273f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if this package is sealed; {@code false} otherwise.
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isSealed() {
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return sealBase != null;
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether this package is sealed with respect to the specified
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * URL.
283f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param url
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the URL to check.
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if this package is sealed with {@code url}; {@code
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         false} otherwise
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isSealed(URL url) {
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return sealBase != null && sealBase.sameFile(url);
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toString() {
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return "package " + name;
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
298