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