aboutsummaryrefslogtreecommitdiffstats
path: root/sdkmanager/libs/sdklib
diff options
context:
space:
mode:
authorRaphael Moll <ralf@android.com>2012-05-02 20:59:38 -0700
committerRaphael Moll <ralf@android.com>2012-05-03 14:50:26 -0700
commite4b7f106500886bf4a6eb0303dbc1cfb73229954 (patch)
treeb0c040c6c084c68a1a3408e482d86e592fbac5d4 /sdkmanager/libs/sdklib
parent87107c5cb1fb5fdafdaa94460fb6797af60fcde9 (diff)
downloadsdk-e4b7f106500886bf4a6eb0303dbc1cfb73229954.zip
sdk-e4b7f106500886bf4a6eb0303dbc1cfb73229954.tar.gz
sdk-e4b7f106500886bf4a6eb0303dbc1cfb73229954.tar.bz2
SDK: Rework repository-7.xsd
This changes the XML schema for repository-7 to put the "full revision" in its own <revision> element with 4 sub-elements (major/minor/micro and preview). Next step is to reuse this for min-[plat-]tools-rev for dependencies. Change-Id: I644f08e7383987682f8b0b31175ce58d02fd8751
Diffstat (limited to 'sdkmanager/libs/sdklib')
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/AddonPackage.java37
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/BrokenPackage.java2
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/DocPackage.java9
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/ExtraPackage.java20
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/FullRevision.java1
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/FullRevisionPackage.java53
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/LayoutlibVersionMixin.java8
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/MajorRevisionPackage.java121
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/MinToolsPackage.java5
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/Package.java74
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/PackageParserUtils.java (renamed from sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/XmlParserUtils.java)26
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/PlatformPackage.java20
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/SamplePackage.java12
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/SourcePackage.java9
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/SystemImagePackage.java11
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/ToolPackage.java3
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/sources/SdkRepoSource.java18
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/repository/-sdk-repository-7.xsd61
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/repository/PkgProps.java4
-rwxr-xr-xsdkmanager/libs/sdklib/src/com/android/sdklib/repository/SdkRepoConstants.java9
-rwxr-xr-xsdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/FullRevisionPackageTest.java22
-rwxr-xr-xsdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/MockEmptyPackage.java2
-rwxr-xr-xsdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/MockPlatformToolPackage.java17
-rwxr-xr-xsdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/MockToolPackage.java10
-rwxr-xr-xsdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/PackageTest.java2
-rwxr-xr-xsdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/sources/SdkRepoSourceTest.java4
-rwxr-xr-xsdkmanager/libs/sdklib/tests/src/com/android/sdklib/repository/ValidateRepositoryXmlTest.java2
-rwxr-xr-xsdkmanager/libs/sdklib/tests/src/com/android/sdklib/testdata/repository_sample_7.xml24
28 files changed, 364 insertions, 222 deletions
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/AddonPackage.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/AddonPackage.java
index 9a86952..fff45b9 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/AddonPackage.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/AddonPackage.java
@@ -25,7 +25,6 @@ import com.android.sdklib.IAndroidTarget.IOptionalLibrary;
import com.android.sdklib.SdkConstants;
import com.android.sdklib.SdkManager;
import com.android.sdklib.internal.repository.IDescription;
-import com.android.sdklib.internal.repository.XmlParserUtils;
import com.android.sdklib.internal.repository.archives.Archive.Arch;
import com.android.sdklib.internal.repository.archives.Archive.Os;
import com.android.sdklib.internal.repository.sources.SdkSource;
@@ -46,7 +45,7 @@ import java.util.Properties;
/**
* Represents an add-on XML node in an SDK repository.
*/
-public class AddonPackage extends Package
+public class AddonPackage extends MajorRevisionPackage
implements IAndroidVersionProvider, IPlatformDependency,
IExactApiLevelDependency, ILayoutlibVersion {
@@ -143,12 +142,12 @@ public class AddonPackage extends Package
// 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);
+ String nameId = PackageParserUtils.getXmlString(packageNode,
+ SdkRepoConstants.NODE_NAME_ID);
+ String nameDisp = PackageParserUtils.getXmlString(packageNode,
+ SdkRepoConstants.NODE_NAME_DISPLAY);
+ String name = PackageParserUtils.getXmlString(packageNode,
+ SdkRepoConstants.NODE_NAME);
// The old <name> is equivalent to the new <name-display>
if (nameDisp.length() == 0) {
@@ -169,12 +168,12 @@ public class AddonPackage extends Package
// --- 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);
+ String vendorId = PackageParserUtils.getXmlString(packageNode,
+ SdkAddonConstants.NODE_VENDOR_ID);
+ String vendorDisp = PackageParserUtils.getXmlString(packageNode,
+ SdkAddonConstants.NODE_VENDOR_DISPLAY);
+ String vendor = PackageParserUtils.getXmlString(packageNode,
+ SdkAddonConstants.NODE_VENDOR);
// The old <vendor> is equivalent to the new <vendor-display>
if (vendorDisp.length() == 0) {
@@ -195,10 +194,12 @@ public class AddonPackage extends Package
// --- other attributes
- int apiLevel = XmlParserUtils.getXmlInt(packageNode, SdkAddonConstants.NODE_API_LEVEL, 0);
+ int apiLevel =
+ PackageParserUtils.getXmlInt(packageNode, SdkAddonConstants.NODE_API_LEVEL, 0);
mVersion = new AndroidVersion(apiLevel, null /*codeName*/);
- mLibs = parseLibs(XmlParserUtils.getFirstChild(packageNode, SdkAddonConstants.NODE_LIBS));
+ mLibs = parseLibs(
+ PackageParserUtils.findChildElement(packageNode, SdkAddonConstants.NODE_LIBS));
mLayoutlibVersion = new LayoutlibVersionMixin(packageNode);
}
@@ -400,8 +401,8 @@ public class AddonPackage extends Package
* Parses a <lib> element from a <libs> container.
*/
private Lib parseLib(Node libNode) {
- return new Lib(XmlParserUtils.getXmlString(libNode, SdkRepoConstants.NODE_NAME),
- XmlParserUtils.getXmlString(libNode, SdkRepoConstants.NODE_DESCRIPTION));
+ return new Lib(PackageParserUtils.getXmlString(libNode, SdkRepoConstants.NODE_NAME),
+ PackageParserUtils.getXmlString(libNode, SdkRepoConstants.NODE_DESCRIPTION));
}
/** Returns the vendor id, a string, for add-on packages. */
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/BrokenPackage.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/BrokenPackage.java
index 6a7e9c6..c84c259 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/BrokenPackage.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/BrokenPackage.java
@@ -30,7 +30,7 @@ import java.util.Properties;
* Represents an SDK repository package that is incomplete.
* It has a distinct icon and a specific error that is supposed to help the user on how to fix it.
*/
-public class BrokenPackage extends Package
+public class BrokenPackage extends MajorRevisionPackage
implements IExactApiLevelDependency, IMinApiLevelDependency {
/**
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/DocPackage.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/DocPackage.java
index 9d6c02c..196f351 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/DocPackage.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/DocPackage.java
@@ -21,7 +21,6 @@ import com.android.sdklib.AndroidVersion;
import com.android.sdklib.SdkConstants;
import com.android.sdklib.SdkManager;
import com.android.sdklib.internal.repository.IDescription;
-import com.android.sdklib.internal.repository.XmlParserUtils;
import com.android.sdklib.internal.repository.archives.Archive.Arch;
import com.android.sdklib.internal.repository.archives.Archive.Os;
import com.android.sdklib.internal.repository.sources.SdkSource;
@@ -40,7 +39,7 @@ import java.util.Properties;
* However there is no mandatory dependency that limits installation so this does not
* implement {@link IPlatformDependency}.
*/
-public class DocPackage extends Package implements IAndroidVersionProvider {
+public class DocPackage extends MajorRevisionPackage implements IAndroidVersionProvider {
private final AndroidVersion mVersion;
@@ -60,8 +59,10 @@ public class DocPackage extends Package implements IAndroidVersionProvider {
Map<String,String> licenses) {
super(source, packageNode, nsUri, licenses);
- int apiLevel = XmlParserUtils.getXmlInt (packageNode, SdkRepoConstants.NODE_API_LEVEL, 0);
- String codeName = XmlParserUtils.getXmlString(packageNode, SdkRepoConstants.NODE_CODENAME);
+ int apiLevel =
+ PackageParserUtils.getXmlInt (packageNode, SdkRepoConstants.NODE_API_LEVEL, 0);
+ String codeName =
+ PackageParserUtils.getXmlString(packageNode, SdkRepoConstants.NODE_CODENAME);
if (codeName.length() == 0) {
codeName = null;
}
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 3b921ae..b16e189 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
@@ -25,7 +25,6 @@ import com.android.sdklib.SdkManager;
import com.android.sdklib.internal.repository.IDescription;
import com.android.sdklib.internal.repository.LocalSdkParser;
import com.android.sdklib.internal.repository.NullTaskMonitor;
-import com.android.sdklib.internal.repository.XmlParserUtils;
import com.android.sdklib.internal.repository.archives.Archive;
import com.android.sdklib.internal.repository.archives.Archive.Arch;
import com.android.sdklib.internal.repository.archives.Archive.Os;
@@ -103,22 +102,25 @@ public class ExtraPackage extends MinToolsPackage
Map<String,String> licenses) {
super(source, packageNode, nsUri, licenses);
- mPath = XmlParserUtils.getXmlString(packageNode, RepoConstants.NODE_PATH);
+ mPath = PackageParserUtils.getXmlString(packageNode, RepoConstants.NODE_PATH);
// Read name-display, vendor-display and vendor-id, introduced in addon-4.xsd.
// These are not optional, they are mandatory in addon-4 but we still treat them
// as optional so that we can fallback on using <vendor> which was the only one
// defined in addon-3.xsd.
- String name = XmlParserUtils.getXmlString(packageNode, RepoConstants.NODE_NAME_DISPLAY);
- String vname = XmlParserUtils.getXmlString(packageNode, RepoConstants.NODE_VENDOR_DISPLAY);
- String vid = XmlParserUtils.getXmlString(packageNode, RepoConstants.NODE_VENDOR_ID);
+ String name =
+ PackageParserUtils.getXmlString(packageNode, RepoConstants.NODE_NAME_DISPLAY);
+ String vname =
+ PackageParserUtils.getXmlString(packageNode, RepoConstants.NODE_VENDOR_DISPLAY);
+ String vid =
+ PackageParserUtils.getXmlString(packageNode, RepoConstants.NODE_VENDOR_ID);
if (vid.length() == 0) {
// If vid is missing, use the old <vendor> attribute.
// Note that in a valid XML, vendor-id cannot be an empty string.
// The only reason vid can be empty is when <vendor-id> is missing, which
// happens in an addon-3 schema, in which case the old <vendor> needs to be used.
- String vendor = XmlParserUtils.getXmlString(packageNode, RepoConstants.NODE_VENDOR);
+ String vendor = PackageParserUtils.getXmlString(packageNode, RepoConstants.NODE_VENDOR);
vid = sanitizeLegacyVendor(vendor);
if (vname.length() == 0) {
vname = vendor;
@@ -137,13 +139,13 @@ public class ExtraPackage extends MinToolsPackage
}
mDisplayName = name.trim();
- mMinApiLevel = XmlParserUtils.getXmlInt(
+ mMinApiLevel = PackageParserUtils.getXmlInt(
packageNode, RepoConstants.NODE_MIN_API_LEVEL, MIN_API_LEVEL_NOT_SPECIFIED);
mProjectFiles = parseProjectFiles(
- XmlParserUtils.getFirstChild(packageNode, RepoConstants.NODE_PROJECT_FILES));
+ PackageParserUtils.findChildElement(packageNode, RepoConstants.NODE_PROJECT_FILES));
- mOldPaths = XmlParserUtils.getXmlString(packageNode, RepoConstants.NODE_OLD_PATHS);
+ mOldPaths = PackageParserUtils.getXmlString(packageNode, RepoConstants.NODE_OLD_PATHS);
}
private String[] parseProjectFiles(Node projectFilesNode) {
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/FullRevision.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/FullRevision.java
index f902001..a90fa0a 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/FullRevision.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/FullRevision.java
@@ -27,6 +27,7 @@ package com.android.sdklib.internal.repository.packages;
*/
public class FullRevision implements Comparable<FullRevision> {
+ public static final int MISSING_MAJOR_REV = 0;
public static final int IMPLICIT_MINOR_REV = 0;
public static final int IMPLICIT_MICRO_REV = 0;
public static final int NOT_A_PREVIEW = 0;
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 9024af5..4fad28d 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
@@ -16,10 +16,8 @@
package com.android.sdklib.internal.repository.packages;
-import com.android.sdklib.internal.repository.XmlParserUtils;
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.Package.UpdateInfo;
import com.android.sdklib.internal.repository.sources.SdkSource;
import com.android.sdklib.repository.PkgProps;
import com.android.sdklib.repository.SdkRepoConstants;
@@ -54,19 +52,32 @@ public abstract class FullRevisionPackage extends Package
Map<String,String> licenses) {
super(source, packageNode, nsUri, licenses);
- // The major revision is in Package.getRevision()
- int majorRevision = super.getRevision().getMajor();
- int minorRevision = XmlParserUtils.getXmlInt(packageNode,
- SdkRepoConstants.NODE_MINOR_REV,
- FullRevision.IMPLICIT_MINOR_REV);
- int microRevision = XmlParserUtils.getXmlInt(packageNode,
- SdkRepoConstants.NODE_MICRO_REV,
- FullRevision.IMPLICIT_MICRO_REV);
- int preview = XmlParserUtils.getXmlInt(packageNode,
- SdkRepoConstants.NODE_PREVIEW,
- FullRevision.NOT_A_PREVIEW);
-
- mPreviewVersion = new FullRevision(majorRevision, minorRevision, microRevision, preview);
+ // 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);
}
/**
@@ -91,13 +102,15 @@ public abstract class FullRevisionPackage extends Package
super(source, props, revision, license, description, descUrl,
archiveOs, archiveArch, archiveOsPath);
- // The major revision is in Package.getRevision()
- int majorRevision = super.getRevision().getMajor();
- int minorRevision = Integer.parseInt(
+ int major = Integer.parseInt(
+ getProperty(props,
+ PkgProps.PKG_MAJOR_REV,
+ Integer.toString(revision)));
+ int minor = Integer.parseInt(
getProperty(props,
PkgProps.PKG_MINOR_REV,
Integer.toString(FullRevision.IMPLICIT_MINOR_REV)));
- int microRevision = Integer.parseInt(
+ int micro = Integer.parseInt(
getProperty(props,
PkgProps.PKG_MICRO_REV,
Integer.toString(FullRevision.IMPLICIT_MINOR_REV)));
@@ -106,7 +119,7 @@ public abstract class FullRevisionPackage extends Package
PkgProps.PKG_PREVIEW_REV,
Integer.toString(FullRevision.NOT_A_PREVIEW)));
- mPreviewVersion = new FullRevision(majorRevision, minorRevision, microRevision, preview);
+ mPreviewVersion = new FullRevision(major, minor, micro, preview);
}
@Override
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/LayoutlibVersionMixin.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/LayoutlibVersionMixin.java
index 5b582c1..c043578 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/LayoutlibVersionMixin.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/LayoutlibVersionMixin.java
@@ -16,7 +16,6 @@
package com.android.sdklib.internal.repository.packages;
-import com.android.sdklib.internal.repository.XmlParserUtils;
import com.android.sdklib.repository.PkgProps;
import com.android.sdklib.repository.RepoConstants;
import com.android.util.Pair;
@@ -51,11 +50,12 @@ public class LayoutlibVersionMixin implements ILayoutlibVersion {
int api = LAYOUTLIB_API_NOT_SPECIFIED;
int rev = LAYOUTLIB_REV_NOT_SPECIFIED;
- Node layoutlibNode = XmlParserUtils.getFirstChild(pkgNode, RepoConstants.NODE_LAYOUT_LIB);
+ Node layoutlibNode =
+ PackageParserUtils.findChildElement(pkgNode, RepoConstants.NODE_LAYOUT_LIB);
if (layoutlibNode != null) {
- api = XmlParserUtils.getXmlInt(layoutlibNode, RepoConstants.NODE_API, 0);
- rev = XmlParserUtils.getXmlInt(layoutlibNode, RepoConstants.NODE_REVISION, 0);
+ api = PackageParserUtils.getXmlInt(layoutlibNode, RepoConstants.NODE_API, 0);
+ rev = PackageParserUtils.getXmlInt(layoutlibNode, RepoConstants.NODE_REVISION, 0);
}
mLayoutlibVersion = Pair.of(api, rev);
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/MajorRevisionPackage.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/MajorRevisionPackage.java
new file mode 100755
index 0000000..cbd6706
--- /dev/null
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/MajorRevisionPackage.java
@@ -0,0 +1,121 @@
+/*
+ * 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.
+ */
+
+package com.android.sdklib.internal.repository.packages;
+
+import com.android.sdklib.internal.repository.archives.Archive.Arch;
+import com.android.sdklib.internal.repository.archives.Archive.Os;
+import com.android.sdklib.internal.repository.sources.SdkSource;
+import com.android.sdklib.repository.PkgProps;
+import com.android.sdklib.repository.SdkRepoConstants;
+
+import org.w3c.dom.Node;
+
+import java.util.Map;
+import java.util.Properties;
+
+/**
+ * Represents a package in an SDK repository that has a {@link MajorRevision},
+ * which is a single major revision number (not minor, micro or previews).
+ */
+public abstract class MajorRevisionPackage extends Package {
+
+ private final MajorRevision mRevision;
+
+ /**
+ * Creates a new package from the attributes and elements of the given XML node.
+ * This constructor should throw an exception if the package cannot be created.
+ *
+ * @param source The {@link SdkSource} where this is loaded from.
+ * @param packageNode The XML element being parsed.
+ * @param nsUri The namespace URI of the originating XML document, to be able to deal with
+ * parameters that vary according to the originating XML schema.
+ * @param licenses The licenses loaded from the XML originating document.
+ */
+ MajorRevisionPackage(SdkSource source,
+ Node packageNode,
+ String nsUri,
+ Map<String,String> licenses) {
+ super(source, packageNode, nsUri, licenses);
+
+ mRevision = new MajorRevision(
+ PackageParserUtils.getXmlInt(packageNode, SdkRepoConstants.NODE_REVISION, 0));
+ }
+
+ /**
+ * Manually create a new package with one archive and the given attributes.
+ * This is used to create packages from local directories in which case there must be
+ * one archive which URL is the actual target location.
+ * <p/>
+ * Properties from props are used first when possible, e.g. if props is non null.
+ * <p/>
+ * By design, this creates a package with one and only one archive.
+ */
+ public MajorRevisionPackage(
+ SdkSource source,
+ Properties props,
+ int revision,
+ String license,
+ String description,
+ String descUrl,
+ Os archiveOs,
+ Arch archiveArch,
+ String archiveOsPath) {
+ super(source, props, revision, license, description, descUrl,
+ archiveOs, archiveArch, archiveOsPath);
+
+ mRevision = new MajorRevision(Integer.parseInt(
+ getProperty(props, PkgProps.PKG_MAJOR_REV, Integer.toString(revision))));
+ }
+
+ /**
+ * Returns the revision, an int > 0, for all packages (platform, add-on, tool, doc).
+ * Can be 0 if this is a local package of unknown revision.
+ */
+ @Override
+ public FullRevision getRevision() {
+ return mRevision;
+ }
+
+
+ @Override
+ public void saveProperties(Properties props) {
+ super.saveProperties(props);
+ props.setProperty(PkgProps.PKG_MAJOR_REV, Integer.toString(mRevision.getMajor()));
+ }
+
+ @Override
+ public UpdateInfo canBeUpdatedBy(Package replacementPackage) {
+ if (replacementPackage == null) {
+ return UpdateInfo.INCOMPATIBLE;
+ }
+
+ // check they are the same item.
+ if (!sameItemAs(replacementPackage)) {
+ return UpdateInfo.INCOMPATIBLE;
+ }
+
+ // check revision number
+ if (replacementPackage.getRevision().compareTo(this.getRevision()) > 0) {
+ return UpdateInfo.UPDATE;
+ }
+
+ // not an upgrade but not incompatible either.
+ return UpdateInfo.NOT_UPDATE;
+ }
+
+
+}
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 99602c8..05ac96a 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
@@ -16,7 +16,6 @@
package com.android.sdklib.internal.repository.packages;
-import com.android.sdklib.internal.repository.XmlParserUtils;
import com.android.sdklib.internal.repository.archives.Archive.Arch;
import com.android.sdklib.internal.repository.archives.Archive.Os;
import com.android.sdklib.internal.repository.sources.SdkSource;
@@ -31,7 +30,7 @@ import java.util.Properties;
/**
* Represents an XML node in an SDK repository that has a min-tools-rev requirement.
*/
-public abstract class MinToolsPackage extends Package implements IMinToolsDependency {
+public abstract class MinToolsPackage extends MajorRevisionPackage implements IMinToolsDependency {
/**
* The minimal revision of the tools package required by this extra package, if > 0,
@@ -52,7 +51,7 @@ public abstract class MinToolsPackage extends Package implements IMinToolsDepend
MinToolsPackage(SdkSource source, Node packageNode, String nsUri, Map<String,String> licenses) {
super(source, packageNode, nsUri, licenses);
- mMinToolsRevision = XmlParserUtils.getXmlInt(packageNode,
+ mMinToolsRevision = PackageParserUtils.getXmlInt(packageNode,
SdkRepoConstants.NODE_MIN_TOOLS_REV,
MIN_TOOLS_REV_NOT_SPECIFIED);
}
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/Package.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/Package.java
index 9c2d30b..ef85f7b 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/Package.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/Package.java
@@ -23,7 +23,6 @@ import com.android.sdklib.SdkConstants;
import com.android.sdklib.SdkManager;
import com.android.sdklib.internal.repository.IDescription;
import com.android.sdklib.internal.repository.ITaskMonitor;
-import com.android.sdklib.internal.repository.XmlParserUtils;
import com.android.sdklib.internal.repository.archives.Archive;
import com.android.sdklib.internal.repository.archives.Archive.Arch;
import com.android.sdklib.internal.repository.archives.Archive.Os;
@@ -58,7 +57,6 @@ import java.util.Properties;
*/
public abstract class Package implements IDescription, Comparable<Package> {
- private final MajorRevision mRevision;
private final String mObsolete;
private final String mLicense;
private final String mDescription;
@@ -104,18 +102,20 @@ public abstract class Package implements IDescription, Comparable<Package> {
*/
Package(SdkSource source, Node packageNode, String nsUri, Map<String,String> licenses) {
mSource = source;
- mRevision = new MajorRevision(
- XmlParserUtils.getXmlInt (packageNode, SdkRepoConstants.NODE_REVISION, 0));
- mDescription = XmlParserUtils.getXmlString(packageNode, SdkRepoConstants.NODE_DESCRIPTION);
- mDescUrl = XmlParserUtils.getXmlString(packageNode, SdkRepoConstants.NODE_DESC_URL);
- mReleaseNote = XmlParserUtils.getXmlString(packageNode, SdkRepoConstants.NODE_RELEASE_NOTE);
- mReleaseUrl = XmlParserUtils.getXmlString(packageNode, SdkRepoConstants.NODE_RELEASE_URL);
- mObsolete = XmlParserUtils.getOptionalXmlString(
- packageNode, SdkRepoConstants.NODE_OBSOLETE);
+ mDescription =
+ PackageParserUtils.getXmlString(packageNode, SdkRepoConstants.NODE_DESCRIPTION);
+ mDescUrl =
+ PackageParserUtils.getXmlString(packageNode, SdkRepoConstants.NODE_DESC_URL);
+ mReleaseNote =
+ PackageParserUtils.getXmlString(packageNode, SdkRepoConstants.NODE_RELEASE_NOTE);
+ mReleaseUrl =
+ PackageParserUtils.getXmlString(packageNode, SdkRepoConstants.NODE_RELEASE_URL);
+ mObsolete =
+ PackageParserUtils.getOptionalXmlString(packageNode, SdkRepoConstants.NODE_OBSOLETE);
mLicense = parseLicense(packageNode, licenses);
- mArchives = parseArchives(XmlParserUtils.getFirstChild(
- packageNode, SdkRepoConstants.NODE_ARCHIVES));
+ mArchives = parseArchives(
+ PackageParserUtils.findChildElement(packageNode, SdkRepoConstants.NODE_ARCHIVES));
}
/**
@@ -145,8 +145,6 @@ public abstract class Package implements IDescription, Comparable<Package> {
descUrl = "";
}
- mRevision = new MajorRevision(Integer.parseInt(
- getProperty(props, PkgProps.PKG_MAJOR_REV, Integer.toString(revision))));
mLicense = getProperty(props, PkgProps.PKG_LICENSE, license);
mDescription = getProperty(props, PkgProps.PKG_DESC, description);
mDescUrl = getProperty(props, PkgProps.PKG_DESC_URL, descUrl);
@@ -223,11 +221,9 @@ public abstract class Package implements IDescription, Comparable<Package> {
* These properties will later be give the constructor that takes a {@link Properties} object.
*/
public void saveProperties(Properties props) {
- props.setProperty(PkgProps.PKG_MAJOR_REV, Integer.toString(mRevision.getMajor()));
if (mLicense != null && mLicense.length() > 0) {
props.setProperty(PkgProps.PKG_LICENSE, mLicense);
}
-
if (mDescription != null && mDescription.length() > 0) {
props.setProperty(PkgProps.PKG_DESC, mDescription);
}
@@ -244,7 +240,6 @@ public abstract class Package implements IDescription, Comparable<Package> {
if (mObsolete != null) {
props.setProperty(PkgProps.PKG_OBSOLETE, mObsolete);
}
-
if (mSource != null) {
props.setProperty(PkgProps.PKG_SOURCE_URL, mSource.getUrl());
}
@@ -256,8 +251,8 @@ public abstract class Package implements IDescription, Comparable<Package> {
* license of this name defined.
*/
private String parseLicense(Node packageNode, Map<String, String> licenses) {
- Node usesLicense = XmlParserUtils.getFirstChild(
- packageNode, SdkRepoConstants.NODE_USES_LICENSE);
+ Node usesLicense =
+ PackageParserUtils.findChildElement(packageNode, SdkRepoConstants.NODE_USES_LICENSE);
if (usesLicense != null) {
Node ref = usesLicense.getAttributes().getNamedItem(SdkRepoConstants.ATTR_REF);
if (ref != null) {
@@ -298,13 +293,13 @@ public abstract class Package implements IDescription, Comparable<Package> {
private Archive parseArchive(Node archiveNode) {
Archive a = new Archive(
this,
- (Os) XmlParserUtils.getEnumAttribute(archiveNode, SdkRepoConstants.ATTR_OS,
- Os.values(), null),
- (Arch) XmlParserUtils.getEnumAttribute(archiveNode, SdkRepoConstants.ATTR_ARCH,
- Arch.values(), Arch.ANY),
- XmlParserUtils.getXmlString(archiveNode, SdkRepoConstants.NODE_URL),
- XmlParserUtils.getXmlLong (archiveNode, SdkRepoConstants.NODE_SIZE, 0),
- XmlParserUtils.getXmlString(archiveNode, SdkRepoConstants.NODE_CHECKSUM)
+ (Os) PackageParserUtils.getEnumAttribute(
+ archiveNode, SdkRepoConstants.ATTR_OS, Os.values(), null),
+ (Arch) PackageParserUtils.getEnumAttribute(
+ archiveNode, SdkRepoConstants.ATTR_ARCH, Arch.values(), Arch.ANY),
+ PackageParserUtils.getXmlString(archiveNode, SdkRepoConstants.NODE_URL),
+ PackageParserUtils.getXmlLong (archiveNode, SdkRepoConstants.NODE_SIZE, 0),
+ PackageParserUtils.getXmlString(archiveNode, SdkRepoConstants.NODE_CHECKSUM)
);
return a;
@@ -329,9 +324,7 @@ public abstract class Package implements IDescription, Comparable<Package> {
* Returns the revision, an int > 0, for all packages (platform, add-on, tool, doc).
* Can be 0 if this is a local package of unknown revision.
*/
- public FullRevision getRevision() {
- return mRevision;
- }
+ public abstract FullRevision getRevision();
/**
* Returns the optional description for all packages (platform, add-on, tool, doc) or
@@ -633,24 +626,7 @@ public abstract class Package implements IDescription, Comparable<Package> {
*
* @see #sameItemAs(Package)
*/
- public UpdateInfo canBeUpdatedBy(Package replacementPackage) {
- if (replacementPackage == null) {
- return UpdateInfo.INCOMPATIBLE;
- }
-
- // check they are the same item.
- if (!sameItemAs(replacementPackage)) {
- return UpdateInfo.INCOMPATIBLE;
- }
-
- // check revision number
- if (replacementPackage.getRevision().compareTo(this.getRevision()) > 0) {
- return UpdateInfo.UPDATE;
- }
-
- // not an upgrade but not incompatible either.
- return UpdateInfo.NOT_UPDATE;
- }
+ public abstract UpdateInfo canBeUpdatedBy(Package replacementPackage);
/**
* Returns an ordering <b>suitable for display</b> like this: <br/>
@@ -774,7 +750,7 @@ public abstract class Package implements IDescription, Comparable<Package> {
int result = 1;
result = prime * result + Arrays.hashCode(mArchives);
result = prime * result + ((mObsolete == null) ? 0 : mObsolete.hashCode());
- result = prime * result + mRevision.hashCode();
+ result = prime * result + getRevision().hashCode();
result = prime * result + ((mSource == null) ? 0 : mSource.hashCode());
return result;
}
@@ -801,7 +777,7 @@ public abstract class Package implements IDescription, Comparable<Package> {
} else if (!mObsolete.equals(other.mObsolete)) {
return false;
}
- if (!mRevision.equals(other.mRevision)) {
+ if (!getRevision().equals(other.getRevision())) {
return false;
}
if (mSource == null) {
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/XmlParserUtils.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/PackageParserUtils.java
index e4f2419..07f95e2 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/XmlParserUtils.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/PackageParserUtils.java
@@ -14,31 +14,31 @@
* limitations under the License.
*/
-package com.android.sdklib.internal.repository;
+package com.android.sdklib.internal.repository.packages;
import org.w3c.dom.Node;
/**
* Misc utilities to help extracting elements and attributes out of an XML document.
*/
-public class XmlParserUtils {
+public class PackageParserUtils {
/**
* Returns the first child element with the given XML local name.
* If xmlLocalName is null, returns the very first child element.
*/
- public static Node getFirstChild(Node node, String xmlLocalName) {
-
- String nsUri = node.getNamespaceURI();
- for(Node child = node.getFirstChild(); child != null; child = child.getNextSibling()) {
- if (child.getNodeType() == Node.ELEMENT_NODE &&
- nsUri.equals(child.getNamespaceURI())) {
- if (xmlLocalName == null || xmlLocalName.equals(child.getLocalName())) {
- return child;
+ public static Node findChildElement(Node node, String xmlLocalName) {
+ if (node != null) {
+ String nsUri = node.getNamespaceURI();
+ for(Node child = node.getFirstChild(); child != null; child = child.getNextSibling()) {
+ if (child.getNodeType() == Node.ELEMENT_NODE &&
+ nsUri.equals(child.getNamespaceURI())) {
+ if (xmlLocalName == null || xmlLocalName.equals(child.getLocalName())) {
+ return child;
+ }
}
}
}
-
return null;
}
@@ -56,7 +56,7 @@ public class XmlParserUtils {
* is missing or empty, so you can't tell the difference.
*/
public static String getXmlString(Node node, String xmlLocalName) {
- Node child = getFirstChild(node, xmlLocalName);
+ Node child = findChildElement(node, xmlLocalName);
return child == null ? "" : child.getTextContent(); //$NON-NLS-1$
}
@@ -75,7 +75,7 @@ public class XmlParserUtils {
* Returns an empty string whether the element is present but empty.
*/
public static String getOptionalXmlString(Node node, String xmlLocalName) {
- Node child = getFirstChild(node, xmlLocalName);
+ Node child = findChildElement(node, xmlLocalName);
return child == null ? null : child.getTextContent(); //$NON-NLS-1$
}
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/PlatformPackage.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/PlatformPackage.java
index 6efb620..9aaee66 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/PlatformPackage.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/PlatformPackage.java
@@ -24,7 +24,6 @@ import com.android.sdklib.IAndroidTarget;
import com.android.sdklib.SdkConstants;
import com.android.sdklib.SdkManager;
import com.android.sdklib.internal.repository.IDescription;
-import com.android.sdklib.internal.repository.XmlParserUtils;
import com.android.sdklib.internal.repository.archives.Archive.Arch;
import com.android.sdklib.internal.repository.archives.Archive.Os;
import com.android.sdklib.internal.repository.sources.SdkSource;
@@ -66,20 +65,27 @@ public class PlatformPackage extends MinToolsPackage
* parameters that vary according to the originating XML schema.
* @param licenses The licenses loaded from the XML originating document.
*/
- public PlatformPackage(SdkSource source, Node packageNode, String nsUri, Map<String,String> licenses) {
+ public PlatformPackage(
+ SdkSource source,
+ Node packageNode,
+ String nsUri,
+ Map<String,String> licenses) {
super(source, packageNode, nsUri, licenses);
- mVersionName = XmlParserUtils.getXmlString(packageNode, SdkRepoConstants.NODE_VERSION);
+ mVersionName =
+ PackageParserUtils.getXmlString(packageNode, SdkRepoConstants.NODE_VERSION);
- int apiLevel = XmlParserUtils.getXmlInt (packageNode, SdkRepoConstants.NODE_API_LEVEL, 0);
- String codeName = XmlParserUtils.getXmlString(packageNode, SdkRepoConstants.NODE_CODENAME);
+ int apiLevel =
+ PackageParserUtils.getXmlInt (packageNode, SdkRepoConstants.NODE_API_LEVEL, 0);
+ String codeName =
+ PackageParserUtils.getXmlString(packageNode, SdkRepoConstants.NODE_CODENAME);
if (codeName.length() == 0) {
codeName = null;
}
mVersion = new AndroidVersion(apiLevel, codeName);
- mIncludedAbi = XmlParserUtils.getOptionalXmlString(
- packageNode, SdkRepoConstants.NODE_ABI_INCLUDED);
+ mIncludedAbi = PackageParserUtils.getOptionalXmlString(packageNode,
+ SdkRepoConstants.NODE_ABI_INCLUDED);
mLayoutlibVersion = new LayoutlibVersionMixin(packageNode);
}
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/SamplePackage.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/SamplePackage.java
index 59d6adc..c2985cf 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/SamplePackage.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/SamplePackage.java
@@ -24,7 +24,6 @@ import com.android.sdklib.SdkConstants;
import com.android.sdklib.SdkManager;
import com.android.sdklib.internal.repository.IDescription;
import com.android.sdklib.internal.repository.ITaskMonitor;
-import com.android.sdklib.internal.repository.XmlParserUtils;
import com.android.sdklib.internal.repository.archives.Archive;
import com.android.sdklib.internal.repository.archives.Archive.Arch;
import com.android.sdklib.internal.repository.archives.Archive.Os;
@@ -77,15 +76,18 @@ public class SamplePackage extends MinToolsPackage
Map<String,String> licenses) {
super(source, packageNode, nsUri, licenses);
- int apiLevel = XmlParserUtils.getXmlInt (packageNode, SdkRepoConstants.NODE_API_LEVEL, 0);
- String codeName = XmlParserUtils.getXmlString(packageNode, SdkRepoConstants.NODE_CODENAME);
+ int apiLevel =
+ PackageParserUtils.getXmlInt (packageNode, SdkRepoConstants.NODE_API_LEVEL, 0);
+ String codeName =
+ PackageParserUtils.getXmlString(packageNode, SdkRepoConstants.NODE_CODENAME);
if (codeName.length() == 0) {
codeName = null;
}
mVersion = new AndroidVersion(apiLevel, codeName);
- mMinApiLevel = XmlParserUtils.getXmlInt(packageNode, SdkRepoConstants.NODE_MIN_API_LEVEL,
- MIN_API_LEVEL_NOT_SPECIFIED);
+ mMinApiLevel = PackageParserUtils.getXmlInt(packageNode,
+ SdkRepoConstants.NODE_MIN_API_LEVEL,
+ MIN_API_LEVEL_NOT_SPECIFIED);
}
/**
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/SourcePackage.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/SourcePackage.java
index fc4d8af..1ba2d13 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/SourcePackage.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/SourcePackage.java
@@ -25,7 +25,6 @@ import com.android.sdklib.SdkConstants;
import com.android.sdklib.SdkManager;
import com.android.sdklib.internal.repository.IDescription;
import com.android.sdklib.internal.repository.ITaskMonitor;
-import com.android.sdklib.internal.repository.XmlParserUtils;
import com.android.sdklib.internal.repository.archives.Archive;
import com.android.sdklib.internal.repository.archives.Archive.Arch;
import com.android.sdklib.internal.repository.archives.Archive.Os;
@@ -47,7 +46,7 @@ import java.util.Properties;
* However there is no mandatory dependency that limits installation so this does not
* implement {@link IPlatformDependency}.
*/
-public class SourcePackage extends Package implements IAndroidVersionProvider {
+public class SourcePackage extends MajorRevisionPackage implements IAndroidVersionProvider {
/** The package version, for platform, add-on and doc packages. */
private final AndroidVersion mVersion;
@@ -68,8 +67,10 @@ public class SourcePackage extends Package implements IAndroidVersionProvider {
Map<String,String> licenses) {
super(source, packageNode, nsUri, licenses);
- int apiLevel = XmlParserUtils.getXmlInt(packageNode, SdkRepoConstants.NODE_API_LEVEL, 0);
- String codeName = XmlParserUtils.getXmlString(packageNode, SdkRepoConstants.NODE_CODENAME);
+ int apiLevel =
+ PackageParserUtils.getXmlInt(packageNode, SdkRepoConstants.NODE_API_LEVEL, 0);
+ String codeName =
+ PackageParserUtils.getXmlString(packageNode, SdkRepoConstants.NODE_CODENAME);
if (codeName.length() == 0) {
codeName = null;
}
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/SystemImagePackage.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/SystemImagePackage.java
index 963b80e..b6bf501 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/SystemImagePackage.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/packages/SystemImagePackage.java
@@ -25,7 +25,6 @@ import com.android.sdklib.SdkConstants;
import com.android.sdklib.SdkManager;
import com.android.sdklib.SystemImage;
import com.android.sdklib.internal.repository.IDescription;
-import com.android.sdklib.internal.repository.XmlParserUtils;
import com.android.sdklib.internal.repository.archives.Archive.Arch;
import com.android.sdklib.internal.repository.archives.Archive.Os;
import com.android.sdklib.internal.repository.sources.SdkSource;
@@ -42,7 +41,7 @@ import java.util.Properties;
/**
* Represents a system-image XML node in an SDK repository.
*/
-public class SystemImagePackage extends Package
+public class SystemImagePackage extends MajorRevisionPackage
implements IAndroidVersionProvider, IPlatformDependency {
/** The package version, for platform, add-on and doc packages. */
@@ -67,14 +66,16 @@ public class SystemImagePackage extends Package
Map<String,String> licenses) {
super(source, packageNode, nsUri, licenses);
- int apiLevel = XmlParserUtils.getXmlInt(packageNode, SdkRepoConstants.NODE_API_LEVEL, 0);
- String codeName = XmlParserUtils.getXmlString(packageNode, SdkRepoConstants.NODE_CODENAME);
+ int apiLevel =
+ PackageParserUtils.getXmlInt(packageNode, SdkRepoConstants.NODE_API_LEVEL, 0);
+ String codeName =
+ PackageParserUtils.getXmlString(packageNode, SdkRepoConstants.NODE_CODENAME);
if (codeName.length() == 0) {
codeName = null;
}
mVersion = new AndroidVersion(apiLevel, codeName);
- mAbi = XmlParserUtils.getXmlString(packageNode, SdkRepoConstants.NODE_ABI);
+ mAbi = PackageParserUtils.getXmlString(packageNode, SdkRepoConstants.NODE_ABI);
}
@VisibleForTesting(visibility=Visibility.PRIVATE)
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 c34a3d0..7ccd617 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
@@ -22,7 +22,6 @@ import com.android.sdklib.SdkConstants;
import com.android.sdklib.SdkManager;
import com.android.sdklib.internal.repository.IDescription;
import com.android.sdklib.internal.repository.ITaskMonitor;
-import com.android.sdklib.internal.repository.XmlParserUtils;
import com.android.sdklib.internal.repository.archives.Archive;
import com.android.sdklib.internal.repository.archives.Archive.Arch;
import com.android.sdklib.internal.repository.archives.Archive.Os;
@@ -73,7 +72,7 @@ public class ToolPackage extends FullRevisionPackage implements IMinPlatformTool
Map<String,String> licenses) {
super(source, packageNode, nsUri, licenses);
- mMinPlatformToolsRevision = XmlParserUtils.getXmlInt(
+ mMinPlatformToolsRevision = PackageParserUtils.getXmlInt(
packageNode,
SdkRepoConstants.NODE_MIN_PLATFORM_TOOLS_REV,
MIN_PLATFORM_TOOLS_REV_INVALID);
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/sources/SdkRepoSource.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/sources/SdkRepoSource.java
index 07c3a86..482655f 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/sources/SdkRepoSource.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/sources/SdkRepoSource.java
@@ -20,7 +20,7 @@ import com.android.annotations.Nullable;
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.Package;
-import com.android.sdklib.internal.repository.XmlParserUtils;
+import com.android.sdklib.internal.repository.packages.PackageParserUtils;
import com.android.sdklib.repository.RepoConstants;
import com.android.sdklib.repository.SdkRepoConstants;
@@ -340,14 +340,14 @@ public class SdkRepoSource extends SdkSource {
prefix,
RepoConstants.NODE_ARCHIVE)) != null) {
try {
- Os os = (Os) XmlParserUtils.getEnumAttribute(archive,
- RepoConstants.ATTR_OS,
- Os.values(),
- null /*default*/);
- Arch arch = (Arch) XmlParserUtils.getEnumAttribute(archive,
- RepoConstants.ATTR_ARCH,
- Arch.values(),
- Arch.ANY);
+ Os os = (Os) PackageParserUtils.getEnumAttribute(archive,
+ RepoConstants.ATTR_OS,
+ Os.values(),
+ null /*default*/);
+ Arch arch = (Arch) PackageParserUtils.getEnumAttribute(archive,
+ RepoConstants.ATTR_ARCH,
+ Arch.values(),
+ Arch.ANY);
if (os == null || !os.isCompatible() ||
arch == null || !arch.isCompatible()) {
continue;
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 c1e5017..d3ca018 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
@@ -275,19 +275,9 @@
<xsd:documentation>An SDK tool package.</xsd:documentation>
</xsd:annotation>
<xsd:all>
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
- <!-- The minor revision, an int >= 0, incremented each time a new
- package is generated. Assumed to be 0 if missing. -->
- <xsd:element name="minor-rev" type="xsd:nonNegativeInteger" minOccurs="0" />
- <!-- The micro revision, an int >= 0, incremented each time a new
- package is generated. Assumed to be 0 if missing. -->
- <xsd:element name="micro-rev" 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" />
+ <!-- The full revision (major.minor.micro.preview), incremented each
+ time a new package is generated. -->
+ <xsd:element name="revision" type="sdk:revisionType" />
<!-- The optional license of this package. If present, users will have
to agree to it before downloading. -->
@@ -321,19 +311,9 @@
<xsd:documentation>An SDK platform-tool package.</xsd:documentation>
</xsd:annotation>
<xsd:all>
- <!-- The revision, an int > 0, incremented each time a new
- package is generated. -->
- <xsd:element name="revision" type="xsd:positiveInteger" />
- <!-- The minor revision, an int >= 0, incremented each time a new
- package is generated. Assumed to be 0 if missing. -->
- <xsd:element name="minor-rev" type="xsd:nonNegativeInteger" minOccurs="0" />
- <!-- The micro revision, an int >= 0, incremented each time a new
- package is generated. Assumed to be 0 if missing. -->
- <xsd:element name="micro-rev" 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" />
+ <!-- The full revision (major.minor.micro.preview), incremented each
+ time a new package is generated. -->
+ <xsd:element name="revision" type="sdk:revisionType" />
<!-- The optional license of this package. If present, users will have
to agree to it before downloading. -->
@@ -554,6 +534,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>
+
+
<!-- A collection of file paths available in an &lt;extra&gt; package
that can be installed in an Android project.
If present, the &lt;project-files&gt; collection must contain at least one path.
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/PkgProps.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/PkgProps.java
index 5b39e89..4406b42 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/PkgProps.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/PkgProps.java
@@ -29,7 +29,6 @@ package com.android.sdklib.repository;
public class PkgProps {
// Base Package
- public static final String PKG_MAJOR_REV = "Pkg.Revision"; //$NON-NLS-1$
public static final String PKG_LICENSE = "Pkg.License"; //$NON-NLS-1$
public static final String PKG_DESC = "Pkg.Desc"; //$NON-NLS-1$
public static final String PKG_DESC_URL = "Pkg.DescUrl"; //$NON-NLS-1$
@@ -39,7 +38,8 @@ public class PkgProps {
public static final String PKG_OBSOLETE = "Pkg.Obsolete"; //$NON-NLS-1$
// FullRevision
-
+ // Note that MajorRev keeps the legacy "Pkg.Revision" property name for legacy compatibility.
+ public static final String PKG_MAJOR_REV = "Pkg.Revision"; //$NON-NLS-1$
public static final String PKG_MINOR_REV = "Pkg.MinorRev"; //$NON-NLS-1$
public static final String PKG_MICRO_REV = "Pkg.MicroRev"; //$NON-NLS-1$
public static final String PKG_PREVIEW_REV = "Pkg.PreviewRev"; //$NON-NLS-1$
diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/SdkRepoConstants.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/SdkRepoConstants.java
index 9f4077f..5ad6285 100755
--- a/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/SdkRepoConstants.java
+++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/SdkRepoConstants.java
@@ -80,14 +80,19 @@ public class SdkRepoConstants extends RepoConstants {
/** The root sdk-repository element */
public static final String NODE_SDK_REPOSITORY = "sdk-repository"; //$NON-NLS-1$
+ /* The major revision for tool and platform-tool package
+ * (the full revision number is revision.minor.micro + preview#.)
+ * Mandatory int > 0. 0 when missing, which should not happen in
+ * a valid document. */
+ public static final String NODE_MAJOR_REV = "major"; //$NON-NLS-1$
/* The minor revision for tool and platform-tool package
* (the full revision number is revision.minor.micro + preview#.)
* Optional int >= 0. Implied to be 0 when missing. */
- public static final String NODE_MINOR_REV = "minor-rev"; //$NON-NLS-1$
+ public static final String NODE_MINOR_REV = "minor"; //$NON-NLS-1$
/* The micro revision for tool and platform-tool package
* (the full revision number is revision.minor.micro + preview#.)
* Optional int >= 0. Implied to be 0 when missing. */
- public static final String NODE_MICRO_REV = "micro-rev"; //$NON-NLS-1$
+ public static final String NODE_MICRO_REV = "micro"; //$NON-NLS-1$
/* The preview revision for tool and platform-tool package.
* Int > 0, only present for "preview / release candidate" packages. */
public static final String NODE_PREVIEW = "preview"; //$NON-NLS-1$
diff --git a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/FullRevisionPackageTest.java b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/FullRevisionPackageTest.java
index 63e1d05..d816256 100755
--- a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/FullRevisionPackageTest.java
+++ b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/FullRevisionPackageTest.java
@@ -16,14 +16,36 @@
package com.android.sdklib.internal.repository.packages;
+import com.android.sdklib.repository.PkgProps;
+
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
+import java.util.Properties;
import junit.framework.TestCase;
public class FullRevisionPackageTest extends TestCase {
+ /**
+ * Helper that creates the {@link Properties} from a {@link FullRevision}
+ * as expected by {@link FullRevisionPackage}.
+ */
+ public static Properties createProps(FullRevision revision) {
+ Properties props = new Properties();
+ if (revision != null) {
+ props.setProperty(PkgProps.PKG_MAJOR_REV,
+ Integer.toString(revision.getMajor()));
+ props.setProperty(PkgProps.PKG_MINOR_REV,
+ Integer.toString(revision.getMinor()));
+ props.setProperty(PkgProps.PKG_MICRO_REV,
+ Integer.toString(revision.getMicro()));
+ props.setProperty(PkgProps.PKG_PREVIEW_REV,
+ Integer.toString(revision.getPreview()));
+ }
+ return props;
+ }
+
public void testCompareTo() throws Exception {
// Test order of full revision packages.
//
diff --git a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/MockEmptyPackage.java b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/MockEmptyPackage.java
index 5c7bfe3..70f57b4 100755
--- a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/MockEmptyPackage.java
+++ b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/MockEmptyPackage.java
@@ -30,7 +30,7 @@ import java.util.Properties;
* A mock empty package, of no particular subpackage type.
* {@link #sameItemAs(Package)} will return true if these packages have the same handle.
*/
-public class MockEmptyPackage extends Package {
+public class MockEmptyPackage extends MajorRevisionPackage {
private final String mTestHandle;
/**
diff --git a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/MockPlatformToolPackage.java b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/MockPlatformToolPackage.java
index 7ed5114..e896de6 100755
--- a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/MockPlatformToolPackage.java
+++ b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/MockPlatformToolPackage.java
@@ -18,11 +18,7 @@ package com.android.sdklib.internal.repository.packages;
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.PlatformToolPackage;
import com.android.sdklib.internal.repository.sources.SdkSource;
-import com.android.sdklib.repository.PkgProps;
-
-import java.util.Properties;
/**
* A mock {@link PlatformToolPackage} for testing.
@@ -70,7 +66,7 @@ public class MockPlatformToolPackage extends PlatformToolPackage {
public MockPlatformToolPackage(SdkSource source, FullRevision revision) {
super(
source, // source,
- createProps(revision), // props,
+ FullRevisionPackageTest.createProps(revision), // props,
revision.getMajor(),
null, // license,
"desc", // description,
@@ -80,16 +76,5 @@ public class MockPlatformToolPackage extends PlatformToolPackage {
"foo" // archiveOsPath
);
}
-
- private static Properties createProps(FullRevision revision) {
- Properties props = new Properties();
- props.setProperty(PkgProps.PKG_MINOR_REV,
- Integer.toString(revision.getMinor()));
- props.setProperty(PkgProps.PKG_MICRO_REV,
- Integer.toString(revision.getMicro()));
- props.setProperty(PkgProps.PKG_PREVIEW_REV,
- Integer.toString(revision.getPreview()));
- return props;
- }
}
diff --git a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/MockToolPackage.java b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/MockToolPackage.java
index cdccbb8..155946c 100755
--- a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/MockToolPackage.java
+++ b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/MockToolPackage.java
@@ -85,17 +85,9 @@ public class MockToolPackage extends ToolPackage {
}
private static Properties createProps(FullRevision revision, int minPlatformToolsRev) {
- Properties props = new Properties();
+ Properties props = FullRevisionPackageTest.createProps(revision);
props.setProperty(PkgProps.MIN_PLATFORM_TOOLS_REV,
Integer.toString((minPlatformToolsRev)));
- if (revision != null) {
- props.setProperty(PkgProps.PKG_MINOR_REV,
- Integer.toString(revision.getMinor()));
- props.setProperty(PkgProps.PKG_MICRO_REV,
- Integer.toString(revision.getMicro()));
- props.setProperty(PkgProps.PKG_PREVIEW_REV,
- Integer.toString(revision.getPreview()));
- }
return props;
}
}
diff --git a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/PackageTest.java b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/PackageTest.java
index cfe70c1..4e8ee2e 100755
--- a/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/PackageTest.java
+++ b/sdkmanager/libs/sdklib/tests/src/com/android/sdklib/internal/repository/packages/PackageTest.java
@@ -39,7 +39,7 @@ public class PackageTest extends TestCase {
protected static final String LOCAL_ARCHIVE_PATH = "/local/archive/path";
/** Local class used to test the abstract Package class */
- protected static class MockPackage extends Package {
+ protected static class MockPackage extends MajorRevisionPackage {
public MockPackage(
SdkSource source,
Properties props,
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 8bf39e1..072cc10 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
@@ -209,7 +209,7 @@ public class SdkRepoSourceTest extends TestCase {
/**
* Validate we can still load an old repository in schema version 1
*/
- public void testLoadOldXml_1() throws Exception {
+ public void testLoadXml_1() throws Exception {
InputStream xmlStream = getTestResource(
"/com/android/sdklib/testdata/repository_sample_1.xml");
@@ -287,7 +287,7 @@ public class SdkRepoSourceTest extends TestCase {
/**
* Validate we can still load an old repository in schema version 2
*/
- public void testLoadOldXml_2() throws Exception {
+ public void testLoadXml_2() throws Exception {
InputStream xmlStream = getTestResource(
"/com/android/sdklib/testdata/repository_sample_2.xml");
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 345b35e..e36b204 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
@@ -302,7 +302,7 @@ public class ValidateRepositoryXmlTest extends TestCase {
String document = "<?xml version=\"1.0\"?>" +
OPEN_TAG_REPO +
"<r:license id=\"lic1\"> some license </r:license> " +
- "<r:tool> <r:uses-license ref=\"lic2\" /> <r:revision>1</r:revision> " +
+ "<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: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>" +
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 1232f1d..1f4d259 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
@@ -186,10 +186,12 @@
</sdk:platform>
<sdk:tool>
- <sdk:revision>1</sdk:revision>
- <sdk:minor-rev>2</sdk:minor-rev>
- <sdk:micro-rev>3</sdk:micro-rev>
- <sdk:preview>4</sdk:preview>
+ <sdk:revision>
+ <sdk:major>1</sdk:major>
+ <sdk:minor>2</sdk:minor>
+ <sdk:micro>3</sdk:micro>
+ <sdk:preview>4</sdk:preview>
+ </sdk:revision>
<sdk:description>Some optional description</sdk:description>
<sdk:desc-url>http://www.example.com/tools.html</sdk:desc-url>
<sdk:uses-license ref="license1" />
@@ -227,7 +229,9 @@
</sdk:doc>
<sdk:tool>
- <sdk:revision>42</sdk:revision>
+ <sdk:revision>
+ <sdk:major>42</sdk:major>
+ </sdk:revision>
<sdk:uses-license ref="license1" />
<sdk:min-platform-tools-rev>3</sdk:min-platform-tools-rev>
<sdk:archives>
@@ -250,10 +254,12 @@
</sdk:tool>
<sdk:platform-tool>
- <sdk:revision>3</sdk:revision>
- <sdk:minor-rev>0</sdk:minor-rev>
- <sdk:micro-rev>0</sdk:micro-rev>
- <sdk:preview>5</sdk:preview>
+ <sdk:revision>
+ <sdk:major>3</sdk:major>
+ <sdk:minor>0</sdk:minor>
+ <sdk:micro>0</sdk:micro>
+ <sdk:preview>5</sdk:preview>
+ </sdk:revision>
<sdk:uses-license ref="license1" />
<sdk:archives>
<sdk:archive os="windows">