1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.android.tradefed.build;
17 
18 import java.io.File;
19 import java.util.Collections;
20 import java.util.HashMap;
21 import java.util.Map;
22 
23 /**
24  * A factory for creating {@link FileDownloadCache}
25  */
26 public class FileDownloadCacheFactory {
27 
28     // use the "singleton inner class" pattern
29     // http://en.wikipedia.org/wiki/Singleton_pattern#The_solution_of_Bill_Pugh
30     private static class SingletonHolder {
31         public static final FileDownloadCacheFactory INSTANCE = new FileDownloadCacheFactory();
32     }
33 
34     private Map<String, FileDownloadCache> mCacheObjectMap = Collections.synchronizedMap(
35             new HashMap<String, FileDownloadCache>());
36 
37     /**
38      * Get the singleton instance of FileDownloadCacheFactory
39      */
getInstance()40     public static FileDownloadCacheFactory getInstance() {
41         return SingletonHolder.INSTANCE;
42     }
43 
44     /**
45      * Retrieve the {@link FileDownloadCache} with the given cache directory, creating if necessary.
46      * <p/>
47      * Note that the cache assumes that this process has exclusive access to the <var>cacheDir</var>
48      * directory. If multiple TF processes will be run on the same machine, they MUST each use
49      * unique cache directories.
50      *
51      * @param cacheDir the local filesystem directory to use as a cache
52      * @return the {@link FileDownloadCache} for given cacheDir
53      */
getCache(File cacheDir)54     public synchronized FileDownloadCache getCache(File cacheDir) {
55         FileDownloadCache cache = mCacheObjectMap.get(cacheDir.getAbsolutePath());
56         if (cache == null) {
57             cache = new FileDownloadCache(cacheDir);
58             mCacheObjectMap.put(cacheDir.getAbsolutePath(), cache);
59         }
60         return cache;
61     }
62 }
63