From fc9c99e32d8f462eed14b7bdafbc2ba08607c3df Mon Sep 17 00:00:00 2001 From: Raphael Date: Tue, 14 Feb 2012 13:21:46 -0800 Subject: SDK Repository: name/vendor id/display for addons. SDK Bug: 21942, part 2 of 3. (part 3 is replacing manifest.ini by source.props) Change-Id: I96be0d8210120927744224d909f7ee7184ebfecf --- .../sdklib/internal/repository/AddonPackage.java | 270 ++++++++++++++++----- .../sdklib/internal/repository/ExtraPackage.java | 22 +- .../sdklib/internal/repository/LocalSdkParser.java | 9 +- .../sdklib/internal/repository/Package.java | 4 +- .../sdklib/repository/SdkAddonConstants.java | 14 +- .../com/android/sdklib/repository/sdk-addon-4.xsd | 15 +- .../internal/repository/MockAddonPackage.java | 18 +- .../sdklib/internal/repository/PackageTest.java | 2 +- .../internal/repository/SdkAddonSourceTest.java | 48 +++- .../internal/repository/SdkRepoSourceTest.java | 12 +- .../sdklib/repository/ValidateAddonXmlTest.java | 4 +- .../com/android/sdklib/testdata/addon_sample_4.xml | 12 - .../repository/sdkman2/PackagesDiffLogicTest.java | 68 +++--- 13 files changed, 340 insertions(+), 158 deletions(-) (limited to 'sdkmanager/libs') diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/AddonPackage.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/AddonPackage.java index 6ce1118..a784b34 100755 --- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/AddonPackage.java +++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/AddonPackage.java @@ -26,6 +26,7 @@ import com.android.sdklib.SdkManager; import com.android.sdklib.internal.repository.Archive.Arch; import com.android.sdklib.internal.repository.Archive.Os; import com.android.sdklib.repository.PkgProps; +import com.android.sdklib.repository.SdkAddonConstants; import com.android.sdklib.repository.SdkRepoConstants; import com.android.util.Pair; @@ -44,8 +45,10 @@ import java.util.Properties; public class AddonPackage extends Package implements IPackageVersion, IPlatformDependency, IExactApiLevelDependency, ILayoutlibVersion { - private final String mVendor; - private final String mName; + private final String mVendorId; + private final String mVendorDisplay; + private final String mNameId; + private final String mDisplayName; private final AndroidVersion mVersion; /** @@ -122,14 +125,74 @@ public class AddonPackage extends Package * parameters that vary according to the originating XML schema. * @param licenses The licenses loaded from the XML originating document. */ - AddonPackage(SdkSource source, Node packageNode, String nsUri, Map licenses) { + AddonPackage( + SdkSource source, + Node packageNode, + String nsUri, + Map licenses) { super(source, packageNode, nsUri, licenses); - mVendor = XmlParserUtils.getXmlString(packageNode, SdkRepoConstants.NODE_VENDOR); - mName = XmlParserUtils.getXmlString(packageNode, SdkRepoConstants.NODE_NAME); - int apiLevel = XmlParserUtils.getXmlInt (packageNode, SdkRepoConstants.NODE_API_LEVEL, 0); + + // --- name id/display --- + // addon-4.xsd introduces the name-id, name-display, vendor-id and vendor-display. + // These are not optional but we still need to support a fallback for older addons + // that only provide name and vendor. If the addon provides neither set of fields, + // it will simply not work as expected. + + String nameId = XmlParserUtils.getXmlString(packageNode, + SdkRepoConstants.NODE_NAME_ID); + String nameDisp = XmlParserUtils.getXmlString(packageNode, + SdkRepoConstants.NODE_NAME_DISPLAY); + String name = XmlParserUtils.getXmlString(packageNode, + SdkRepoConstants.NODE_NAME); + + // The old is equivalent to the new + if (nameDisp.length() == 0) { + nameDisp = name; + } + + // For a missing id, we simply use a sanitized version of the display name + if (nameId.length() == 0) { + nameId = sanitizeDisplayToNameId(name.length() > 0 ? name : nameDisp); + } + + assert nameId.length() > 0; + assert nameDisp.length() > 0; + + mNameId = nameId.trim(); + mDisplayName = nameDisp.trim(); + + // --- vendor id/display --- + // Same processing for vendor id vs display + + String vendorId = XmlParserUtils.getXmlString(packageNode, + SdkAddonConstants.NODE_VENDOR_ID); + String vendorDisp = XmlParserUtils.getXmlString(packageNode, + SdkAddonConstants.NODE_VENDOR_DISPLAY); + String vendor = XmlParserUtils.getXmlString(packageNode, + SdkAddonConstants.NODE_VENDOR); + + // The old is equivalent to the new + if (vendorDisp.length() == 0) { + vendorDisp = vendor; + } + + // For a missing id, we simply use a sanitized version of the display vendor + if (vendorId.length() == 0) { + vendorId = sanitizeDisplayToNameId(vendor.length() > 0 ? vendor : vendorDisp); + } + + assert vendorId.length() > 0; + assert vendorDisp.length() > 0; + + mVendorId = vendorId.trim(); + mVendorDisplay = vendorDisp.trim(); + + // --- other attributes + + int apiLevel = XmlParserUtils.getXmlInt(packageNode, SdkAddonConstants.NODE_API_LEVEL, 0); mVersion = new AndroidVersion(apiLevel, null /*codeName*/); - mLibs = parseLibs(XmlParserUtils.getFirstChild(packageNode, SdkRepoConstants.NODE_LIBS)); + mLibs = parseLibs(XmlParserUtils.getFirstChild(packageNode, SdkAddonConstants.NODE_LIBS)); mLayoutlibVersion = new LayoutlibVersionMixin(packageNode); } @@ -164,9 +227,58 @@ public class AddonPackage extends Package target.getLocation() //archiveOsPath ); + // --- name id/display --- + // addon-4.xsd introduces the name-id, name-display, vendor-id and vendor-display. + // These are not optional but we still need to support a fallback for older addons + // that only provide name and vendor. If the addon provides neither set of fields, + // it will simply not work as expected. + + String nameId = getProperty(props, PkgProps.ADDON_NAME_ID, ""); //$NON-NLS-1$ + String nameDisp = getProperty(props, PkgProps.ADDON_NAME_DISPLAY, ""); //$NON-NLS-1$ + String name = getProperty(props, PkgProps.ADDON_NAME, target.getName()); + + // The old is equivalent to the new + if (nameDisp.length() == 0) { + nameDisp = name; + } + + // For a missing id, we simply use a sanitized version of the display name + if (nameId.length() == 0) { + nameId = sanitizeDisplayToNameId(name.length() > 0 ? name : nameDisp); + } + + assert nameId.length() > 0; + assert nameDisp.length() > 0; + + mNameId = nameId.trim(); + mDisplayName = nameDisp.trim(); + + // --- vendor id/display --- + // Same processing for vendor id vs display + + String vendorId = getProperty(props, PkgProps.ADDON_VENDOR_ID, ""); //$NON-NLS-1$ + String vendorDisp = getProperty(props, PkgProps.ADDON_VENDOR_DISPLAY, ""); //$NON-NLS-1$ + String vendor = getProperty(props, PkgProps.ADDON_VENDOR, target.getVendor()); + + // The old is equivalent to the new + if (vendorDisp.length() == 0) { + vendorDisp = vendor; + } + + // For a missing id, we simply use a sanitized version of the display vendor + if (vendorId.length() == 0) { + vendorId = sanitizeDisplayToNameId(vendor.length() > 0 ? vendor : vendorDisp); + } + + assert vendorId.length() > 0; + assert vendorDisp.length() > 0; + + mVendorId = vendorId.trim(); + mVendorDisplay = vendorDisp.trim(); + + // --- other attributes + mVersion = target.getVersion(); - mName = target.getName(); - mVendor = target.getVendor(); mLayoutlibVersion = new LayoutlibVersionMixin(props); IOptionalLibrary[] optLibs = target.getOptionalLibraries(); @@ -184,14 +296,27 @@ public class AddonPackage extends Package * Creates a broken addon which we know failed to load properly. * * @param archiveOsPath The absolute OS path of the addon folder. - * @param props The properties parsed from the addon manifest (not the source.properties). + * @param sourceProps The properties parsed from the addon's source.properties. Can be null. + * @param addonProps The properties parsed from the addon manifest (NOT the source.properties). * @param error The error indicating why this addon failed to be loaded. */ - static Package createBroken(String archiveOsPath, Map props, String error) { - String name = props.get(SdkManager.ADDON_NAME); - String vendor = props.get(SdkManager.ADDON_VENDOR); - String api = props.get(SdkManager.ADDON_API); - String revision = props.get(SdkManager.ADDON_REVISION); + static Package createBroken( + String archiveOsPath, + Properties sourceProps, + Map addonProps, + String error) { + String name = getProperty(sourceProps, + PkgProps.ADDON_NAME_DISPLAY, + getProperty(sourceProps, + PkgProps.ADDON_NAME, + addonProps.get(SdkManager.ADDON_NAME))); + String vendor = getProperty(sourceProps, + PkgProps.ADDON_VENDOR_DISPLAY, + getProperty(sourceProps, + PkgProps.ADDON_VENDOR, + addonProps.get(SdkManager.ADDON_VENDOR))); + String api = addonProps.get(SdkManager.ADDON_API); + String revision = addonProps.get(SdkManager.ADDON_REVISION); String shortDesc = String.format("%1$s by %2$s, Android API %3$s, revision %4$s [*]", name, @@ -235,12 +360,10 @@ public class AddonPackage extends Package mVersion.saveProperties(props); mLayoutlibVersion.saveProperties(props); - if (mName != null) { - props.setProperty(PkgProps.ADDON_NAME, mName); - } - if (mVendor != null) { - props.setProperty(PkgProps.ADDON_VENDOR, mVendor); - } + props.setProperty(PkgProps.ADDON_NAME_ID, mNameId); + props.setProperty(PkgProps.ADDON_NAME_DISPLAY, mDisplayName); + props.setProperty(PkgProps.ADDON_VENDOR_ID, mVendorId); + props.setProperty(PkgProps.ADDON_VENDOR_DISPLAY, mVendorDisplay); } /** @@ -274,14 +397,24 @@ public class AddonPackage extends Package XmlParserUtils.getXmlString(libNode, SdkRepoConstants.NODE_DESCRIPTION)); } - /** Returns the vendor, a string, for add-on packages. */ - public String getVendor() { - return mVendor; + /** Returns the vendor id, a string, for add-on packages. */ + public String getVendorId() { + return mVendorId; + } + + /** Returns the vendor, a string for display purposes. */ + public String getDisplayVendor() { + return mVendorDisplay; + } + + /** Returns the name id, a string, for add-on packages or for libraries. */ + public String getNameId() { + return mNameId; } - /** Returns the name, a string, for add-on packages or for libraries. */ - public String getName() { - return mName; + /** Returns the name, a string for display purposes. */ + public String getDisplayName() { + return mDisplayName; } /** @@ -334,9 +467,8 @@ public class AddonPackage extends Package */ @Override public String getListDescription() { - return String.format("%1$s by %2$s%3$s", - getName(), - getVendor(), + return String.format("%1$s%2$s", + getDisplayName(), isObsolete() ? " (Obsolete)" : ""); } @@ -345,9 +477,8 @@ public class AddonPackage extends Package */ @Override public String getShortDescription() { - return String.format("%1$s by %2$s, Android API %3$s, revision %4$s%5$s", - getName(), - getVendor(), + return String.format("%1$s, Android API %2$s, revision %3$s%4$s", + getDisplayName(), mVersion.getApiString(), getRevision(), isObsolete() ? " (Obsolete)" : ""); @@ -361,15 +492,16 @@ public class AddonPackage extends Package */ @Override public String getLongDescription() { - String s = getDescription(); - if (s == null || s.length() == 0) { - s = getShortDescription(); - } + String s = String.format("%1$s, Android API %2$s, revision %3$s%4$s\nBy %5$s", + getDisplayName(), + mVersion.getApiString(), + getRevision(), + isObsolete() ? " (Obsolete)" : "", //$NON-NLS-2$ + getDisplayVendor()); - if (s.indexOf("revision") == -1) { - s += String.format("\nRevision %1$d%2$s", - getRevision(), - isObsolete() ? " (Obsolete)" : ""); + String d = getDescription(); + if (d != null && d.length() > 0) { + s += '\n' + d; } s += String.format("\nRequires SDK Platform Android API %1$s", @@ -396,11 +528,17 @@ public class AddonPackage extends Package // First find if this add-on is already installed. If so, reuse the same directory. for (IAndroidTarget target : sdkManager.getTargets()) { - if (!target.isPlatform() && - target.getVersion().equals(mVersion) && - target.getName().equals(getName()) && - target.getVendor().equals(getVendor())) { - return new File(target.getLocation()); + if (!target.isPlatform() && target.getVersion().equals(mVersion)) { + // Starting with addon-4.xsd, the addon source.properties differentiate + // between ids and display strings. However the addon target which relies + // on the manifest.ini does not so we need to cover both cases. + // TODO fix when we get rid of manifest.ini for addons + if ((target.getName().equals(getNameId()) && + target.getVendor().equals(getVendorId())) || + (target.getName().equals(getDisplayName()) && + target.getVendor().equals(getDisplayVendor()))) { + return new File(target.getLocation()); + } } } @@ -421,21 +559,35 @@ public class AddonPackage extends Package private String encodeAddonName() { String name = String.format("addon-%s-%s-%s", //$NON-NLS-1$ - getName(), getVendor(), mVersion.getApiString()); + getNameId(), getVendorId(), mVersion.getApiString()); name = name.toLowerCase(Locale.US); name = name.replaceAll("[^a-z0-9_-]+", "_"); //$NON-NLS-1$ //$NON-NLS-2$ name = name.replaceAll("_+", "_"); //$NON-NLS-1$ //$NON-NLS-2$ return name; } + /** + * Computes a sanitized name-id based on an addon name-display. + * This is used to provide compatibility with older addons that lacks the new fields. + * + * @param displayName A name-display field or a old-style name field. + * @return A non-null sanitized name-id that fits in the {@code [a-zA-Z0-9_-]+} pattern. + */ + private String sanitizeDisplayToNameId(String displayName) { + String name = displayName.toLowerCase(Locale.US); + name = name.replaceAll("[^a-z0-9_-]+", "_"); //$NON-NLS-1$ //$NON-NLS-2$ + name = name.replaceAll("_+", "_"); //$NON-NLS-1$ //$NON-NLS-2$ + return name; + } + @Override public boolean sameItemAs(Package pkg) { if (pkg instanceof AddonPackage) { AddonPackage newPkg = (AddonPackage)pkg; // check they are the same add-on. - return getName().equals(newPkg.getName()) && - getVendor().equals(newPkg.getVendor()) && + return getNameId().equals(newPkg.getNameId()) && + getVendorId().equals(newPkg.getVendorId()) && getVersion().equals(newPkg.getVersion()); } @@ -448,8 +600,8 @@ public class AddonPackage extends Package int result = super.hashCode(); result = prime * result + ((mLayoutlibVersion == null) ? 0 : mLayoutlibVersion.hashCode()); result = prime * result + Arrays.hashCode(mLibs); - result = prime * result + ((mName == null) ? 0 : mName.hashCode()); - result = prime * result + ((mVendor == null) ? 0 : mVendor.hashCode()); + result = prime * result + ((mDisplayName == null) ? 0 : mDisplayName.hashCode()); + result = prime * result + ((mVendorDisplay == null) ? 0 : mVendorDisplay.hashCode()); result = prime * result + ((mVersion == null) ? 0 : mVersion.hashCode()); return result; } @@ -476,18 +628,18 @@ public class AddonPackage extends Package if (!Arrays.equals(mLibs, other.mLibs)) { return false; } - if (mName == null) { - if (other.mName != null) { + if (mNameId == null) { + if (other.mNameId != null) { return false; } - } else if (!mName.equals(other.mName)) { + } else if (!mNameId.equals(other.mNameId)) { return false; } - if (mVendor == null) { - if (other.mVendor != null) { + if (mVendorId == null) { + if (other.mVendorId != null) { return false; } - } else if (!mVendor.equals(other.mVendor)) { + } else if (!mVendorId.equals(other.mVendorId)) { return false; } if (mVersion == null) { @@ -512,8 +664,8 @@ public class AddonPackage extends Package int pos = s.indexOf("|r:"); //$NON-NLS-1$ assert pos > 0; s = s.substring(0, pos) + - "|ve:" + getVendor() + //$NON-NLS-1$ - "|na:" + getName() + //$NON-NLS-1$ + "|vid:" + getVendorId() + //$NON-NLS-1$ + "|nid:" + getNameId() + //$NON-NLS-1$ s.substring(pos); return s; } diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/ExtraPackage.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/ExtraPackage.java index b7c416c..a242c26 100755 --- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/ExtraPackage.java +++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/ExtraPackage.java @@ -122,14 +122,14 @@ public class ExtraPackage extends MinToolsPackage // The vendor-display name can be empty, in which case we use the vendor-id. vname = vid; } - mVendorDisplay = vname; - mVendorId = vid; + mVendorDisplay = vname.trim(); + mVendorId = vid.trim(); if (name.length() == 0) { // If name is missing, use the attribute as done in an addon-3 schema. name = getPrettyName(); } - mDisplayName = name; + mDisplayName = name.trim(); mMinApiLevel = XmlParserUtils.getXmlInt( packageNode, RepoConstants.NODE_MIN_API_LEVEL, MIN_API_LEVEL_NOT_SPECIFIED); @@ -219,15 +219,15 @@ public class ExtraPackage extends MinToolsPackage // The path argument comes before whatever could be in the properties mPath = path != null ? path : getProperty(props, PkgProps.EXTRA_PATH, path); - String name = getProperty(props, PkgProps.EXTRA_NAME_DISPLAY, ""); - String vname = getProperty(props, PkgProps.EXTRA_VENDOR_DISPLAY, ""); + String name = getProperty(props, PkgProps.EXTRA_NAME_DISPLAY, ""); //$NON-NLS-1$ + String vname = getProperty(props, PkgProps.EXTRA_VENDOR_DISPLAY, ""); //$NON-NLS-1$ String vid = vendorId != null ? vendorId : - getProperty(props, PkgProps.EXTRA_VENDOR_ID, ""); + getProperty(props, PkgProps.EXTRA_VENDOR_ID, ""); //$NON-NLS-1$ if (vid.length() == 0) { // If vid is missing, use the old attribute. // did not exist prior to schema repo-v3 and tools r8. - String vendor = getProperty(props, PkgProps.EXTRA_VENDOR, ""); + String vendor = getProperty(props, PkgProps.EXTRA_VENDOR, ""); //$NON-NLS-1$ vid = sanitizeLegacyVendor(vendor); if (vname.length() == 0) { vname = vendor; @@ -237,14 +237,14 @@ public class ExtraPackage extends MinToolsPackage // The vendor-display name can be empty, in which case we use the vendor-id. vname = vid; } - mVendorDisplay = vname; - mVendorId = vid; + mVendorDisplay = vname.trim(); + mVendorId = vid.trim(); if (name.length() == 0) { // If name is missing, use the attribute as done in an addon-3 schema. name = getPrettyName(); } - mDisplayName = name; + mDisplayName = name.trim(); mOldPaths = getProperty(props, PkgProps.EXTRA_OLD_PATHS, null); @@ -508,7 +508,7 @@ public class ExtraPackage extends MinToolsPackage String d = getDescription(); if (d != null && d.length() > 0) { - s += "\n" + d; //$NON-NLS-1$ + s += '\n' + d; } if (getMinToolsRevision() != MIN_TOOLS_REV_NOT_SPECIFIED) { diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/LocalSdkParser.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/LocalSdkParser.java index 661552b..13be219 100755 --- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/LocalSdkParser.java +++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/LocalSdkParser.java @@ -308,11 +308,16 @@ public class LocalSdkParser { if (dir.isDirectory() && !visited.contains(dir)) { Pair, String> infos = SdkManager.parseAddonProperties(dir, sdkManager.getTargets(), log); + Properties sourceProps = + parseProperties(new File(dir, SdkConstants.FN_SOURCE_PROP)); - Map props = infos.getFirst(); + Map addonProps = infos.getFirst(); String error = infos.getSecond(); try { - Package pkg = AddonPackage.createBroken(dir.getAbsolutePath(), props, error); + Package pkg = AddonPackage.createBroken(dir.getAbsolutePath(), + sourceProps, + addonProps, + error); packages.add(pkg); visited.add(dir); } catch (Exception e) { diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/Package.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/Package.java index b09e2ee..a86171c 100755 --- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/Package.java +++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/Package.java @@ -142,8 +142,8 @@ public abstract class Package implements IDescription, Comparable { mLicense = getProperty(props, PkgProps.PKG_LICENSE, license); mDescription = getProperty(props, PkgProps.PKG_DESC, description); mDescUrl = getProperty(props, PkgProps.PKG_DESC_URL, descUrl); - mReleaseNote = getProperty(props, PkgProps.PKG_RELEASE_NOTE, ""); - mReleaseUrl = getProperty(props, PkgProps.PKG_RELEASE_URL, ""); + mReleaseNote = getProperty(props, PkgProps.PKG_RELEASE_NOTE, ""); //$NON-NLS-1$ + mReleaseUrl = getProperty(props, PkgProps.PKG_RELEASE_URL, ""); //$NON-NLS-1$ mObsolete = getProperty(props, PkgProps.PKG_OBSOLETE, null); // If source is null and we can find a source URL in the properties, generate diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/SdkAddonConstants.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/SdkAddonConstants.java index 4c7fadb..41b184e 100755 --- a/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/SdkAddonConstants.java +++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/SdkAddonConstants.java @@ -26,8 +26,10 @@ import java.io.InputStream; */ public class SdkAddonConstants extends RepoConstants { - /** The default name looked for by {@link SdkSource} when trying to load an - * sdk-addon XML if the URL doesn't match an existing resource. */ + /** + * The default name looked for by {@link SdkSource} when trying to load an + * sdk-addon XML if the URL doesn't match an existing resource. + */ public static final String URL_DEFAULT_FILENAME = "addon.xml"; //$NON-NLS-1$ /** The base of our sdk-addon XML namespace. */ @@ -40,8 +42,10 @@ public class SdkAddonConstants extends RepoConstants { */ public static final String NS_PATTERN = NS_BASE + "([1-9][0-9]*)"; //$NON-NLS-1$ - /** The latest version of the sdk-addon XML Schema. - * Valid version numbers are between 1 and this number, included. */ + /** + * The latest version of the sdk-addon XML Schema. + * Valid version numbers are between 1 and this number, included. + */ public static final int NS_LATEST_VERSION = 4; /** The XML namespace of the latest sdk-addon XML. */ @@ -54,7 +58,7 @@ public class SdkAddonConstants extends RepoConstants { public static final String NODE_ADD_ON = "add-on"; //$NON-NLS-1$ /** An extra package. */ - public static final String NODE_EXTRA = "extra"; //$NON-NLS-1$ + public static final String NODE_EXTRA = "extra"; //$NON-NLS-1$ /** * List of possible nodes in a repository XML. Used to populate options automatically diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/sdk-addon-4.xsd b/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/sdk-addon-4.xsd index b8d95f2..9289e1c 100755 --- a/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/sdk-addon-4.xsd +++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/sdk-addon-4.xsd @@ -68,22 +68,15 @@ An SDK add-on package. - - - - - - - + - + - + - --> diff --git a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/MockAddonPackage.java b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/MockAddonPackage.java index cdf7bcc..3953f79 100755 --- a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/MockAddonPackage.java +++ b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/MockAddonPackage.java @@ -23,8 +23,10 @@ import com.android.sdklib.ISystemImage.LocationType; import com.android.sdklib.SdkConstants; import com.android.sdklib.SystemImage; import com.android.sdklib.io.FileOp; +import com.android.sdklib.repository.PkgProps; import java.util.Map; +import java.util.Properties; /** * A mock {@link AddonPackage} for testing. @@ -60,7 +62,21 @@ public class MockAddonPackage extends AddonPackage { int revision) { super(source, new MockAddonTarget(name, basePlatform.getTarget(), revision), - null /*props*/); + createProperties(name, basePlatform.getTarget())); + } + + private static Properties createProperties(String name, IAndroidTarget baseTarget) { + String vendor = baseTarget.getVendor(); + Properties props = new Properties(); + props.setProperty(PkgProps.ADDON_NAME_ID, name); + props.setProperty(PkgProps.ADDON_NAME_DISPLAY, + String.format("The %1$s from %2$s", //$NON-NLS-1$ + name, vendor)); + props.setProperty(PkgProps.ADDON_VENDOR_ID, + String.format("vendor-id-%1$s", vendor)); //$NON-NLS-1$ + props.setProperty(PkgProps.ADDON_VENDOR_DISPLAY, + String.format("The %1$s", vendor)); //$NON-NLS-1$ + return props; } /** diff --git a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/PackageTest.java b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/PackageTest.java index 717877b..5cf1c98 100755 --- a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/PackageTest.java +++ b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/PackageTest.java @@ -187,7 +187,7 @@ public class PackageTest extends TestCase { "[Android SDK Tools, revision 7, " + "SDK Platform Android android-1, API 1, revision 2, " + "Intel x86 Atom System Image, Android API 1, revision 4, " + - "addon by vendor 1, Android API 1, revision 3, " + + "addon, Android API 1, revision 3, " + "Broken package for API 1, " + "Vendor Path, revision 5]", Arrays.toString(list.toArray())); diff --git a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/SdkAddonSourceTest.java b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/SdkAddonSourceTest.java index 5ee62c0..11626e6 100755 --- a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/SdkAddonSourceTest.java +++ b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/SdkAddonSourceTest.java @@ -171,9 +171,9 @@ public class SdkAddonSourceTest extends TestCase { // Get the packages assertTrue(mSource._parsePackages(doc, uri, monitor)); - assertEquals("Found My First add-on by John Doe, Android API 1, revision 1\n" + - "Found My Second add-on by John Deer, Android API 2, revision 42\n" + - "Found This add-on has no libraries by Joe Bar, Android API 4, revision 3\n" + + assertEquals("Found My First add-on, Android API 1, revision 1\n" + + "Found My Second add-on, Android API 2, revision 42\n" + + "Found This add-on has no libraries, Android API 4, revision 3\n" + "Found G USB Driver, revision 43 (Obsolete)\n" + "Found Android Vendor Extra API Dep, revision 2 (Obsolete)\n" + "Found Unknown Extra, revision 2 (Obsolete)\n", @@ -247,9 +247,9 @@ public class SdkAddonSourceTest extends TestCase { // Get the packages assertTrue(mSource._parsePackages(doc, uri, monitor)); - assertEquals("Found My First add-on by John Doe, Android API 1, revision 1\n" + - "Found My Second add-on by John Deer, Android API 2, revision 42\n" + - "Found This add-on has no libraries by Joe Bar, Android API 4, revision 3\n" + + assertEquals("Found My First add-on, Android API 1, revision 1\n" + + "Found My Second add-on, Android API 2, revision 42\n" + + "Found This add-on has no libraries, Android API 4, revision 3\n" + "Found G USB Driver, revision 43 (Obsolete)\n" + "Found Android Vendor Extra API Dep, revision 2 (Obsolete)\n" + "Found Unknown Extra, revision 2 (Obsolete)\n", @@ -341,9 +341,9 @@ public class SdkAddonSourceTest extends TestCase { // Get the packages assertTrue(mSource._parsePackages(doc, uri, monitor)); - assertEquals("Found My First add-on by John Doe, Android API 1, revision 1\n" + - "Found My Second add-on by John Deer, Android API 2, revision 42\n" + - "Found This add-on has no libraries by Joe Bar, Android API 4, revision 3\n" + + assertEquals("Found My First add-on, Android API 1, revision 1\n" + + "Found My Second add-on, Android API 2, revision 42\n" + + "Found This add-on has no libraries, Android API 4, revision 3\n" + "Found G USB Driver, revision 43 (Obsolete)\n" + "Found Android Vendor Extra API Dep, revision 2 (Obsolete)\n" + "Found Unknown Extra, revision 2 (Obsolete)\n", @@ -450,9 +450,9 @@ public class SdkAddonSourceTest extends TestCase { // Get the packages assertTrue(mSource._parsePackages(doc, uri, monitor)); - assertEquals("Found My First add-on by John Doe, Android API 1, revision 1\n" + - "Found My Second add-on by John Deer, Android API 2, revision 42\n" + - "Found This add-on has no libraries by Joe Bar, Android API 4, revision 3\n" + + assertEquals("Found My First add-on, Android API 1, revision 1\n" + + "Found My Second add-on, Android API 2, revision 42\n" + + "Found This add-on has no libraries, Android API 4, revision 3\n" + "Found Random name, not an id!, revision 43 (Obsolete)\n" + "Found Yet another extra, by Android, revision 2\n" + "Found . -..- - .-. .-, revision 2 (Obsolete)\n", @@ -472,6 +472,29 @@ public class SdkAddonSourceTest extends TestCase { assertTrue(p.getArchives().length >= 1); } + // Check the addon packages: vendor/name id vs display + ArrayList addonNames = new ArrayList(); + ArrayList addonVendors = new ArrayList(); + for (Package p : pkgs) { + if (p instanceof AddonPackage) { + AddonPackage ap = (AddonPackage) p; + addonNames.add(ap.getNameId() + "/" + ap.getDisplayName()); + addonVendors.add(ap.getVendorId() + "/" + ap.getDisplayVendor()); + } + } + // Addons are sorted by addon/vendor id and thus their order differs from the + // XML or the parsed package list. + assertEquals( + "[no_libs/This add-on has no libraries, " + + "My_Second_add-on/My Second add-on, " + + "My_First_add-on/My First add-on]", + Arrays.toString(addonNames.toArray())); + assertEquals( + "[Joe_Bar/Joe Bar, " + + "John_Deer/John Deer, " + + "John_Doe/John Doe]", + Arrays.toString(addonVendors.toArray())); + // Check the layoutlib of the platform packages. ArrayList> layoutlibVers = new ArrayList>(); for (Package p : pkgs) { @@ -487,7 +510,6 @@ public class SdkAddonSourceTest extends TestCase { // Check the extra packages: path, vendor, install folder, old-paths - final String osSdkPath = "SDK"; final SdkManager sdkManager = new MockEmptySdkManager(osSdkPath); diff --git a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/SdkRepoSourceTest.java b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/SdkRepoSourceTest.java index 3d78949..77e9312 100755 --- a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/SdkRepoSourceTest.java +++ b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/SdkRepoSourceTest.java @@ -225,14 +225,14 @@ public class SdkRepoSourceTest extends TestCase { assertEquals("Found SDK Platform Android 1.0, API 1, revision 3\n" + "Found Documentation for Android SDK, API 1, revision 1\n" + - "Found My First add-on by John Doe, Android API 1, revision 1\n" + + "Found My First add-on, Android API 1, revision 1\n" + "Found SDK Platform Android 1.1, API 2, revision 12\n" + - "Found My Second add-on by John Deer, Android API 2, revision 42\n" + + "Found My Second add-on, Android API 2, revision 42\n" + "Found SDK Platform Android Pastry Preview, revision 3\n" + "Found Android SDK Tools, revision 1\n" + "Found Documentation for Android SDK, API 2, revision 42\n" + "Found Android SDK Tools, revision 42\n" + - "Found This add-on has no libraries by Joe Bar, Android API 4, revision 3\n" + + "Found This add-on has no libraries, Android API 4, revision 3\n" + "Found Usb Driver, revision 43\n", monitor.getCapturedVerboseLog()); assertEquals("", monitor.getCapturedLog()); @@ -303,14 +303,14 @@ public class SdkRepoSourceTest extends TestCase { assertEquals("Found SDK Platform Android 1.0, API 1, revision 3\n" + "Found Documentation for Android SDK, API 1, revision 1\n" + - "Found My First add-on by John Doe, Android API 1, revision 1\n" + + "Found My First add-on, Android API 1, revision 1\n" + "Found SDK Platform Android 1.1, API 2, revision 12\n" + - "Found My Second add-on by John Deer, Android API 2, revision 42\n" + + "Found My Second add-on, Android API 2, revision 42\n" + "Found SDK Platform Android Pastry Preview, revision 3\n" + "Found Android SDK Tools, revision 1\n" + "Found Documentation for Android SDK, API 2, revision 42\n" + "Found Android SDK Tools, revision 42\n" + - "Found This add-on has no libraries by Joe Bar, Android API 4, revision 3\n" + + "Found This add-on has no libraries, Android API 4, revision 3\n" + "Found Usb Driver, revision 43 (Obsolete)\n" + "Found Extra API Dep, revision 2 (Obsolete)\n" + "Found Samples for SDK API 14, revision 24 (Obsolete)\n", diff --git a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/repository/ValidateAddonXmlTest.java b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/repository/ValidateAddonXmlTest.java index cf7dfd4..d88d566 100755 --- a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/repository/ValidateAddonXmlTest.java +++ b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/repository/ValidateAddonXmlTest.java @@ -160,7 +160,9 @@ public class ValidateAddonXmlTest extends TestCase { OPEN_TAG_ADDON + " some license " + " 1 " + - "AddonName AddonVendor 42 " + + "AddonName The Addon Name " + + "AddonVendor The Addon Vendor " + + "42 " + "Addons do not support codenames " + "com.example.LibName " + " 1 2822ae37115ebf13412bbef91339ee0d9454525e " + diff --git a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/testdata/addon_sample_4.xml b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/testdata/addon_sample_4.xml index 59ca9a1..6fba439 100755 --- a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/testdata/addon_sample_4.xml +++ b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/testdata/addon_sample_4.xml @@ -32,15 +32,11 @@ There can be 0 or more of each, in any order. --> - My First add-on - John Doe - 1 1 @@ -72,15 +68,11 @@ - My Second add-on - John Deer - 2 42 @@ -110,15 +102,11 @@ - This add-on has no libraries - Joe Bar - 4 diff --git a/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/sdkman2/PackagesDiffLogicTest.java b/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/sdkman2/PackagesDiffLogicTest.java index 85f1ab5..cf4b232 100755 --- a/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/sdkman2/PackagesDiffLogicTest.java +++ b/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/sdkman2/PackagesDiffLogicTest.java @@ -423,12 +423,12 @@ public class PackagesDiffLogicTest extends TestCase { "-- \n" + "PkgCategoryApi \n" + "-- \n" + - "-- \n" + - "-- \n" + + "-- \n" + + "-- \n" + "PkgCategoryApi \n" + "-- \n" + - "-- \n" + - "-- \n" + + "-- \n" + + "-- \n" + "PkgCategoryApi \n" + "-- \n" + "-- \n", @@ -479,12 +479,12 @@ public class PackagesDiffLogicTest extends TestCase { "-- \n" + "PkgCategoryApi \n" + "-- \n" + - "-- \n" + - "-- \n" + + "-- \n" + + "-- \n" + "PkgCategoryApi \n" + "-- \n" + - "-- \n" + - "-- \n" + + "-- \n" + + "-- \n" + "PkgCategoryApi \n" + "-- \n" + "-- \n", @@ -769,10 +769,10 @@ public class PackagesDiffLogicTest extends TestCase { "-- \n" + "-- \n" + "PkgCategorySource \n" + - "-- \n" + - "-- \n" + - "-- \n" + - "-- \n", + "-- \n" + + "-- \n" + + "-- \n" + + "-- \n", getTree(m, false /*displaySortByApi*/)); // Reloading the same thing should have no impact except for the update methods @@ -823,10 +823,10 @@ public class PackagesDiffLogicTest extends TestCase { "-- \n" + "-- \n" + "PkgCategorySource \n" + - "-- \n" + - "-- \n" + - "-- \n" + - "-- \n", + "-- \n" + + "-- \n" + + "-- \n" + + "-- \n", getTree(m, false /*displaySortByApi*/)); } @@ -970,10 +970,10 @@ public class PackagesDiffLogicTest extends TestCase { "-- < * NEW, pkg:SDK Platform Android android-2, API 2, revision 4>\n" + "-- < * NEW, pkg:ARM EABI System Image, Android API 2, revision 1>\n" + "-- < * NEW, pkg:Intel x86 Atom System Image, Android API 2, revision 1>\n" + - "-- < * NEW, pkg:addon B by vendor 2, Android API 2, revision 7>\n" + + "-- < * NEW, pkg:The addon B from vendor 2, Android API 2, revision 7>\n" + "PkgCategoryApi \n" + "-- \n" + - "-- \n" + + "-- \n" + "PkgCategoryApi \n" + "-- \n" + "-- \n", @@ -988,8 +988,8 @@ public class PackagesDiffLogicTest extends TestCase { "-- < * NEW, pkg:Intel x86 Atom System Image, Android API 2, revision 1>\n" + "-- \n" + "PkgCategorySource \n" + - "-- < * NEW, pkg:addon B by vendor 2, Android API 2, revision 7>\n" + - "-- \n" + + "-- < * NEW, pkg:The addon B from vendor 2, Android API 2, revision 7>\n" + + "-- \n" + "-- \n", getTree(m, false /*displaySortByApi*/)); @@ -1213,8 +1213,8 @@ public class PackagesDiffLogicTest extends TestCase { "-- \n" + "PkgCategoryApi \n" + "-- \n" + - "-- \n" + // from src2+3+4 - "-- \n" + // from src3+4 + "-- \n" + // from src2+3+4 + "-- \n" + // from src3+4 "PkgCategoryApi \n", getTree(m, true /*displaySortByApi*/)); // When sorting by source, the src4 packages are not listed at all since @@ -1226,9 +1226,9 @@ public class PackagesDiffLogicTest extends TestCase { "-- \n" + "-- \n" + "PkgCategorySource \n" + - "-- \n" + // from src2+3+4 + "-- \n" + // from src2+3+4 "PkgCategorySource \n" + - "-- \n", // from src3+4 + "-- \n", // from src3+4 getTree(m, false /*displaySortByApi*/)); } @@ -1313,14 +1313,14 @@ public class PackagesDiffLogicTest extends TestCase { "PkgCategoryApi \n" + "PkgCategoryApi \n" + "-- \n" + - "-- \n" + + "-- \n" + "PkgCategoryApi \n", getTree(m, true /*displaySortByApi*/)); assertEquals( "PkgCategorySource \n" + "-- \n" + "PkgCategorySource \n" + - "-- \n", + "-- \n", getTree(m, false /*displaySortByApi*/)); // Now user deletes the platform on disk and reload. @@ -1340,7 +1340,7 @@ public class PackagesDiffLogicTest extends TestCase { "PkgCategoryApi \n" + "PkgCategoryApi \n" + "-- \n" + - "-- \n" + + "-- \n" + "PkgCategoryApi \n" + "-- \n", getTree(m, true /*displaySortByApi*/)); @@ -1348,7 +1348,7 @@ public class PackagesDiffLogicTest extends TestCase { "PkgCategorySource \n" + "-- \n" + "PkgCategorySource \n" + - "-- \n" + + "-- \n" + "PkgCategorySource \n" + "-- \n", getTree(m, false /*displaySortByApi*/)); @@ -1370,14 +1370,14 @@ public class PackagesDiffLogicTest extends TestCase { "PkgCategoryApi \n" + "PkgCategoryApi \n" + "-- \n" + - "-- \n" + + "-- \n" + "PkgCategoryApi \n", getTree(m, true /*displaySortByApi*/)); assertEquals( "PkgCategorySource \n" + "-- \n" + "PkgCategorySource \n" + - "-- \n", + "-- \n", getTree(m, false /*displaySortByApi*/)); } @@ -1411,8 +1411,8 @@ public class PackagesDiffLogicTest extends TestCase { "-- \n" + "PkgCategoryApi \n" + "-- \n" + - "-- \n" + - "-- \n" + + "-- \n" + + "-- \n" + "PkgCategoryApi \n", getTree(m, true /*displaySortByApi*/)); assertEquals( @@ -1422,8 +1422,8 @@ public class PackagesDiffLogicTest extends TestCase { "-- \n" + "-- \n" + "PkgCategorySource \n" + - "-- \n" + - "-- \n", + "-- \n" + + "-- \n", getTree(m, false /*displaySortByApi*/)); } // ---- -- cgit v1.1