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