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