1 package org.robolectric.internal; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.net.URI; 6 import java.net.URL; 7 import java.util.ArrayList; 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 14 /** 15 * @deprecated This method of configuration will be removed in a forthcoming release. Build systems 16 * should follow http://robolectric.org/build-system-integration/ to provide integration with 17 * Robolectric. 18 */ 19 @Deprecated 20 public class MavenManifestFactory implements ManifestFactory { 21 22 @Override identify(Config config)23 public ManifestIdentifier identify(Config config) { 24 final String manifestPath = config.manifest(); 25 if (manifestPath.equals(Config.NONE)) { 26 return new ManifestIdentifier((String) null, null, null, null, null); 27 } 28 29 // Try to locate the manifest file as a classpath resource; fallback to using the base dir. 30 final FsFile manifestFile; 31 final String resourceName = manifestPath.startsWith("/") ? manifestPath : ("/" + manifestPath); 32 final URL resourceUrl = getClass().getResource(resourceName); 33 if (resourceUrl != null && "file".equals(resourceUrl.getProtocol())) { 34 // Construct a path to the manifest file relative to the current working directory. 35 final URI workingDirectory = URI.create(System.getProperty("user.dir")); 36 final URI absolutePath = URI.create(resourceUrl.getPath()); 37 final URI relativePath = workingDirectory.relativize(absolutePath); 38 manifestFile = Fs.newFile(relativePath.toString()); 39 } else { 40 manifestFile = getBaseDir().join(manifestPath); 41 } 42 43 final FsFile baseDir = manifestFile.getParent(); 44 final FsFile resDir = baseDir.join(config.resourceDir()); 45 final FsFile assetDir = baseDir.join(config.assetDir()); 46 47 List<ManifestIdentifier> libraries; 48 if (config.libraries().length == 0) { 49 // If there is no library override, look through subdirectories. 50 libraries = findLibraries(resDir); 51 } else { 52 libraries = new ArrayList<>(); 53 for (String libraryDirName : config.libraries()) { 54 FsFile libDir = baseDir.join(libraryDirName); 55 libraries.add(new ManifestIdentifier( 56 null, 57 libDir.join(Config.DEFAULT_MANIFEST_NAME), 58 libDir.join(Config.DEFAULT_RES_FOLDER), 59 libDir.join(Config.DEFAULT_ASSET_FOLDER), 60 null)); 61 } 62 } 63 64 return new ManifestIdentifier(config.packageName(), manifestFile, resDir, assetDir, libraries); 65 } 66 getBaseDir()67 FsFile getBaseDir() { 68 return Fs.currentDirectory(); 69 } 70 getProperties(FsFile propertiesFile)71 private static Properties getProperties(FsFile propertiesFile) { 72 Properties properties = new Properties(); 73 74 // return an empty Properties object if the propertiesFile does not exist 75 if (!propertiesFile.exists()) return properties; 76 77 InputStream stream; 78 try { 79 stream = propertiesFile.getInputStream(); 80 } catch (IOException e) { 81 throw new RuntimeException(e); 82 } 83 84 try { 85 try { 86 properties.load(stream); 87 } finally { 88 stream.close(); 89 } 90 } catch (IOException e) { 91 throw new RuntimeException(e); 92 } 93 return properties; 94 } 95 96 /** 97 * Find valid library AndroidManifest files referenced from an already loaded AndroidManifest's 98 * `project.properties` file, recursively. 99 */ findLibraries(FsFile resDirectory)100 private static List<ManifestIdentifier> findLibraries(FsFile resDirectory) { 101 List<ManifestIdentifier> libraryBaseDirs = new ArrayList<>(); 102 103 if (resDirectory != null) { 104 FsFile baseDir = resDirectory.getParent(); 105 final Properties properties = getProperties(baseDir.join("project.properties")); 106 Properties overrideProperties = getProperties(baseDir.join("test-project.properties")); 107 properties.putAll(overrideProperties); 108 109 int libRef = 1; 110 String lib; 111 while ((lib = properties.getProperty("android.library.reference." + libRef)) != null) { 112 FsFile libraryDir = baseDir.join(lib); 113 if (libraryDir.isDirectory()) { 114 // Ignore directories without any files 115 FsFile[] libraryBaseDirFiles = libraryDir.listFiles(); 116 if (libraryBaseDirFiles != null && libraryBaseDirFiles.length > 0) { 117 List<ManifestIdentifier> libraries = findLibraries(libraryDir.join(Config.DEFAULT_RES_FOLDER)); 118 libraryBaseDirs.add(new ManifestIdentifier( 119 null, 120 libraryDir.join(Config.DEFAULT_MANIFEST_NAME), 121 libraryDir.join(Config.DEFAULT_RES_FOLDER), 122 libraryDir.join(Config.DEFAULT_ASSET_FOLDER), 123 libraries)); 124 } 125 } 126 127 libRef++; 128 } 129 } 130 return libraryBaseDirs; 131 } 132 } 133