aboutsummaryrefslogtreecommitdiffstats
path: root/sdkmanager/libs/sdklib
diff options
context:
space:
mode:
authorRaphael Moll <ralf@android.com>2012-05-03 14:00:39 -0700
committerRaphael Moll <ralf@android.com>2012-05-08 13:15:25 -0700
commit28bff66f6a82f602db88127b8f39fdd7576f9fc9 (patch)
treec206de042bf46167d20d6cba1c7174999b533878 /sdkmanager/libs/sdklib
parent5ec104e1396dd05b040fc71507fa1dafefbf6a90 (diff)
downloadsdk-28bff66f6a82f602db88127b8f39fdd7576f9fc9.zip
sdk-28bff66f6a82f602db88127b8f39fdd7576f9fc9.tar.gz
sdk-28bff66f6a82f602db88127b8f39fdd7576f9fc9.tar.bz2
SDK: full revision for min-tools-rev.
Support full revision for: - tools: min-platform-tools-rev - platform + sample + extra: min-tools-rev Change-Id: I2c699683c1a3c02c99654dba7c39c7a1e5cd042e
Diffstat (limited to 'sdkmanager/libs/sdklib')
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/ExtraPackage.java5
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/FullRevisionPackage.java30
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/IMinPlatformToolsDependency.java5
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/IMinToolsDependency.java6
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/MinToolsPackage.java34
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/PackageParserUtils.java45
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/ToolPackage.java39
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/repository/-sdk-addon-5.xsd (renamed from sdkmanager/libs/sdklib/src/com/android/sdklib/repository/--sdk-addon-5.xsd)43
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/repository/-sdk-repository-7.xsd21
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/repository/SdkAddonConstants.java2
-rwxr-xr-xsdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/archives/ArchiveInstallerTest.java4
-rwxr-xr-xsdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/MinToolsPackageTest.java4
-rwxr-xr-xsdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/sources/SdkAddonSourceTest.java149
-rwxr-xr-xsdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/sources/SdkRepoSourceTest.java38
-rwxr-xr-xsdkmanager/libs/sdklib/tests/src/com/android/sdklib/repository/ValidateRepositoryXmlTest.java2
-rwxr-xr-xsdkmanager/libs/sdklib/tests/src/com/android/sdklib/testdata/addon_sample_5.xml214
-rwxr-xr-xsdkmanager/libs/sdklib/tests/src/com/android/sdklib/testdata/repository_sample_7.xml42
17 files changed, 595 insertions, 88 deletions
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/ExtraPackage.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/ExtraPackage.java
index ed82206..387ef98 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/ExtraPackage.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/ExtraPackage.java
@@ -517,8 +517,9 @@ public class ExtraPackage extends MinToolsPackage
s += '\n' + d;
}
- if (getMinToolsRevision() != MIN_TOOLS_REV_NOT_SPECIFIED) {
- s += String.format("\nRequires tools revision %1$d", getMinToolsRevision());
+ if (!getMinToolsRevision().equals(MIN_TOOLS_REV_NOT_SPECIFIED)) {
+ s += String.format("\nRequires tools revision %1$s",
+ getMinToolsRevision().toShortString());
}
if (getMinApiLevel() != MIN_API_LEVEL_NOT_SPECIFIED) {
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/FullRevisionPackage.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/FullRevisionPackage.java
index 6028873..d7b5429 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/FullRevisionPackage.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/FullRevisionPackage.java
@@ -52,32 +52,8 @@ public abstract class FullRevisionPackage extends Package
Map<String,String> licenses) {
super(source, packageNode, nsUri, licenses);
- // This needs to support to modes:
- // - For repository XSD >= 7, <revision> contains sub-elements such as <major> or <minor>.
- // - Otherwise for repository XSD < 7, <revision> contains an integer.
- // The <major> element is mandatory, so it's easy to distinguish between both cases.
- int major = 0, minor = 0, micro = 0, preview = 0;
- Node revision =
- PackageParserUtils.findChildElement(packageNode, SdkRepoConstants.NODE_REVISION);
- if (revision != null) {
- if (PackageParserUtils.findChildElement(revision,
- SdkRepoConstants.NODE_MAJOR_REV) != null) {
- // <revision> has a <major> sub-element, so it's a repository XSD >= 7.
- major = PackageParserUtils.getXmlInt(revision,
- SdkRepoConstants.NODE_MAJOR_REV, FullRevision.MISSING_MAJOR_REV);
- minor = PackageParserUtils.getXmlInt(revision,
- SdkRepoConstants.NODE_MINOR_REV, FullRevision.IMPLICIT_MINOR_REV);
- micro = PackageParserUtils.getXmlInt(revision,
- SdkRepoConstants.NODE_MICRO_REV, FullRevision.IMPLICIT_MICRO_REV);
- preview = PackageParserUtils.getXmlInt(revision,
- SdkRepoConstants.NODE_PREVIEW, FullRevision.NOT_A_PREVIEW);
- } else {
- major =
- PackageParserUtils.getXmlInt(packageNode, SdkRepoConstants.NODE_REVISION, 0);
- }
- }
-
- mPreviewVersion = new FullRevision(major, minor, micro, preview);
+ mPreviewVersion = PackageParserUtils.parseFullRevisionElement(
+ PackageParserUtils.findChildElement(packageNode, SdkRepoConstants.NODE_REVISION));
}
/**
@@ -125,7 +101,7 @@ public abstract class FullRevisionPackage extends Package
@Override
public void saveProperties(Properties props) {
super.saveProperties(props);
- props.setProperty(PkgProps.PKG_REVISION, mPreviewVersion.toString());
+ props.setProperty(PkgProps.PKG_REVISION, mPreviewVersion.toShortString());
}
@Override
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/IMinPlatformToolsDependency.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/IMinPlatformToolsDependency.java
index 32468a4..d17b800 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/IMinPlatformToolsDependency.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/IMinPlatformToolsDependency.java
@@ -34,7 +34,8 @@ public interface IMinPlatformToolsDependency {
* Since this is a required attribute in the XML schema, it can only happen when dealing
* with an invalid repository XML.
*/
- public static final int MIN_PLATFORM_TOOLS_REV_INVALID = 0;
+ public static final FullRevision MIN_PLATFORM_TOOLS_REV_INVALID =
+ new FullRevision(FullRevision.MISSING_MAJOR_REV);
/**
* The minimal revision of the tools package required by this package if > 0,
@@ -43,6 +44,6 @@ public interface IMinPlatformToolsDependency {
* This attribute is mandatory and should not be normally missing.
* It can only happen when dealing with an invalid repository XML.
*/
- public abstract int getMinPlatformToolsRevision();
+ public abstract FullRevision getMinPlatformToolsRevision();
}
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/IMinToolsDependency.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/IMinToolsDependency.java
index 76cdd66..064f1d3 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/IMinToolsDependency.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/IMinToolsDependency.java
@@ -31,12 +31,12 @@ public interface IMinToolsDependency {
* The value of {@link #getMinToolsRevision()} when the
* {@link SdkRepoConstants#NODE_MIN_TOOLS_REV} was not specified in the XML source.
*/
- public static final int MIN_TOOLS_REV_NOT_SPECIFIED = 0;
+ public static final FullRevision MIN_TOOLS_REV_NOT_SPECIFIED =
+ new FullRevision(FullRevision.MISSING_MAJOR_REV);
/**
* The minimal revision of the tools package required by this extra package if > 0,
* or {@link #MIN_TOOLS_REV_NOT_SPECIFIED} if there is no such requirement.
*/
- public abstract int getMinToolsRevision();
-
+ public abstract FullRevision getMinToolsRevision();
}
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/MinToolsPackage.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/MinToolsPackage.java
index 3de46b4..12c423e 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/MinToolsPackage.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/MinToolsPackage.java
@@ -36,7 +36,7 @@ public abstract class MinToolsPackage extends MajorRevisionPackage implements IM
* The minimal revision of the tools package required by this extra package, if > 0,
* or {@link #MIN_TOOLS_REV_NOT_SPECIFIED} if there is no such requirement.
*/
- private final int mMinToolsRevision;
+ private final FullRevision mMinToolsRevision;
/**
* Creates a new package from the attributes and elements of the given XML node.
@@ -51,9 +51,8 @@ public abstract class MinToolsPackage extends MajorRevisionPackage implements IM
MinToolsPackage(SdkSource source, Node packageNode, String nsUri, Map<String,String> licenses) {
super(source, packageNode, nsUri, licenses);
- mMinToolsRevision = PackageParserUtils.getXmlInt(packageNode,
- SdkRepoConstants.NODE_MIN_TOOLS_REV,
- MIN_TOOLS_REV_NOT_SPECIFIED);
+ mMinToolsRevision = PackageParserUtils.parseFullRevisionElement(
+ PackageParserUtils.findChildElement(packageNode, SdkRepoConstants.NODE_MIN_TOOLS_REV));
}
/**
@@ -78,8 +77,16 @@ public abstract class MinToolsPackage extends MajorRevisionPackage implements IM
super(source, props, revision, license, description, descUrl,
archiveOs, archiveArch, archiveOsPath);
- mMinToolsRevision = getPropertyInt(props, PkgProps.MIN_TOOLS_REV,
- MIN_TOOLS_REV_NOT_SPECIFIED);
+ String revStr = getProperty(props, PkgProps.MIN_TOOLS_REV, null);
+
+ FullRevision rev = MIN_TOOLS_REV_NOT_SPECIFIED;
+ if (revStr != null) {
+ try {
+ rev = FullRevision.parseRevision(revStr);
+ } catch (NumberFormatException ignore) {}
+ }
+
+ mMinToolsRevision = rev;
}
/**
@@ -87,7 +94,7 @@ public abstract class MinToolsPackage extends MajorRevisionPackage implements IM
* or {@link #MIN_TOOLS_REV_NOT_SPECIFIED} if there is no such requirement.
*/
@Override
- public int getMinToolsRevision() {
+ public FullRevision getMinToolsRevision() {
return mMinToolsRevision;
}
@@ -95,9 +102,8 @@ public abstract class MinToolsPackage extends MajorRevisionPackage implements IM
public void saveProperties(Properties props) {
super.saveProperties(props);
- if (getMinToolsRevision() != MIN_TOOLS_REV_NOT_SPECIFIED) {
- props.setProperty(PkgProps.MIN_TOOLS_REV,
- Integer.toString(getMinToolsRevision()));
+ if (!getMinToolsRevision().equals(MIN_TOOLS_REV_NOT_SPECIFIED)) {
+ props.setProperty(PkgProps.MIN_TOOLS_REV, getMinToolsRevision().toShortString());
}
}
@@ -105,7 +111,7 @@ public abstract class MinToolsPackage extends MajorRevisionPackage implements IM
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
- result = prime * result + mMinToolsRevision;
+ result = prime * result + ((mMinToolsRevision == null) ? 0 : mMinToolsRevision.hashCode());
return result;
}
@@ -121,7 +127,11 @@ public abstract class MinToolsPackage extends MajorRevisionPackage implements IM
return false;
}
MinToolsPackage other = (MinToolsPackage) obj;
- if (mMinToolsRevision != other.mMinToolsRevision) {
+ if (mMinToolsRevision == null) {
+ if (other.mMinToolsRevision != null) {
+ return false;
+ }
+ } else if (!mMinToolsRevision.equals(other.mMinToolsRevision)) {
return false;
}
return true;
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/PackageParserUtils.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/PackageParserUtils.java
index 07f95e2..8bde3d3 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/PackageParserUtils.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/PackageParserUtils.java
@@ -16,6 +16,8 @@
package com.android.sdklib.internal.repository.packages;
+import com.android.sdklib.repository.SdkRepoConstants;
+
import org.w3c.dom.Node;
/**
@@ -24,6 +26,49 @@ import org.w3c.dom.Node;
public class PackageParserUtils {
/**
+ * Parses a full revision element such as <revision> or <min-tools-rev>.
+ * This supports both the single-integer format as well as the full revision
+ * format with major/minor/micro/preview sub-elements.
+ *
+ * @param revisionNode The node to parse.
+ * @return A new {@link FullRevision}. If parsing failed, major is set to
+ * {@link FullRevision#MISSING_MAJOR_REV}.
+ */
+ public static FullRevision parseFullRevisionElement(Node revisionNode) {
+ // This needs to support two modes:
+ // - For repository XSD >= 7, <revision> contains sub-elements such as <major> or <minor>.
+ // - Otherwise for repository XSD < 7, <revision> contains an integer.
+ // The <major> element is mandatory, so it's easy to distinguish between both cases.
+ int major = FullRevision.MISSING_MAJOR_REV,
+ minor = FullRevision.IMPLICIT_MINOR_REV,
+ micro = FullRevision.IMPLICIT_MICRO_REV,
+ preview = FullRevision.NOT_A_PREVIEW;
+
+ if (revisionNode != null) {
+ if (PackageParserUtils.findChildElement(revisionNode,
+ SdkRepoConstants.NODE_MAJOR_REV) != null) {
+ // <revision> has a <major> sub-element, so it's a repository XSD >= 7.
+ major = PackageParserUtils.getXmlInt(revisionNode,
+ SdkRepoConstants.NODE_MAJOR_REV, FullRevision.MISSING_MAJOR_REV);
+ minor = PackageParserUtils.getXmlInt(revisionNode,
+ SdkRepoConstants.NODE_MINOR_REV, FullRevision.IMPLICIT_MINOR_REV);
+ micro = PackageParserUtils.getXmlInt(revisionNode,
+ SdkRepoConstants.NODE_MICRO_REV, FullRevision.IMPLICIT_MICRO_REV);
+ preview = PackageParserUtils.getXmlInt(revisionNode,
+ SdkRepoConstants.NODE_PREVIEW, FullRevision.NOT_A_PREVIEW);
+ } else {
+ try {
+ String majorStr = revisionNode.getTextContent().trim();
+ major = Integer.parseInt(majorStr);
+ } catch (Exception e) {
+ }
+ }
+ }
+
+ return new FullRevision(major, minor, micro, preview);
+ }
+
+ /**
* Returns the first child element with the given XML local name.
* If xmlLocalName is null, returns the very first child element.
*/
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/ToolPackage.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/ToolPackage.java
index 3fc7405..8ae469e 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/ToolPackage.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/ToolPackage.java
@@ -54,7 +54,7 @@ public class ToolPackage extends FullRevisionPackage implements IMinPlatformTool
* The minimal revision of the platform-tools package required by this package
* or {@link #MIN_PLATFORM_TOOLS_REV_INVALID} if the value was missing.
*/
- private final int mMinPlatformToolsRevision;
+ private final FullRevision mMinPlatformToolsRevision;
/**
* Creates a new tool package from the attributes and elements of the given XML node.
@@ -72,11 +72,11 @@ public class ToolPackage extends FullRevisionPackage implements IMinPlatformTool
Map<String,String> licenses) {
super(source, packageNode, nsUri, licenses);
- mMinPlatformToolsRevision = PackageParserUtils.getXmlInt(
- packageNode,
- SdkRepoConstants.NODE_MIN_PLATFORM_TOOLS_REV,
- MIN_PLATFORM_TOOLS_REV_INVALID);
- if (mMinPlatformToolsRevision == MIN_PLATFORM_TOOLS_REV_INVALID) {
+ mMinPlatformToolsRevision = PackageParserUtils.parseFullRevisionElement(
+ PackageParserUtils.findChildElement(packageNode,
+ SdkRepoConstants.NODE_MIN_PLATFORM_TOOLS_REV));
+
+ if (mMinPlatformToolsRevision.equals(MIN_PLATFORM_TOOLS_REV_INVALID)) {
// This revision number is mandatory starting with sdk-repository-3.xsd
// and did not exist before. Complain if the URI has level >= 3.
@@ -144,8 +144,16 @@ public class ToolPackage extends FullRevisionPackage implements IMinPlatformTool
archiveArch,
archiveOsPath);
- mMinPlatformToolsRevision = getPropertyInt(props, PkgProps.MIN_PLATFORM_TOOLS_REV,
- MIN_PLATFORM_TOOLS_REV_INVALID);
+ String revStr = getProperty(props, PkgProps.MIN_PLATFORM_TOOLS_REV, null);
+
+ FullRevision rev = MIN_PLATFORM_TOOLS_REV_INVALID;
+ if (revStr != null) {
+ try {
+ rev = FullRevision.parseRevision(revStr);
+ } catch (NumberFormatException ignore) {}
+ }
+
+ mMinPlatformToolsRevision = rev;
}
/**
@@ -155,7 +163,7 @@ public class ToolPackage extends FullRevisionPackage implements IMinPlatformTool
* This attribute is mandatory and should not be normally missing.
*/
@Override
- public int getMinPlatformToolsRevision() {
+ public FullRevision getMinPlatformToolsRevision() {
return mMinPlatformToolsRevision;
}
@@ -256,9 +264,9 @@ public class ToolPackage extends FullRevisionPackage implements IMinPlatformTool
public void saveProperties(Properties props) {
super.saveProperties(props);
- if (getMinPlatformToolsRevision() != MIN_PLATFORM_TOOLS_REV_INVALID) {
+ if (!getMinPlatformToolsRevision().equals(MIN_PLATFORM_TOOLS_REV_INVALID)) {
props.setProperty(PkgProps.MIN_PLATFORM_TOOLS_REV,
- Integer.toString(getMinPlatformToolsRevision()));
+ getMinPlatformToolsRevision().toShortString());
}
}
@@ -335,7 +343,8 @@ public class ToolPackage extends FullRevisionPackage implements IMinPlatformTool
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
- result = prime * result + mMinPlatformToolsRevision;
+ result = prime * result
+ + ((mMinPlatformToolsRevision == null) ? 0 : mMinPlatformToolsRevision.hashCode());
return result;
}
@@ -351,7 +360,11 @@ public class ToolPackage extends FullRevisionPackage implements IMinPlatformTool
return false;
}
ToolPackage other = (ToolPackage) obj;
- if (mMinPlatformToolsRevision != other.mMinPlatformToolsRevision) {
+ if (mMinPlatformToolsRevision == null) {
+ if (other.mMinPlatformToolsRevision != null) {
+ return false;
+ }
+ } else if (!mMinPlatformToolsRevision.equals(other.mMinPlatformToolsRevision)) {
return false;
}
return true;
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/--sdk-addon-5.xsd b/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/-sdk-addon-5.xsd
index 180a885..6250789 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/--sdk-addon-5.xsd
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/-sdk-addon-5.xsd
@@ -15,9 +15,9 @@
* limitations under the License.
-->
<xsd:schema
- targetNamespace="http://schemas.android.com/sdk/android/addon/4"
+ targetNamespace="http://schemas.android.com/sdk/android/addon/5"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
- xmlns:sdk="http://schemas.android.com/sdk/android/addon/4"
+ xmlns:sdk="http://schemas.android.com/sdk/android/addon/5"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
version="1">
@@ -54,9 +54,11 @@
- <addon> does the same, where <name> is replaced by <name-id> and <name-display>
and <vendor> is replaced by <vendor-id> and <vendor-display>.
- - v5 is not used yet:
+ - v5 is used by the SDK Manager in Tools r20:
- The <beta-rc> element is no longer supported. It was never implemented anyway.
-
+ - For <tool> and <platform-tool> packages, the <revision> element becomes a
+ a "full revision" element with <major>, <minor>, <micro> and <preview> sub-elements.
+ - <min-tools-rev> for <extra> becomes a full revision element.
-->
<xsd:element name="sdk-addon" type="sdk:repositoryType" />
@@ -226,8 +228,8 @@
<!-- The optional release note URL of this package -->
<xsd:element name="release-url" type="xsd:token" minOccurs="0" />
<!-- The minimal revision of tools required by this package.
- Optional. If present, must be an int > 0. -->
- <xsd:element name="min-tools-rev" type="xsd:positiveInteger" minOccurs="0" />
+ Optional. If present, must be a revision element. -->
+ <xsd:element name="min-tools-rev" type="sdk:revisionType" minOccurs="0" />
<!-- The minimal API level required by this package.
Optional. If present, must be an int > 0. -->
<xsd:element name="min-api-level" type="xsd:positiveInteger" minOccurs="0" />
@@ -242,6 +244,35 @@
</xsd:complexType>
+ <!-- A full revision, with a major.minor.micro and an optional preview number.
+ The major number is mandatory, the other elements are optional.
+ -->
+
+ <xsd:complexType name="revisionType">
+ <xsd:annotation>
+ <xsd:documentation>
+ A full revision, with a major.minor.micro and an
+ optional preview number. The major number is mandatory.
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:all>
+ <!-- The major revision, an int > 0, incremented each time a new
+ package is generated. -->
+ <xsd:element name="major" type="xsd:positiveInteger" />
+ <!-- The minor revision, an int >= 0, incremented each time a new
+ minor package is generated. Assumed to be 0 if missing. -->
+ <xsd:element name="minor" type="xsd:nonNegativeInteger" minOccurs="0" />
+ <!-- The micro revision, an int >= 0, incremented each time a new
+ buf fix is generated. Assumed to be 0 if missing. -->
+ <xsd:element name="micro" type="xsd:nonNegativeInteger" minOccurs="0" />
+ <!-- The preview/release candidate revision, an int > 0,
+ incremented each time a new preview is generated.
+ Not present for final releases. -->
+ <xsd:element name="preview" type="xsd:positiveInteger" minOccurs="0" />
+ </xsd:all>
+ </xsd:complexType>
+
+
<!-- The definition of a path segment used by the extra element. -->
<xsd:simpleType name="segmentType">
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/-sdk-repository-7.xsd b/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/-sdk-repository-7.xsd
index d3ca018..ca41b36 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/-sdk-repository-7.xsd
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/-sdk-repository-7.xsd
@@ -70,10 +70,11 @@
the package is a Beta Release Candidate and not a final release.
- v7 is used by the SDK Manager in Tools r20:
- - <tool> and <platform-tool> packages have new <minor-rev> and
- <micro-rev> numbers.
- - The <beta-rc> element is no longer supported, it is replaced by <preview>
- which is only for <tool> and <platform-tool> packages.
+ - For <tool> and <platform-tool> packages, the <revision> element becomes a
+ a "full revision" element with <major>, <minor>, <micro> and <preview> sub-elements.
+ - The <beta-rc> element is no longer supported, it is replaced by
+ <revision> -> <preview> and is only for <tool> and <platform-tool> packages.
+ - <min-tools-rev> and <min-platform-tools-rev> also become a full revision element.
-->
<xsd:element name="sdk-repository" type="sdk:repositoryType" />
@@ -132,8 +133,8 @@
<!-- A list of file archives for this package. -->
<xsd:element name="archives" type="sdk:archivesType" />
<!-- The minimal revision of tools required by this package.
- Optional. If present, must be an int > 0. -->
- <xsd:element name="min-tools-rev" type="xsd:positiveInteger" minOccurs="0" />
+ Optional. If present, must be a revision element. -->
+ <xsd:element name="min-tools-rev" type="sdk:revisionType" minOccurs="0" />
<!-- The ABI of the system image *included* in this platform, if any.
When the field is present, it means the platform already embeds one
@@ -294,8 +295,8 @@
<xsd:element name="archives" type="sdk:archivesType" />
<!-- The minimal revision of platform-tools required by this package.
- Mandatory. Must be an int > 0. -->
- <xsd:element name="min-platform-tools-rev" type="xsd:positiveInteger" />
+ Mandatory. Must be a revision element. -->
+ <xsd:element name="min-platform-tools-rev" type="sdk:revisionType" />
<!-- An optional element indicating the package is obsolete.
The string content is however currently not defined and ignored. -->
@@ -402,8 +403,8 @@
<!-- A list of file archives for this package. -->
<xsd:element name="archives" type="sdk:archivesType" />
<!-- The minimal revision of tools required by this package.
- Optional. If present, must be an int > 0. -->
- <xsd:element name="min-tools-rev" type="xsd:positiveInteger" minOccurs="0" />
+ Optional. If present, must be a revision element. -->
+ <xsd:element name="min-tools-rev" type="sdk:revisionType" minOccurs="0" />
<!-- An optional element indicating the package is obsolete.
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 52d3a14..703bf1a 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/SdkAddonConstants.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/SdkAddonConstants.java
@@ -46,7 +46,7 @@ public class SdkAddonConstants extends RepoConstants {
* 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;
+ public static final int NS_LATEST_VERSION = 5;
/** The XML namespace of the latest sdk-addon XML. */
public static final String NS_URI = getSchemaUri(NS_LATEST_VERSION);
diff --git a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/archives/ArchiveInstallerTest.java b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/archives/ArchiveInstallerTest.java
index 7f1b99a..609481b 100755
--- a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/archives/ArchiveInstallerTest.java
+++ b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/archives/ArchiveInstallerTest.java
@@ -20,15 +20,11 @@ import com.android.sdklib.internal.repository.DownloadCache;
import com.android.sdklib.internal.repository.ITaskMonitor;
import com.android.sdklib.internal.repository.MockEmptySdkManager;
import com.android.sdklib.internal.repository.MockMonitor;
-import com.android.sdklib.internal.repository.archives.Archive;
-import com.android.sdklib.internal.repository.archives.ArchiveInstaller;
-import com.android.sdklib.internal.repository.archives.ArchiveReplacement;
import com.android.sdklib.internal.repository.archives.Archive.Arch;
import com.android.sdklib.internal.repository.archives.Archive.Os;
import com.android.sdklib.internal.repository.packages.ExtraPackage;
import com.android.sdklib.internal.repository.packages.MockEmptyPackage;
import com.android.sdklib.internal.repository.packages.MockExtraPackage;
-import com.android.sdklib.internal.repository.packages.ToolPackage;
import com.android.sdklib.internal.repository.sources.SdkRepoSource;
import com.android.sdklib.internal.repository.sources.SdkSource;
import com.android.sdklib.io.IFileOp;
diff --git a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/MinToolsPackageTest.java b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/MinToolsPackageTest.java
index 00986a4..adffe2e 100755
--- a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/MinToolsPackageTest.java
+++ b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/MinToolsPackageTest.java
@@ -124,7 +124,7 @@ public class MinToolsPackageTest extends PackageTest {
Properties props = super.createProps();
// MinToolsPackage properties
- props.setProperty(PkgProps.MIN_TOOLS_REV, "3");
+ props.setProperty(PkgProps.MIN_TOOLS_REV, "3.0.1");
return props;
}
@@ -133,6 +133,6 @@ public class MinToolsPackageTest extends PackageTest {
super.testCreatedPackage(p);
// MinToolsPackage properties
- assertEquals(3, p.getMinToolsRevision());
+ assertEquals("3.0.1", p.getMinToolsRevision().toShortString());
}
}
diff --git a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/sources/SdkAddonSourceTest.java b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/sources/SdkAddonSourceTest.java
index b9a3436..d866018 100755
--- a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/sources/SdkAddonSourceTest.java
+++ b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/sources/SdkAddonSourceTest.java
@@ -22,6 +22,7 @@ import com.android.sdklib.internal.repository.MockEmptySdkManager;
import com.android.sdklib.internal.repository.MockMonitor;
import com.android.sdklib.internal.repository.packages.AddonPackage;
import com.android.sdklib.internal.repository.packages.ExtraPackage;
+import com.android.sdklib.internal.repository.packages.IMinToolsDependency;
import com.android.sdklib.internal.repository.packages.Package;
import com.android.sdklib.internal.repository.sources.SdkAddonSource;
import com.android.sdklib.repository.SdkAddonConstants;
@@ -564,6 +565,154 @@ public class SdkAddonSourceTest extends TestCase {
}
/**
+ * Validate we can load a valid add-on schema version 5
+ */
+ public void testLoadAddonXml_5() throws Exception {
+ InputStream xmlStream = getTestResource("/com/android/sdklib/testdata/addon_sample_5.xml");
+
+ // guess the version from the XML document
+ int version = mSource._getXmlSchemaVersion(xmlStream);
+ assertEquals(5, version);
+
+ Boolean[] validatorFound = new Boolean[] { Boolean.FALSE };
+ String[] validationError = new String[] { null };
+ String url = "not-a-valid-url://" + SdkAddonConstants.URL_DEFAULT_FILENAME;
+
+ String uri = mSource._validateXml(xmlStream, url, version, validationError, validatorFound);
+ assertEquals(Boolean.TRUE, validatorFound[0]);
+ assertEquals(null, validationError[0]);
+ assertEquals(SdkAddonConstants.getSchemaUri(5), uri);
+
+ // Validation was successful, load the document
+ MockMonitor monitor = new MockMonitor();
+ Document doc = mSource._getDocument(xmlStream, monitor);
+ assertNotNull(doc);
+
+ // Get the packages
+ assertTrue(mSource._parsePackages(doc, uri, monitor));
+
+ 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",
+ monitor.getCapturedVerboseLog());
+ assertEquals("", monitor.getCapturedLog());
+ assertEquals("", monitor.getCapturedErrorLog());
+
+ // check the packages we found... we expected to find 6 packages with each at least
+ // one archive.
+ // Note the order doesn't necessary match the one from the
+ // assertEquald(getCapturedVerboseLog) because packages are sorted using the
+ // Packages' sorting order, e.g. all platforms are sorted by descending API level, etc.
+ Package[] pkgs = mSource.getPackages();
+
+ assertEquals(6, pkgs.length);
+ for (Package p : pkgs) {
+ assertTrue(p.getArchives().length >= 1);
+ }
+
+ // Check the addon packages: vendor/name id vs display
+ ArrayList<String> addonNames = new ArrayList<String>();
+ ArrayList<String> addonVendors = new ArrayList<String>();
+ 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<Pair<Integer, Integer>> layoutlibVers = new ArrayList<Pair<Integer,Integer>>();
+ for (Package p : pkgs) {
+ if (p instanceof AddonPackage) {
+ layoutlibVers.add(((AddonPackage) p).getLayoutlibVersion());
+ }
+ }
+ assertEquals(
+ "[Pair [first=3, second=42], " + // for #3 "This add-on has no libraries"
+ "Pair [first=0, second=0], " + // for #2 "My Second add-on"
+ "Pair [first=5, second=0]]", // for #1 "My First add-on"
+ Arrays.toString(layoutlibVers.toArray()));
+
+
+ // Check the extra packages: path, vendor, install folder, old-paths
+ final String osSdkPath = "SDK";
+ final SdkManager sdkManager = new MockEmptySdkManager(osSdkPath);
+
+ ArrayList<String> extraPaths = new ArrayList<String>();
+ ArrayList<String> extraVendors = new ArrayList<String>();
+ ArrayList<File> extraInstall = new ArrayList<File>();
+ ArrayList<ArrayList<String>> extraFilePaths = new ArrayList<ArrayList<String>>();
+ for (Package p : pkgs) {
+ if (p instanceof ExtraPackage) {
+ ExtraPackage ep = (ExtraPackage) p;
+ // combine path and old-paths in the form "path [old_path1, old_path2]"
+ extraPaths.add(ep.getPath() + " " + Arrays.toString(ep.getOldPaths()));
+ extraVendors.add(ep.getVendorId() + "/" + ep.getVendorDisplay());
+ extraInstall.add(ep.getInstallFolder(osSdkPath, sdkManager));
+
+ ArrayList<String> filePaths = new ArrayList<String>();
+ for (String filePath : ep.getProjectFiles()) {
+ filePaths.add(filePath);
+ }
+ extraFilePaths.add(filePaths);
+ }
+ }
+ // Extras are sorted by vendor-id/path and thus their order differs from the
+ // XML or the parsed package list.
+ assertEquals(
+ "[extra0000005f [], " + // for extra #3
+ "extra_api_dep [path1, old_path2, oldPath3], " + // for extra #2
+ "usb_driver []]", // for extra #1
+ Arrays.toString(extraPaths.toArray()));
+ assertEquals(
+ "[____/____, " +
+ "android_vendor/Android Vendor, " +
+ "cyclop/The big bus]",
+ Arrays.toString(extraVendors.toArray()));
+ assertEquals(
+ ("[SDK/extras/____/extra0000005f, " +
+ "SDK/extras/android_vendor/extra_api_dep, " +
+ "SDK/extras/cyclop/usb_driver]").replace('/', File.separatorChar),
+ Arrays.toString(extraInstall.toArray()));
+ assertEquals(
+ "[[], " +
+ "[v8/veggies_8.jar, root.jar, dir1/dir 2 with space/mylib.jar], " +
+ "[]]",
+ Arrays.toString(extraFilePaths.toArray()));
+
+
+ // Check the min-tools-rev
+ ArrayList<String> minToolsRevs = new ArrayList<String>();
+ for (Package p : pkgs) {
+ if (p instanceof IMinToolsDependency) {
+ minToolsRevs.add(p.getListDescription() + ": " +
+ ((IMinToolsDependency) p).getMinToolsRevision().toShortString());
+ }
+ }
+ assertEquals(
+ "[. -..- - .-. .- (Obsolete): 3.0.1, " +
+ "Yet another extra, by Android: 3, " +
+ "Random name, not an id! (Obsolete): 3.2.1 rc42]",
+ Arrays.toString(minToolsRevs.toArray()));
+ }
+
+ /**
* Returns an SdkLib file resource as a {@link ByteArrayInputStream},
* which has the advantage that we can use {@link InputStream#reset()} on it
* at any time to read it multiple times.
diff --git a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/sources/SdkRepoSourceTest.java b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/sources/SdkRepoSourceTest.java
index 072cc10..413902a 100755
--- a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/sources/SdkRepoSourceTest.java
+++ b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/sources/SdkRepoSourceTest.java
@@ -21,6 +21,8 @@ import com.android.sdklib.internal.repository.ITaskMonitor;
import com.android.sdklib.internal.repository.MockEmptySdkManager;
import com.android.sdklib.internal.repository.MockMonitor;
import com.android.sdklib.internal.repository.packages.ExtraPackage;
+import com.android.sdklib.internal.repository.packages.IMinPlatformToolsDependency;
+import com.android.sdklib.internal.repository.packages.IMinToolsDependency;
import com.android.sdklib.internal.repository.packages.Package;
import com.android.sdklib.internal.repository.packages.PlatformPackage;
import com.android.sdklib.internal.repository.packages.PlatformToolPackage;
@@ -887,6 +889,7 @@ public class SdkRepoSourceTest extends TestCase {
"Found Android SDK Tools, revision 42\n" +
"Found Android SDK Platform-tools, revision 3 rc5\n" +
"Found Samples for SDK API 14, revision 24 (Obsolete)\n" +
+ "Found Samples for SDK API 14, revision 25 (Obsolete)\n" +
"Found ARM EABI System Image, Android API 42, revision 12\n" +
"Found Mips System Image, Android API 42, revision 12\n" +
"Found Sources for Android SDK, API 42, revision 12\n",
@@ -901,7 +904,7 @@ public class SdkRepoSourceTest extends TestCase {
// Packages' sorting order, e.g. all platforms are sorted by descending API level, etc.
Package[] pkgs = mSource.getPackages();
- assertEquals(16, pkgs.length);
+ assertEquals(17, pkgs.length);
for (Package p : pkgs) {
assertTrue(p.getArchives().length >= 1);
}
@@ -958,6 +961,7 @@ public class SdkRepoSourceTest extends TestCase {
assertEquals("[]", Arrays.toString(extraInstall.toArray()));
assertEquals("[]", Arrays.toString(extraFilePaths.toArray()));
+
// Check the system-image packages
ArrayList<String> sysImgVersionAbi = new ArrayList<String>();
for (Package p : pkgs) {
@@ -975,6 +979,7 @@ public class SdkRepoSourceTest extends TestCase {
"2 x86]",
Arrays.toString(sysImgVersionAbi.toArray()));
+
// Check the source packages
ArrayList<String> sourceVersion = new ArrayList<String>();
for (Package p : pkgs) {
@@ -987,6 +992,37 @@ public class SdkRepoSourceTest extends TestCase {
assertEquals(
"[42, 2, 1]",
Arrays.toString(sourceVersion.toArray()));
+
+
+ // Check the min-tools-rev
+ ArrayList<String> minToolsRevs = new ArrayList<String>();
+ for (Package p : pkgs) {
+ if (p instanceof IMinToolsDependency) {
+ minToolsRevs.add(p.getListDescription() + ": " +
+ ((IMinToolsDependency) p).getMinToolsRevision().toShortString());
+ }
+ }
+ assertEquals(
+ "[SDK Platform Android Pastry Preview: 0, " +
+ "SDK Platform Android 1.1: 0, " +
+ "SDK Platform Android 1.0: 2.0.1, " +
+ "Samples for SDK API 14 (Obsolete): 5, " +
+ "Samples for SDK API 14 (Obsolete): 5.1.2 rc3]",
+ Arrays.toString(minToolsRevs.toArray()));
+
+
+ // Check the min-platform-tools-rev
+ ArrayList<String> minPlatToolsRevs = new ArrayList<String>();
+ for (Package p : pkgs) {
+ if (p instanceof IMinPlatformToolsDependency) {
+ minPlatToolsRevs.add(p.getListDescription() + ": " +
+ ((IMinPlatformToolsDependency) p).getMinPlatformToolsRevision().toShortString());
+ }
+ }
+ assertEquals(
+ "[Android SDK Tools: 4, " +
+ "Android SDK Tools: 4 rc5]",
+ Arrays.toString(minPlatToolsRevs.toArray()));
}
/**
diff --git a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/repository/ValidateRepositoryXmlTest.java b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/repository/ValidateRepositoryXmlTest.java
index e36b204..648ff05 100755
--- a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/repository/ValidateRepositoryXmlTest.java
+++ b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/repository/ValidateRepositoryXmlTest.java
@@ -303,7 +303,7 @@ public class ValidateRepositoryXmlTest extends TestCase {
OPEN_TAG_REPO +
"<r:license id=\"lic1\"> some license </r:license> " +
"<r:tool> <r:uses-license ref=\"lic2\" /> <r:revision> <r:major>1</r:major> </r:revision> " +
- "<r:min-platform-tools-rev>1</r:min-platform-tools-rev> " +
+ "<r:min-platform-tools-rev> <r:major>1</r:major> </r:min-platform-tools-rev> " +
"<r:archives> <r:archive os=\"any\"> <r:size>1</r:size> <r:checksum>2822ae37115ebf13412bbef91339ee0d9454525e</r:checksum> " +
"<r:url>url</r:url> </r:archive> </r:archives> </r:tool>" +
CLOSE_TAG_REPO;
diff --git a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/testdata/addon_sample_5.xml b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/testdata/addon_sample_5.xml
new file mode 100755
index 0000000..47b37be
--- /dev/null
+++ b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/testdata/addon_sample_5.xml
@@ -0,0 +1,214 @@
+<?xml version="1.0"?>
+<!--
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+-->
+<sdk:sdk-addon
+ xmlns:sdk="http://schemas.android.com/sdk/android/addon/5">
+
+ <!-- Define a couple of licenses. These will be referenced by uses-license later. -->
+
+ <sdk:license type="text" id="license1">
+ This is the license
+ for this platform.
+ </sdk:license>
+
+ <sdk:license id="license2">
+ Licenses are only of type 'text' right now, so this is implied.
+ </sdk:license>
+
+ <!-- Inner elements must be either platform, add-on, doc or tool.
+ There can be 0 or more of each, in any order. -->
+
+ <sdk:add-on>
+ <sdk:name-id>My_First_add-on</sdk:name-id>
+ <sdk:name-display>My First add-on</sdk:name-display>
+
+ <sdk:vendor-id>John_Doe</sdk:vendor-id>
+ <sdk:vendor-display>John Doe</sdk:vendor-display>
+
+ <sdk:api-level>1</sdk:api-level>
+ <sdk:revision>1</sdk:revision>
+ <sdk:uses-license ref="license2" />
+ <sdk:description>Some optional description</sdk:description>
+ <sdk:desc-url>http://www.example.com/myfirstaddon</sdk:desc-url>
+ <sdk:archives>
+ <sdk:archive os="any">
+ <sdk:size>65536</sdk:size>
+ <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
+ <sdk:url>http://www.example.com/add-ons/first.zip</sdk:url>
+ </sdk:archive>
+ </sdk:archives>
+ <!-- The libs node is mandatory, however it can be empty. -->
+ <sdk:libs>
+ <sdk:lib>
+ <sdk:name>android.blah.somelib</sdk:name>
+ <sdk:description>The description for this library.</sdk:description>
+ </sdk:lib>
+ <sdk:lib>
+ <!-- sdk:description is optional, name is not -->
+ <sdk:name>com.android.mymaps</sdk:name>
+ </sdk:lib>
+ </sdk:libs>
+ <sdk:layoutlib>
+ <sdk:api>5</sdk:api>
+ <sdk:revision>0</sdk:revision>
+ </sdk:layoutlib>
+ </sdk:add-on>
+
+ <sdk:add-on>
+ <sdk:name-id>My_Second_add-on</sdk:name-id>
+ <sdk:name-display>My Second add-on</sdk:name-display>
+
+ <sdk:vendor-id>John_Deer</sdk:vendor-id>
+ <sdk:vendor-display>John Deer</sdk:vendor-display>
+
+ <sdk:api-level>2</sdk:api-level>
+ <sdk:revision>42</sdk:revision>
+ <sdk:archives>
+ <sdk:archive os="windows">
+ <sdk:size>65536</sdk:size>
+ <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
+ <sdk:url>distrib/second-42-win.zip</sdk:url>
+ </sdk:archive>
+ <sdk:archive os="linux">
+ <sdk:size>65536</sdk:size>
+ <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
+ <sdk:url>distrib/second-42-linux.tar.bz2</sdk:url>
+ </sdk:archive>
+ </sdk:archives>
+ <sdk:libs>
+ <sdk:lib>
+ <sdk:name>android.blah.somelib</sdk:name>
+ <sdk:description>The description for this library.</sdk:description>
+ </sdk:lib>
+ <sdk:lib>
+ <sdk:name>com.android.mymaps</sdk:name>
+ </sdk:lib>
+ </sdk:libs>
+ <sdk:uses-license ref="license2" />
+ <!-- No layoutlib element in this package. It's optional. -->
+ </sdk:add-on>
+
+ <sdk:add-on>
+ <sdk:name-id>no_libs</sdk:name-id>
+ <sdk:name-display>This add-on has no libraries</sdk:name-display>
+
+ <sdk:vendor-id>Joe_Bar</sdk:vendor-id>
+ <sdk:vendor-display>Joe Bar</sdk:vendor-display>
+
+ <sdk:uses-license ref="license2" />
+ <sdk:api-level>4</sdk:api-level>
+ <sdk:revision>3</sdk:revision>
+ <sdk:archives>
+ <sdk:archive os="any" arch="any">
+ <sdk:size>65536</sdk:size>
+ <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
+ <sdk:url>distrib/imnotanarchiveimadoctorjim.zip</sdk:url>
+ </sdk:archive>
+ </sdk:archives>
+ <!-- The libs node is mandatory, however it can be empty. -->
+ <sdk:libs />
+ <sdk:layoutlib>
+ <sdk:api>3</sdk:api>
+ <sdk:revision>42</sdk:revision>
+ </sdk:layoutlib>
+ </sdk:add-on>
+
+ <sdk:extra>
+ <sdk:name-display>Random name, not an id!</sdk:name-display>
+
+ <sdk:vendor-id>cyclop</sdk:vendor-id>
+ <sdk:vendor-display>The big bus</sdk:vendor-display>
+
+ <sdk:path>usb_driver</sdk:path>
+ <sdk:uses-license ref="license2" />
+ <sdk:revision>43</sdk:revision>
+ <sdk:archives>
+ <sdk:archive os="any" arch="any">
+ <sdk:size>65536</sdk:size>
+ <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
+ <sdk:url>distrib/extraduff.zip</sdk:url>
+ </sdk:archive>
+ </sdk:archives>
+ <sdk:description>An Extra package for the USB driver, it will install in $SDK/usb_driver</sdk:description>
+ <sdk:desc-url>http://www.example.com/extra.html</sdk:desc-url>
+ <sdk:min-tools-rev>
+ <sdk:major>3</sdk:major>
+ <sdk:minor>2</sdk:minor>
+ <sdk:micro>1</sdk:micro>
+ <sdk:preview>42</sdk:preview>
+ </sdk:min-tools-rev>
+ <sdk:obsolete/>
+ </sdk:extra>
+
+ <sdk:extra>
+ <sdk:name-display>Yet another extra, by Android</sdk:name-display>
+
+ <sdk:vendor-id>android_vendor</sdk:vendor-id>
+ <sdk:vendor-display>Android Vendor</sdk:vendor-display>
+
+ <sdk:path>extra_api_dep</sdk:path>
+ <sdk:uses-license ref="license2" />
+ <sdk:revision>2</sdk:revision>
+ <sdk:archives>
+ <sdk:archive os="any" arch="any">
+ <sdk:size>65536</sdk:size>
+ <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
+ <sdk:url>distrib/extra_mega_duff.zip</sdk:url>
+ </sdk:archive>
+ </sdk:archives>
+ <sdk:description>Some extra package that has a min-api-level of 42</sdk:description>
+ <sdk:desc-url>http://www.example.com/extra.html</sdk:desc-url>
+ <sdk:min-tools-rev>
+ <sdk:major>3</sdk:major>
+ </sdk:min-tools-rev>
+ <sdk:min-api-level>42</sdk:min-api-level>
+ <sdk:project-files>
+ <sdk:path>v8/veggies_8.jar</sdk:path>
+ <sdk:path>root.jar</sdk:path>
+ <sdk:path>dir1/dir 2 with space/mylib.jar</sdk:path>
+ </sdk:project-files>
+ <sdk:old-paths>path1;old_path2;oldPath3</sdk:old-paths>
+ </sdk:extra>
+
+ <sdk:extra>
+ <sdk:name-display>. -..- - .-. .-</sdk:name-display>
+
+ <sdk:vendor-id>____</sdk:vendor-id>
+ <sdk:vendor-display>____</sdk:vendor-display>
+
+ <sdk:path>____</sdk:path>
+ <sdk:uses-license ref="license2" />
+ <sdk:revision>2</sdk:revision>
+ <sdk:archives>
+ <sdk:archive os="any" arch="any">
+ <sdk:size>65536</sdk:size>
+ <sdk:checksum type="sha1">2822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
+ <sdk:url>distrib/extra_mega_duff.zip</sdk:url>
+ </sdk:archive>
+ </sdk:archives>
+ <sdk:description>Some extra package that has a min-api-level of 42</sdk:description>
+ <sdk:desc-url>http://www.example.com/extra.html</sdk:desc-url>
+ <sdk:min-tools-rev>
+ <sdk:major>3</sdk:major>
+ <!-- no minor, assumed to be 0 -->
+ <sdk:micro>1</sdk:micro>
+ </sdk:min-tools-rev>
+ <sdk:min-api-level>42</sdk:min-api-level>
+ <sdk:obsolete></sdk:obsolete>
+ <!-- No project-files element in this package. -->
+ </sdk:extra>
+
+</sdk:sdk-addon>
diff --git a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/testdata/repository_sample_7.xml b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/testdata/repository_sample_7.xml
index 1f4d259..401521b 100755
--- a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/testdata/repository_sample_7.xml
+++ b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/testdata/repository_sample_7.xml
@@ -42,7 +42,11 @@
for this package. It's a free multi-line text.
</sdk:release-note>
<sdk:release-url>http://some/url/for/the/release/note.html</sdk:release-url>
- <sdk:min-tools-rev>2</sdk:min-tools-rev>
+ <sdk:min-tools-rev>
+ <sdk:major>2</sdk:major>
+ <!-- minor is missing and equivalent to 0 -->
+ <sdk:micro>1</sdk:micro>
+ </sdk:min-tools-rev>
<!-- The archives node is mandatory and it cannot be empty. -->
<sdk:archives>
<sdk:archive os="any">
@@ -195,7 +199,9 @@
<sdk:description>Some optional description</sdk:description>
<sdk:desc-url>http://www.example.com/tools.html</sdk:desc-url>
<sdk:uses-license ref="license1" />
- <sdk:min-platform-tools-rev>4</sdk:min-platform-tools-rev>
+ <sdk:min-platform-tools-rev>
+ <sdk:major>4</sdk:major>
+ </sdk:min-platform-tools-rev>
<sdk:archives>
<sdk:archive os="any">
<sdk:size>65536</sdk:size>
@@ -233,7 +239,12 @@
<sdk:major>42</sdk:major>
</sdk:revision>
<sdk:uses-license ref="license1" />
- <sdk:min-platform-tools-rev>3</sdk:min-platform-tools-rev>
+ <sdk:min-platform-tools-rev>
+ <sdk:major>4</sdk:major>
+ <sdk:minor>0</sdk:minor>
+ <sdk:micro>0</sdk:micro>
+ <sdk:preview>5</sdk:preview>
+ </sdk:min-platform-tools-rev>
<sdk:archives>
<sdk:archive os="windows">
<sdk:size>65536</sdk:size>
@@ -292,7 +303,30 @@
</sdk:archives>
<sdk:description>Some sample package</sdk:description>
<sdk:desc-url>http://www.example.com/sample.html</sdk:desc-url>
- <sdk:min-tools-rev>5</sdk:min-tools-rev>
+ <sdk:min-tools-rev>
+ <sdk:major>5</sdk:major>
+ </sdk:min-tools-rev>
+ <sdk:obsolete>This is obsolete</sdk:obsolete>
+ </sdk:sample>
+
+ <sdk:sample>
+ <sdk:api-level>14</sdk:api-level>
+ <sdk:revision>25</sdk:revision>
+ <sdk:archives>
+ <sdk:archive os="any" arch="any">
+ <sdk:size>65537</sdk:size>
+ <sdk:checksum type="sha1">3822ae37115ebf13412bbef91339ee0d9454525e</sdk:checksum>
+ <sdk:url>distrib/sample_duff.zip</sdk:url>
+ </sdk:archive>
+ </sdk:archives>
+ <sdk:description>Some sample package</sdk:description>
+ <sdk:desc-url>http://www.example.com/sample.html</sdk:desc-url>
+ <sdk:min-tools-rev>
+ <sdk:major>5</sdk:major>
+ <sdk:minor>1</sdk:minor>
+ <sdk:micro>2</sdk:micro>
+ <sdk:preview>3</sdk:preview>
+ </sdk:min-tools-rev>
<sdk:obsolete>This is obsolete</sdk:obsolete>
</sdk:sample>