From c16116d587c9a5487b9d61250cc7bbe46ebfbd39 Mon Sep 17 00:00:00 2001 From: Raphael Moll Date: Mon, 11 Oct 2010 10:04:12 -0700 Subject: [PATCH] SDK Manager: simplify getenv var to override URLs. SDK_TEST_URLS is a semicolon-separated list of URLs that can be used to seed the SDK Updater list. This is only meant as a debugging and QA testing tool and not for user usage. To be used, the URLs must either end with the / or end with the canonical filename expected for an addon list, addon repo or full repo. This lets QA use URLs ending with / to cover all cases. Change-Id: Ia7232d5d8a5b6e85d98e735b93a969e42624e919 --- .../sdklib/internal/repository/SdkAddonSource.java | 2 +- .../sdklib/internal/repository/SdkRepoSource.java | 2 +- .../sdklib/internal/repository/SdkSource.java | 4 +- .../sdklib/repository/SdkAddonConstants.java | 2 +- .../sdklib/repository/SdkAddonsListConstants.java | 3 + .../sdklib/repository/SdkRepoConstants.java | 2 +- .../internal/repository/SdkAddonSourceTest.java | 2 +- .../internal/repository/SdkRepoSourceTest.java | 4 +- .../sdkuilib/internal/repository/UpdaterData.java | 111 ++++++++++++++------- 9 files changed, 85 insertions(+), 47 deletions(-) diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SdkAddonSource.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SdkAddonSource.java index 78dfd696a..049dad880 100755 --- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SdkAddonSource.java +++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SdkAddonSource.java @@ -51,7 +51,7 @@ public class SdkAddonSource extends SdkSource { @Override protected String getUrlDefaultXmlFile() { - return SdkAddonConstants.URL_DEFAULT_XML_FILE; + return SdkAddonConstants.URL_DEFAULT_FILENAME; } @Override diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SdkRepoSource.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SdkRepoSource.java index 85838aa35..9b63be320 100755 --- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SdkRepoSource.java +++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SdkRepoSource.java @@ -64,7 +64,7 @@ public class SdkRepoSource extends SdkSource { @Override protected String getUrlDefaultXmlFile() { - return SdkRepoConstants.URL_DEFAULT_XML_FILE; + return SdkRepoConstants.URL_DEFAULT_FILENAME; } @Override diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SdkSource.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SdkSource.java index 7c19fabac..cee7fd681 100755 --- a/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SdkSource.java +++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/internal/repository/SdkSource.java @@ -286,7 +286,7 @@ public abstract class SdkSource implements IDescription { } else if (version < 1 && tryOtherUrl == 0 && !usingAlternateUrl) { // This is obviously not one of our documents. mFetchError = String.format( - "Failed to find an XML for the repository at URL '%1$s'", + "Failed to validate the XML for the repository at URL '%1$s'", url); // If we haven't already tried the alternate URL, let's do it now. @@ -310,7 +310,7 @@ public abstract class SdkSource implements IDescription { // The alternate URL is obviously not a valid XML either. // We only report the error if we failed to produce one earlier. mFetchError = String.format( - "Failed to find an XML for the repository at URL '%1$s'", + "Failed to validate the XML for the repository at URL '%1$s'", url); } 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 707fe01cc..fa752615f 100755 --- a/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/SdkAddonConstants.java +++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/SdkAddonConstants.java @@ -28,7 +28,7 @@ public class SdkAddonConstants extends RepoConstants { /** The default name looked for by {@link SdkSource} when trying to load an * sdk-addon XML if the URL doesn't match an existing resource. */ - public static final String URL_DEFAULT_XML_FILE = "addon.xml"; //$NON-NLS-1$ + public static final String URL_DEFAULT_FILENAME = "addon.xml"; //$NON-NLS-1$ /** The base of our sdk-addon XML namespace. */ private static final String NS_BASE = diff --git a/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/SdkAddonsListConstants.java b/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/SdkAddonsListConstants.java index 1793f1f73..f8ed18149 100755 --- a/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/SdkAddonsListConstants.java +++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/SdkAddonsListConstants.java @@ -28,6 +28,9 @@ public class SdkAddonsListConstants { public static final String URL_ADDON_LIST = "https://dl-ssl.google.com/android/repository/addons_list.xml"; //$NON-NLS-1$ + /** The canonical URL filename for addons-list XML files. */ + public static final String URL_DEFAULT_FILENAME = "addons_list.xml"; //$NON-NLS-1$ + /** The base of our sdk-addons-list XML namespace. */ private static final String NS_BASE = "http://schemas.android.com/sdk/android/addons-list/"; //$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 626f6d901..f08aa2134 100755 --- a/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/SdkRepoConstants.java +++ b/sdkmanager/libs/sdklib/src/com/android/sdklib/repository/SdkRepoConstants.java @@ -32,7 +32,7 @@ public class SdkRepoConstants extends RepoConstants { /** The default name looked for by {@link SdkSource} when trying to load an * sdk-repository XML if the URL doesn't match an existing resource. */ - public static final String URL_DEFAULT_XML_FILE = "repository.xml"; //$NON-NLS-1$ + public static final String URL_DEFAULT_FILENAME = "repository.xml"; //$NON-NLS-1$ /** The base of our sdk-repository XML namespace. */ private static final String NS_BASE = diff --git a/sdkmanager/libs/sdklib/tests/com/android/sdklib/internal/repository/SdkAddonSourceTest.java b/sdkmanager/libs/sdklib/tests/com/android/sdklib/internal/repository/SdkAddonSourceTest.java index 5b2a3ab0f..d05c967f9 100755 --- a/sdkmanager/libs/sdklib/tests/com/android/sdklib/internal/repository/SdkAddonSourceTest.java +++ b/sdkmanager/libs/sdklib/tests/com/android/sdklib/internal/repository/SdkAddonSourceTest.java @@ -151,7 +151,7 @@ public class SdkAddonSourceTest extends TestCase { Boolean[] validatorFound = new Boolean[] { Boolean.FALSE }; String[] validationError = new String[] { null }; - String url = "not-a-valid-url://" + SdkAddonConstants.URL_DEFAULT_XML_FILE; + String url = "not-a-valid-url://" + SdkAddonConstants.URL_DEFAULT_FILENAME; String uri = mSource._validateXml(xmlStream, url, version, validationError, validatorFound); assertEquals(Boolean.TRUE, validatorFound[0]); diff --git a/sdkmanager/libs/sdklib/tests/com/android/sdklib/internal/repository/SdkRepoSourceTest.java b/sdkmanager/libs/sdklib/tests/com/android/sdklib/internal/repository/SdkRepoSourceTest.java index 2bbbd8ccc..c6d6eb3dd 100755 --- a/sdkmanager/libs/sdklib/tests/com/android/sdklib/internal/repository/SdkRepoSourceTest.java +++ b/sdkmanager/libs/sdklib/tests/com/android/sdklib/internal/repository/SdkRepoSourceTest.java @@ -169,7 +169,7 @@ public class SdkRepoSourceTest extends TestCase { Boolean[] validatorFound = new Boolean[] { Boolean.FALSE }; String[] validationError = new String[] { null }; - String url = "not-a-valid-url://" + SdkRepoConstants.URL_DEFAULT_XML_FILE; + String url = "not-a-valid-url://" + SdkRepoConstants.URL_DEFAULT_FILENAME; String uri = mSource._validateXml(xmlStream, url, version, validationError, validatorFound); assertEquals(Boolean.TRUE, validatorFound[0]); @@ -220,7 +220,7 @@ public class SdkRepoSourceTest extends TestCase { Boolean[] validatorFound = new Boolean[] { Boolean.FALSE }; String[] validationError = new String[] { null }; - String url = "not-a-valid-url://" + SdkRepoConstants.URL_DEFAULT_XML_FILE; + String url = "not-a-valid-url://" + SdkRepoConstants.URL_DEFAULT_FILENAME; String uri = mSource._validateXml(xmlStream, url, version, validationError, validatorFound); assertEquals(Boolean.TRUE, validatorFound[0]); diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterData.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterData.java index 8c77e3ac1..744bb8dd3 100755 --- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterData.java +++ b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterData.java @@ -36,6 +36,7 @@ import com.android.sdklib.internal.repository.SdkSourceCategory; import com.android.sdklib.internal.repository.SdkSources; import com.android.sdklib.internal.repository.ToolPackage; import com.android.sdklib.internal.repository.AddonsListFetcher.Site; +import com.android.sdklib.repository.SdkAddonConstants; import com.android.sdklib.repository.SdkAddonsListConstants; import com.android.sdklib.repository.SdkRepoConstants; import com.android.sdkuilib.internal.repository.icons.ImageFactory; @@ -305,32 +306,41 @@ class UpdaterData { // Load user sources sources.loadUserAddons(getSdkLog()); - // SDK_UPDATER_URLS is a semicolon-separated list of URLs that can be used to - // seed the SDK Updater list for full repositories. - String str = System.getenv("SDK_UPDATER_URLS"); + // SDK_TEST_URLS is a semicolon-separated list of URLs that can be used to + // seed the SDK Updater list for full repos and addon repositories. This is + // only meant as a debugging and QA testing tool and not for user usage. + // + // To be used, the URLs must either end with the / or end with the canonical + // filename expected for either a full repo or an add-on repo. This lets QA + // use URLs ending with / to cover all cases. + String str = System.getenv("SDK_TEST_URLS"); if (str != null) { String[] urls = str.split(";"); for (String url : urls) { - if (url != null && url.length() > 0) { - SdkSource s = new SdkRepoSource(url, null/*uiName*/); - if (!sources.hasSourceUrl(s)) { - sources.add(SdkSourceCategory.GETENV_REPOS, s); + if (url != null) { + url = url.trim(); + if (url.endsWith("/") || url.endsWith(SdkRepoConstants.URL_DEFAULT_FILENAME)) { + String fullUrl = url; + if (fullUrl.endsWith("/")) { + fullUrl += SdkRepoConstants.URL_DEFAULT_FILENAME; + } + + SdkSource s = new SdkRepoSource(fullUrl, null/*uiName*/); + if (!sources.hasSourceUrl(s)) { + sources.add(SdkSourceCategory.GETENV_REPOS, s); + } } - } - } - } - // SDK_UPDATER_USER_URLS is a semicolon-separated list of URLs that can be used to - // seed the SDK Updater list for user-only repositories. User sources can only provide - // add-ons and extra packages. - str = System.getenv("SDK_UPDATER_USER_URLS"); - if (str != null) { - String[] urls = str.split(";"); - for (String url : urls) { - if (url != null && url.length() > 0) { - SdkSource s = new SdkAddonSource(url, null/*uiName*/); - if (!sources.hasSourceUrl(s)) { - sources.add(SdkSourceCategory.GETENV_ADDONS, s); + if (url.endsWith("/") || url.endsWith(SdkAddonConstants.URL_DEFAULT_FILENAME)) { + String fullUrl = url; + if (fullUrl.endsWith("/")) { + fullUrl += SdkAddonConstants.URL_DEFAULT_FILENAME; + } + + SdkSource s = new SdkAddonSource(fullUrl, null/*uiName*/); + if (!sources.hasSourceUrl(s)) { + sources.add(SdkSourceCategory.GETENV_ADDONS, s); + } } } } @@ -832,30 +842,55 @@ class UpdaterData { private void loadRemoteAddonsListInTask(ITaskMonitor monitor) { mStateFetchRemoteAddonsList = -1; - /* - * This env var can be defined to override the default addons_list.xml - * location, useful for debugging. - */ - String url = System.getenv("SDK_UPDATER_ADDONS_LIST"); + // SDK_TEST_URLS is a semicolon-separated list of URLs that can be used to + // seed the SDK Updater list. This is only meant as a debugging and QA testing + // tool and not for user usage. + // + // To be used, the URLs must either end with the / or end with the canonical + // filename expected for an addon list. This lets QA use URLs ending with / + // to cover all cases. + // + // Since SDK_TEST_URLS can contain many such URLs, we take the first one that + // matches our criteria. + String url = System.getenv("SDK_TEST_URLS"); if (url == null) { + // No override, use the canonical URL. url = SdkAddonsListConstants.URL_ADDON_LIST; - } - if (getSettingsController().getForceHttp()) { - url = url.replaceAll("https://", "http://"); //$NON-NLS-1$ //$NON-NLS-2$ + } else { + String[] urls = url.split(";"); + url = null; + for (String u : urls) { + u = u.trim(); + // This is an URL that comes from the env var. We expect it to either + // end with a / or the canonical name, otherwise we don't use it. + if (u.endsWith("/")) { + url = u + SdkAddonsListConstants.URL_DEFAULT_FILENAME; + break; + } else if (u.endsWith(SdkAddonsListConstants.URL_DEFAULT_FILENAME)) { + url = u; + break; + } + } } - AddonsListFetcher fetcher = new AddonsListFetcher(); - Site[] sites = fetcher.fetch(monitor, url); - if (sites != null) { - mSources.removeAll(SdkSourceCategory.ADDONS_3RD_PARTY); - - for (Site s : sites) { - mSources.add(SdkSourceCategory.ADDONS_3RD_PARTY, - new SdkAddonSource(s.getUrl(), s.getUiName())); + if (url != null) { + if (getSettingsController().getForceHttp()) { + url = url.replaceAll("https://", "http://"); //$NON-NLS-1$ //$NON-NLS-2$ } - mStateFetchRemoteAddonsList = 1; + AddonsListFetcher fetcher = new AddonsListFetcher(); + Site[] sites = fetcher.fetch(monitor, url); + if (sites != null) { + mSources.removeAll(SdkSourceCategory.ADDONS_3RD_PARTY); + + for (Site s : sites) { + mSources.add(SdkSourceCategory.ADDONS_3RD_PARTY, + new SdkAddonSource(s.getUrl(), s.getUiName())); + } + + mStateFetchRemoteAddonsList = 1; + } } } -- 2.11.0