• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package org.robolectric.internal;
2 
3 import static java.util.Collections.emptyList;
4 
5 import java.io.File;
6 import java.net.MalformedURLException;
7 import java.net.URL;
8 import java.util.List;
9 import java.util.Properties;
10 import org.robolectric.annotation.Config;
11 import org.robolectric.res.Fs;
12 import org.robolectric.res.FsFile;
13 import org.robolectric.util.Logger;
14 
15 public class DefaultManifestFactory implements ManifestFactory {
16   private Properties properties;
17 
DefaultManifestFactory(Properties properties)18   public DefaultManifestFactory(Properties properties) {
19     this.properties = properties;
20   }
21 
22   @Override
identify(Config config)23   public ManifestIdentifier identify(Config config) {
24     String baseDir = System.getProperty("robolectric-tests.base-dir");
25 
26     FsFile manifestFile = getFsFileFromProperty(baseDir, "android_merged_manifest");
27     FsFile resourcesDir = getFsFileFromProperty(baseDir, "android_merged_resources");
28     FsFile assetsDir = getFsFileFromProperty(baseDir, "android_merged_assets");
29     FsFile apkFile = getFsFileFromProperty(baseDir, "android_resource_apk");
30     String packageName = properties.getProperty("android_custom_package");
31 
32     String manifestConfig = config.manifest();
33     if (Config.NONE.equals(manifestConfig)) {
34       Logger.info("@Config(manifest = Config.NONE) specified while using Build System API, ignoring");
35     } else if (!Config.DEFAULT_MANIFEST_NAME.equals(manifestConfig)) {
36       manifestFile = resolveFile(manifestConfig);
37     }
38 
39     if (!Config.DEFAULT_RES_FOLDER.equals(config.resourceDir())) {
40       resourcesDir = resolveFile(config.resourceDir());
41     }
42 
43     if (!Config.DEFAULT_ASSET_FOLDER.equals(config.assetDir())) {
44       assetsDir = resolveFile(config.assetDir());
45     }
46 
47     if (!Config.DEFAULT_PACKAGE_NAME.equals(config.packageName())) {
48       packageName = config.packageName();
49     }
50 
51     List<ManifestIdentifier> libraryDirs = emptyList();
52     if (config.libraries().length > 0) {
53       Logger.info("@Config(libraries) specified while using Build System API, ignoring");
54     }
55 
56     return new ManifestIdentifier(packageName, manifestFile, resourcesDir, assetsDir, libraryDirs,
57         apkFile);
58   }
59 
resolveFile(String manifestConfig)60   private FsFile resolveFile(String manifestConfig) {
61     URL manifestUrl = getClass().getClassLoader().getResource(manifestConfig);
62     if (manifestUrl == null) {
63       throw new IllegalArgumentException("couldn't find '" + manifestConfig + "'");
64     } else {
65       return Fs.fromURL(manifestUrl);
66     }
67   }
68 
getFsFileFromProperty(String baseDir, String name)69   private FsFile getFsFileFromProperty(String baseDir, String name) {
70     String path = properties.getProperty(name);
71     if (path == null || path.isEmpty()) {
72       return null;
73     }
74 
75     if (baseDir != null) {
76       path = new File(baseDir, path).getPath();
77     }
78 
79     if (path.startsWith("jar")) {
80       try {
81         URL url = new URL(path);
82         return Fs.fromURL(url);
83       } catch (MalformedURLException e) {
84         throw new RuntimeException(e);
85       }
86     } else {
87       return Fs.fileFromPath(path);
88     }
89   }
90 }
91