diff options
author | Raphael Moll <ralf@android.com> | 2012-04-12 14:41:25 -0700 |
---|---|---|
committer | Raphael Moll <ralf@android.com> | 2012-04-16 15:04:14 -0700 |
commit | af832e8eeb4eb7e24a292ed912ce8eb7cc2a8233 (patch) | |
tree | b28f218a8a409dbee35786ea68df82ee9eea3068 /sdkmanager/libs/sdkuilib | |
parent | 72d16d222e7205cab473d01f483c534747c9026b (diff) | |
download | sdk-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')
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;
}
|