• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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