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