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