/**
* OpenAtlasForAndroid Project
* The MIT License (MIT) Copyright (OpenAtlasForAndroid) 2015 Bunny Blue,achellies
* <p>
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software
* and associated documentation files (the "Software"), to deal in the Software
* without restriction, including without limitation the rights to use, copy, modify,
* merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to the following conditions:
* <p>
* The above copyright notice and this permission notice shall be included in all copies
* or substantial portions of the Software.
* <p>
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
* FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* @author BunnyBlue
**/
package com.openatlas.framework;
import org.osgi.framework.Bundle;
import org.osgi.service.packageadmin.ExportedPackage;
import java.util.List;
import java.util.StringTokenizer;
final class Package implements ExportedPackage {
final BundleClassLoader classloader;
List<Bundle> importingBundles;
final String pkg;
boolean removalPending;
boolean resolved;
private final short[] version;
Package(String packageString, BundleClassLoader bundleClassLoader, boolean resolved) {
this.importingBundles = null;
this.removalPending = false;
this.resolved = false;
String[] parsePackageString = parsePackageString(packageString);
this.pkg = parsePackageString[0];
this.version = getVersionNumber(parsePackageString[1]);
this.classloader = bundleClassLoader;
this.resolved = resolved;
}
@Override
public Bundle getExportingBundle() {
return this.classloader.bundle;
}
@Override
public Bundle[] getImportingBundles() {
if (this.importingBundles == null) {
return new Bundle[]{this.classloader.bundle};
}
Bundle[] bundleArr = new Bundle[(this.importingBundles.size() + 1)];
this.importingBundles.toArray(bundleArr);
bundleArr[this.importingBundles.size()] = this.classloader.bundle;
return bundleArr;
}
@Override
public String getName() {
return this.pkg;
}
@Override
public String getSpecificationVersion() {
return this.version == null ? null : this.version[0] + "."
+ this.version[1] + "." + this.version[2];
}
@Override
public boolean isRemovalPending() {
return this.removalPending;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Package)) {
return false;
}
Package packageR = (Package) obj;
if (this.classloader == null) {
return matches(this.pkg, this.version, packageR.pkg,
packageR.version);
}
return obj.hashCode() == hashCode();
}
@Override
public String toString() {
if (this.version == null) {
return this.pkg;
}
return this.pkg + "; specification-version="
+ getSpecificationVersion()
+ (this.resolved ? "" : " (UNRESOLVED)");
}
@Override
public int hashCode() {
return this.pkg.hashCode();
}
static String[] parsePackageString(String name) {
if (name.indexOf(";") > -1) {
return new String[]{name.substring(0, name.indexOf(";")).trim(),
name.substring(name.indexOf(";") + 1).trim()};
}
return new String[]{name.trim(), ""};
}
boolean matches(String name) {
String[] parsePackageString = parsePackageString(name);
return matches(this.pkg, this.version, parsePackageString[0],
getVersionNumber(parsePackageString[1]));
}
/*****
* 比价两个package是否一致 前两个参数为package1 后两个参数为package2
* @param pkg1Name 第一个包的包名
* @param pkg1version 第一个包的版本
* @param pkg2Name 第二个包的包名
* @param pkg2Version 第二个包的版本
* *******/
private static boolean matches(String pkg1Name, short[] pkg1version, String pkg2Name,
short[] pkg2Version) {
int indexOf = pkg2Name.indexOf(42);
if (indexOf > -1) {
if (indexOf == 0) {
return true;
}
String substring = pkg2Name.substring(0, indexOf);
if (!substring.endsWith(".")) {
return false;
}
if (!pkg1Name.startsWith(substring.substring(0, substring.length() - 1))) {
return false;
}
} else if (!pkg1Name.equals(pkg2Name)) {
return false;
}
if (pkg1version == null || pkg2Version == null) {
return true;
}
for (indexOf = 0; indexOf < 3; indexOf++) {
if (pkg1version[indexOf] > pkg2Version[indexOf]) {
return false;
}
}
return true;
}
boolean updates(Package packageR) {
if (this.version == null || packageR.version == null) {
return true;
}
for (int i = 0; i < 3; i++) {
if (this.version[i] < packageR.version[i]) {
return false;
}
}
return true;
}
// static boolean matches(String str, String str2) {
// String[] parsePackageString = parsePackageString(str);
// String[] parsePackageString2 = parsePackageString(str2);
// return matches(parsePackageString[0],
// getVersionNumber(parsePackageString[1]),
// parsePackageString2[0],
// getVersionNumber(parsePackageString2[1]));
// }
private static short[] getVersionNumber(String specificationVersion) {
if (!specificationVersion.startsWith("specification-version=")) {
return null;
}
String trim = specificationVersion.substring(22).trim();
if (trim.startsWith("\"")) {
trim = trim.substring(1);
}
if (trim.endsWith("\"")) {
trim = trim.substring(0, trim.length() - 1);
}
StringTokenizer stringTokenizer = new StringTokenizer(trim, ".");
short[] sArr = new short[]{(short) 0, (short) 0, (short) 0};
int i = 0;
while (stringTokenizer.hasMoreTokens() && i <= 2) {
sArr[i] = Short.parseShort(stringTokenizer.nextToken());
i++;
}
return sArr;
}
}