aboutsummaryrefslogtreecommitdiffstats
path: root/sdkmanager/libs/sdkuilib
diff options
context:
space:
mode:
authorRaphael Moll <ralf@android.com>2012-04-12 14:41:25 -0700
committerRaphael Moll <ralf@android.com>2012-04-16 15:04:14 -0700
commitaf832e8eeb4eb7e24a292ed912ce8eb7cc2a8233 (patch)
treeb28f218a8a409dbee35786ea68df82ee9eea3068 /sdkmanager/libs/sdkuilib
parent72d16d222e7205cab473d01f483c534747c9026b (diff)
downloadsdk-af832e8eeb4eb7e24a292ed912ce8eb7cc2a8233.zip
sdk-af832e8eeb4eb7e24a292ed912ce8eb7cc2a8233.tar.gz
sdk-af832e8eeb4eb7e24a292ed912ce8eb7cc2a8233.tar.bz2
SDK: primitive implementation of download cache.
It supports: - A local binary cache + a few http headers are saved - If ETag is present, generates a GET with If-None-Match - If Last-Modified is present, generates a GET with If-Modified-Since - Ability to configure the cache to be direct (don't cache), or serve without checkout or serve with a server check. - Doesn't check cached files if newer than 10 minutes. - For servers with no ETag/LastModified support, check files every 4 hours (no pref to change this yet.) Change-Id: I515e77291fb6810453e82e73f6508cfc60b2f422
Diffstat (limited to 'sdkmanager/libs/sdkuilib')
-rwxr-xr-xsdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/IPageListener.java30
-rwxr-xr-xsdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/IUpdaterData.java3
-rwxr-xr-xsdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/SdkUpdaterLogic.java2
-rwxr-xr-xsdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/UpdaterData.java22
-rwxr-xr-xsdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/sdkman2/PackageLoader.java23
-rwxr-xr-xsdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/sdkman2/PackagesPage.java22
-rwxr-xr-xsdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/sdkman2/SdkUpdaterWindowImpl2.java2
-rwxr-xr-xsdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/MockUpdaterData.java25
-rwxr-xr-xsdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/UpdaterLogicTest.java6
9 files changed, 79 insertions, 56 deletions
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/IPageListener.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/IPageListener.java
deleted file mode 100755
index 8988bb5..0000000
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/IPageListener.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2011 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.sdkuilib.internal.repository;
-
-
-
-/**
- * Interface for lifecycle events of pages.
- */
-public interface IPageListener {
-
- /**
- * The page was just selected and brought to front.
- */
- public void onPageSelected();
-}
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/IUpdaterData.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/IUpdaterData.java
index 8ec6596..26c52d5 100755
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/IUpdaterData.java
+++ b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/IUpdaterData.java
@@ -20,6 +20,7 @@ import com.android.sdklib.ISdkLog;
import com.android.sdklib.SdkManager;
import com.android.sdklib.internal.avd.AvdManager;
import com.android.sdklib.internal.repository.ITaskFactory;
+import com.android.sdklib.internal.repository.DownloadCache;
import com.android.sdkuilib.internal.repository.icons.ImageFactory;
import org.eclipse.swt.widgets.Shell;
@@ -35,6 +36,8 @@ interface IUpdaterData {
public abstract ISdkLog getSdkLog();
+ public abstract DownloadCache getDownloadCache();
+
public abstract ImageFactory getImageFactory();
public abstract SdkManager getSdkManager();
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/SdkUpdaterLogic.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/SdkUpdaterLogic.java
index 4f35b26..0d9b10a 100755
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/SdkUpdaterLogic.java
+++ b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/SdkUpdaterLogic.java
@@ -1276,7 +1276,7 @@ class SdkUpdaterLogic {
Package[] pkgs = remoteSrc.getPackages();
if (pkgs == null) {
- remoteSrc.load(monitor, forceHttp);
+ remoteSrc.load(mUpdaterData.getDownloadCache(), monitor, forceHttp);
pkgs = remoteSrc.getPackages();
}
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 dd51a59..0def6fa 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
@@ -29,6 +29,7 @@ import com.android.sdklib.internal.repository.AddonsListFetcher;
import com.android.sdklib.internal.repository.AddonsListFetcher.Site;
import com.android.sdklib.internal.repository.Archive;
import com.android.sdklib.internal.repository.ArchiveInstaller;
+import com.android.sdklib.internal.repository.DownloadCache;
import com.android.sdklib.internal.repository.ITask;
import com.android.sdklib.internal.repository.ITaskFactory;
import com.android.sdklib.internal.repository.ITaskMonitor;
@@ -83,18 +84,13 @@ public class UpdaterData implements IUpdaterData {
private SdkManager mSdkManager;
private AvdManager mAvdManager;
-
+ private DownloadCache mDownloadCache; // lazily created in getDownloadCache
private final LocalSdkParser mLocalSdkParser = new LocalSdkParser();
private final SdkSources mSources = new SdkSources();
-
private ImageFactory mImageFactory;
-
private final SettingsController mSettingsController;
-
private final ArrayList<ISdkChangeListener> mListeners = new ArrayList<ISdkChangeListener>();
-
private Shell mWindowShell;
-
private AndroidLocationException mAvdManagerInitError;
/**
@@ -115,6 +111,7 @@ public class UpdaterData implements IUpdaterData {
mOsSdkRoot = osSdkRoot;
mSdkLog = sdkLog;
+ mDownloadCache = getDownloadCache();
mSettingsController = new SettingsController(this);
initSdk();
@@ -126,6 +123,14 @@ public class UpdaterData implements IUpdaterData {
return mOsSdkRoot;
}
+ @Override
+ public DownloadCache getDownloadCache() {
+ if (mDownloadCache == null) {
+ mDownloadCache = new DownloadCache(DownloadCache.Strategy.FRESH_CACHE);
+ }
+ return mDownloadCache;
+ }
+
public void setTaskFactory(ITaskFactory taskFactory) {
mTaskFactory = taskFactory;
}
@@ -441,6 +446,7 @@ public class UpdaterData implements IUpdaterData {
mOsSdkRoot,
forceHttp,
mSdkManager,
+ mDownloadCache,
monitor)) {
// We installed this archive.
newlyInstalledArchives.add(archive);
@@ -1003,7 +1009,7 @@ public class UpdaterData implements IUpdaterData {
if (forceFetching ||
source.getPackages() != null ||
source.getFetchError() != null) {
- source.load(monitor.createSubMonitor(1), forceHttp);
+ source.load(mDownloadCache, monitor.createSubMonitor(1), forceHttp);
}
monitor.incProgress(1);
}
@@ -1053,7 +1059,7 @@ public class UpdaterData implements IUpdaterData {
boolean fetch3rdParties = System.getenv("SDK_SKIP_3RD_PARTIES") == null;
AddonsListFetcher fetcher = new AddonsListFetcher();
- Site[] sites = fetcher.fetch(monitor, url);
+ Site[] sites = fetcher.fetch(url, mDownloadCache, monitor);
if (sites != null) {
mSources.removeAll(SdkSourceCategory.ADDONS_3RD_PARTY);
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/sdkman2/PackageLoader.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/sdkman2/PackageLoader.java
index af7ce2c..ad9a2a2 100755
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/sdkman2/PackageLoader.java
+++ b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/sdkman2/PackageLoader.java
@@ -17,6 +17,7 @@
package com.android.sdkuilib.internal.repository.sdkman2;
import com.android.sdklib.internal.repository.Archive;
+import com.android.sdklib.internal.repository.DownloadCache;
import com.android.sdklib.internal.repository.ITask;
import com.android.sdklib.internal.repository.ITaskMonitor;
import com.android.sdklib.internal.repository.NullTaskMonitor;
@@ -44,7 +45,7 @@ class PackageLoader {
/**
* Interface for the callback called by
- * {@link PackageLoader#loadPackages(ISourceLoadedCallback)}.
+ * {@link PackageLoader#loadPackages(DownloadCache, ISourceLoadedCallback)}.
* <p/>
* After processing each source, the package loader calls {@link #onUpdateSource}
* with the list of packages found in that source.
@@ -144,12 +145,20 @@ class PackageLoader {
* after each source is finished loaded. In return the callback tells the loader
* whether to continue loading sources.
*/
- public void loadPackages(final ISourceLoadedCallback sourceLoadedCallback) {
+ public void loadPackages(
+ DownloadCache downloadCache,
+ final ISourceLoadedCallback sourceLoadedCallback) {
try {
if (mUpdaterData == null) {
return;
}
+ if (downloadCache == null) {
+ downloadCache = mUpdaterData.getDownloadCache();
+ }
+
+ final DownloadCache downloadCache2 = downloadCache;
+
mUpdaterData.getTaskFactory().start("Loading Sources", new ITask() {
@Override
public void run(ITaskMonitor monitor) {
@@ -177,7 +186,9 @@ class PackageLoader {
for (SdkSource source : sources) {
Package[] pkgs = source.getPackages();
if (pkgs == null) {
- source.load(subMonitor.createSubMonitor(1), forceHttp);
+ source.load(downloadCache2,
+ subMonitor.createSubMonitor(1),
+ forceHttp);
pkgs = source.getPackages();
}
if (pkgs == null) {
@@ -204,7 +215,8 @@ class PackageLoader {
}
/**
- * Load packages, source by source using {@link #loadPackages(ISourceLoadedCallback)},
+ * Load packages, source by source using
+ * {@link #loadPackages(DownloadCache, ISourceLoadedCallback)},
* and executes the given {@link IAutoInstallTask} on the current package list.
* That is for each package known, the install task is queried to find if
* the package is the one to be installed or updated.
@@ -236,7 +248,8 @@ class PackageLoader {
final int installFlags,
final IAutoInstallTask installTask) {
- loadPackages(new ISourceLoadedCallback() {
+ loadPackages(mUpdaterData.getDownloadCache(),
+ new ISourceLoadedCallback() {
List<Archive> mArchivesToInstall = new ArrayList<Archive>();
Map<Package, File> mInstallPaths = new HashMap<Package, File>();
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/sdkman2/PackagesPage.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/sdkman2/PackagesPage.java
index 99801b0..e0d97f9 100755
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/sdkman2/PackagesPage.java
+++ b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/sdkman2/PackagesPage.java
@@ -24,7 +24,6 @@ import com.android.sdklib.internal.repository.ITask;
import com.android.sdklib.internal.repository.ITaskMonitor;
import com.android.sdklib.internal.repository.Package;
import com.android.sdklib.internal.repository.SdkSource;
-import com.android.sdkuilib.internal.repository.IPageListener;
import com.android.sdkuilib.internal.repository.UpdaterData;
import com.android.sdkuilib.internal.repository.UpdaterPage;
import com.android.sdkuilib.internal.repository.icons.ImageFactory;
@@ -86,8 +85,7 @@ import java.util.Map.Entry;
* remote available packages. This gives an overview of what is installed
* vs what is available and allows the user to update or install packages.
*/
-public class PackagesPage extends UpdaterPage
- implements ISdkChangeListener, IPageListener {
+public class PackagesPage extends UpdaterPage implements ISdkChangeListener {
static final String ICON_CAT_OTHER = "pkgcat_other_16.png"; //$NON-NLS-1$
static final String ICON_CAT_PLATFORM = "pkgcat_16.png"; //$NON-NLS-1$
@@ -169,13 +167,9 @@ public class PackagesPage extends UpdaterPage
postCreate(); //$hide$
}
- @Override
- public void onPageSelected() {
- List<PkgCategory> cats = mDiffLogic.getCategories(isSortByApi());
- if (cats == null || cats.isEmpty()) {
- // Initialize the package list the first time the page is shown.
- loadPackages();
- }
+ public void performFirstLoad() {
+ // Initialize the package list the first time the page is shown.
+ loadPackages(true /*isFirstLoad*/);
}
@SuppressWarnings("unused")
@@ -583,6 +577,10 @@ public class PackagesPage extends UpdaterPage
}
private void loadPackages() {
+ loadPackages(false /*isFirstLoad*/);
+ }
+
+ private void loadPackages(final boolean isFirstLoad) {
if (mUpdaterData == null) {
return;
}
@@ -601,7 +599,9 @@ public class PackagesPage extends UpdaterPage
}
mDiffLogic.updateStart();
- mDiffLogic.getPackageLoader().loadPackages(new ISourceLoadedCallback() {
+ mDiffLogic.getPackageLoader().loadPackages(
+ mUpdaterData.getDownloadCache(), // TODO do a first pass with Cache=SERVE_CACHE
+ new ISourceLoadedCallback() {
@Override
public boolean onUpdateSource(SdkSource source, Package[] newPackages) {
// This runs in a thread and must not access UI directly.
diff --git a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/sdkman2/SdkUpdaterWindowImpl2.java b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/sdkman2/SdkUpdaterWindowImpl2.java
index 2f77e45..ab0934a 100755
--- a/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/sdkman2/SdkUpdaterWindowImpl2.java
+++ b/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/repository/sdkman2/SdkUpdaterWindowImpl2.java
@@ -484,7 +484,7 @@ public class SdkUpdaterWindowImpl2 implements ISdkUpdaterWindow {
mUpdaterData.broadcastOnSdkLoaded();
// Tell the one page its the selected one
- mPkgPage.onPageSelected();
+ mPkgPage.performFirstLoad();
return true;
}
diff --git a/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/MockUpdaterData.java b/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/MockUpdaterData.java
index fff0814..e691429 100755
--- a/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/MockUpdaterData.java
+++ b/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/MockUpdaterData.java
@@ -20,6 +20,7 @@ import com.android.sdklib.NullSdkLog;
import com.android.sdklib.SdkManager;
import com.android.sdklib.internal.repository.ArchiveInstaller;
import com.android.sdklib.internal.repository.ArchiveReplacement;
+import com.android.sdklib.internal.repository.DownloadCache;
import com.android.sdklib.internal.repository.ITask;
import com.android.sdklib.internal.repository.ITaskFactory;
import com.android.sdklib.internal.repository.ITaskMonitor;
@@ -30,6 +31,7 @@ import com.android.sdkuilib.internal.repository.icons.ImageFactory;
import org.eclipse.swt.graphics.Image;
+import java.io.File;
import java.util.ArrayList;
import java.util.List;
@@ -40,6 +42,8 @@ public class MockUpdaterData extends UpdaterData {
private final List<ArchiveReplacement> mInstalled = new ArrayList<ArchiveReplacement>();
+ private DownloadCache mMockDownloadCache;
+
public MockUpdaterData() {
super(SDK_PATH, new MockLog());
@@ -76,6 +80,7 @@ public class MockUpdaterData extends UpdaterData {
String osSdkRoot,
boolean forceHttp,
SdkManager sdkManager,
+ DownloadCache cache,
ITaskMonitor monitor) {
mInstalled.add(archiveInfo);
return true;
@@ -83,6 +88,25 @@ public class MockUpdaterData extends UpdaterData {
};
}
+ /**
+ * Lazily initializes and returns a mock download cache that doesn't use the
+ * local disk and doesn't cache anything.
+ */
+ @Override
+ public DownloadCache getDownloadCache() {
+ if (mMockDownloadCache == null) {
+ mMockDownloadCache = new DownloadCache(DownloadCache.Strategy.DIRECT) {
+ @Override
+ protected File initCacheRoot() {
+ // returns null, preventing the cache from using the default
+ // $HOME/.android folder; this effectively disables the cache.
+ return null;
+ }
+ };
+ }
+ return mMockDownloadCache;
+ }
+
//------------
private class MockTaskFactory implements ITaskFactory {
@@ -91,6 +115,7 @@ public class MockUpdaterData extends UpdaterData {
start(title, null /*parentMonitor*/, task);
}
+ @SuppressWarnings("unused") // works by side-effect of creating a new MockTask.
@Override
public void start(String title, ITaskMonitor parentMonitor, ITask task) {
new MockTask(task);
diff --git a/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/UpdaterLogicTest.java b/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/UpdaterLogicTest.java
index 5d735e3..245ca84 100755
--- a/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/UpdaterLogicTest.java
+++ b/sdkmanager/libs/sdkuilib/tests/com/android/sdkuilib/internal/repository/UpdaterLogicTest.java
@@ -29,6 +29,7 @@ import com.android.sdklib.internal.repository.MockToolPackage;
import com.android.sdklib.internal.repository.Package;
import com.android.sdklib.internal.repository.SdkSource;
import com.android.sdklib.internal.repository.SdkSources;
+import com.android.sdklib.internal.repository.DownloadCache;
import com.android.sdkuilib.internal.repository.icons.ImageFactory;
import org.eclipse.swt.widgets.Shell;
@@ -60,6 +61,11 @@ public class UpdaterLogicTest extends TestCase {
}
@Override
+ public DownloadCache getDownloadCache() {
+ return null;
+ }
+
+ @Override
public SdkManager getSdkManager() {
return null;
}