1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * contributor license agreements.  See the NOTICE file distributed with
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * this work for additional information regarding copyright ownership.
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (the "License"); you may not use this file except in compliance with
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the License.  You may obtain a copy of the License at
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage java.lang;
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.system.VMStack;
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.lang.annotation.Annotation;
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.lang.reflect.AnnotatedElement;
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.net.URL;
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Contains information about a Java package. This includes implementation and
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * specification versions. Typically this information is retrieved from the
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * manifest.
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * <p>
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Packages are managed by class loaders. All classes loaded by the same loader
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * from the same package share a {@code Package} instance.
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * </p>
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @since Android 1.0
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see java.lang.ClassLoader
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class Package implements AnnotatedElement {
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final String name, specTitle, specVersion, specVendor, implTitle,
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            implVersion, implVendor;
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final URL sealBase;
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    Package(String name, String specTitle, String specVersion, String specVendor,
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            String implTitle, String implVersion, String implVendor, URL sealBase) {
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.name = name;
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.specTitle = specTitle;
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.specVersion = specVersion;
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.specVendor = specVendor;
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.implTitle = implTitle;
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.implVersion = implVersion;
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.implVendor = implVendor;
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.sealBase = sealBase;
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the annotation associated with the specified annotation type and
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * this package, if present.
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param annotationType
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the annotation type to look for.
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return an instance of {@link Annotation} or {@code null}.
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see java.lang.reflect.AnnotatedElement#getAnnotation(java.lang.Class)
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @SuppressWarnings("unchecked")
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public <T extends Annotation> T getAnnotation(Class<T> annotationType) {
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Annotation[] list = getAnnotations();
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < list.length; i++) {
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (annotationType.isInstance(list[i])) {
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return (T)list[i];
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return null;
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets all annotations associated with this package, if any.
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return an array of {@link Annotation} instances, which may be empty.
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see java.lang.reflect.AnnotatedElement#getAnnotations()
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Annotation[] getAnnotations() {
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return getDeclaredAnnotations(this, true);
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets all annotations directly declared on this package, if any.
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return an array of {@link Annotation} instances, which may be empty.
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see java.lang.reflect.AnnotatedElement#getDeclaredAnnotations()
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Annotation[] getDeclaredAnnotations() {
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return getDeclaredAnnotations(this, false);
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the list of declared annotations of the given package.
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If no annotations exist, an empty array is returned.
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param pkg the package of interest
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param publicOnly reflects whether we want only public annotation or all
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * of them.
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the list of annotations
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // TODO(Google) Provide proper (native) implementation.
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static native Annotation[] getDeclaredAnnotations(Package pkg,
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            boolean publicOnly);
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Indicates whether the specified annotation is present.
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param annotationType
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the annotation type to look for.
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return {@code true} if the annotation is present; {@code false}
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         otherwise.
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see java.lang.reflect.AnnotatedElement#isAnnotationPresent(java.lang.Class)
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean isAnnotationPresent(
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Class<? extends Annotation> annotationType) {
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return getAnnotation(annotationType) != null;
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the title of the implementation of this package, or {@code null}
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * if this is unknown. The format of this string is unspecified.
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the implementation title, may be {@code null}.
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getImplementationTitle() {
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return implTitle;
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the name of the vendor or organization that provides this
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * implementation of the package, or {@code null} if this is unknown. The
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * format of this string is unspecified.
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the implementation vendor name, may be {@code null}.
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getImplementationVendor() {
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return implVendor;
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the version of the implementation of this package, or {@code
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * null} if this is unknown. The format of this string is unspecified.
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the implementation version, may be {@code null}.
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getImplementationVersion() {
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return implVersion;
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the name of this package in the standard dot notation; for
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * example: "java.lang".
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the name of this package.
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getName() {
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return name;
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Attempts to locate the requested package in the caller's class loader. If
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * no package information can be located, {@code null} is returned.
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param packageName
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the name of the package to find.
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the requested package, or {@code null}.
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see ClassLoader#getPackage(java.lang.String)
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static Package getPackage(String packageName) {
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ClassLoader classloader = VMStack.getCallingClassLoader();
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return classloader.getPackage(packageName);
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns all the packages known to the caller's class loader.
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return all the packages known to the caller's class loader.
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see ClassLoader#getPackages
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static Package[] getPackages() {
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ClassLoader classloader = VMStack.getCallingClassLoader();
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return classloader.getPackages();
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the title of the specification this package implements, or
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@code null} if this is unknown.
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the specification title, may be {@code null}.
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getSpecificationTitle() {
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return specTitle;
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the name of the vendor or organization that owns and maintains
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the specification this package implements, or {@code null} if this is
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * unknown.
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the specification vendor name, may be {@code null}.
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getSpecificationVendor() {
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return specVendor;
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns the version of the specification this package implements, or
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@code null} if this is unknown. The version string is a sequence of
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * non-negative integers separated by dots; for example: "1.2.3".
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the specification version string, may be {@code null}.
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getSpecificationVersion() {
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return specVersion;
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int hashCode() {
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return name.hashCode();
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Indicates whether this package's specification version is compatible with
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the specified version string. Version strings are compared by comparing
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * each dot separated part of the version as an integer.
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param version
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the version string to compare against.
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return {@code true} if the package versions are compatible; {@code
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         false} otherwise.
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @throws NumberFormatException
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             if this package's version string or the one provided are not
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *             in the correct format.
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean isCompatibleWith(String version)
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws NumberFormatException {
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String[] requested = version.split(".");
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String[] provided = specVersion.split(".");
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < Math.min(requested.length, provided.length); i++) {
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            int reqNum = Integer.parseInt(requested[i]);
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            int provNum = Integer.parseInt(provided[i]);
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (reqNum > provNum) {
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return false;
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else if (reqNum < provNum) {
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return true;
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (requested.length > provided.length) {
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return false;
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return true;
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Indicates whether this package is sealed.
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return {@code true} if this package is sealed; {@code false} otherwise.
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean isSealed() {
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return sealBase != null;
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Indicates whether this package is sealed with respect to the specified
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * URL.
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param url
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *            the URL to check.
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return {@code true} if this package is sealed with {@code url}; {@code
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *         false} otherwise
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @since Android 1.0
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean isSealed(URL url) {
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return sealBase != null && sealBase.sameFile(url);
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String toString() {
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return "package " + name;
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
322