• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package org.robolectric.res;
2 
3 import javax.annotation.Nonnull;
4 import org.robolectric.util.Logger;
5 
6 public abstract class DocumentLoader {
7   private static final FsFile.Filter ENDS_WITH_XML = new FsFile.Filter() {
8     @Override public boolean accept(@Nonnull FsFile fsFile) {
9       return fsFile.getName().endsWith(".xml");
10     }
11   };
12 
13   protected final String packageName;
14   private final FsFile resourceBase;
15 
DocumentLoader(String packageName, FsFile resourceBase)16   public DocumentLoader(String packageName, FsFile resourceBase) {
17     this.packageName = packageName;
18     this.resourceBase = resourceBase;
19   }
20 
load(String folderBaseName)21   public void load(String folderBaseName) {
22     FsFile[] files = resourceBase.listFiles(new StartsWithFilter(folderBaseName));
23     if (files == null) {
24       throw new RuntimeException(resourceBase.join(folderBaseName) + " is not a directory");
25     }
26     for (FsFile dir : files) {
27       loadFile(dir);
28     }
29   }
30 
loadFile(FsFile dir)31   private void loadFile(FsFile dir) {
32     if (!dir.exists()) {
33       throw new RuntimeException("no such directory " + dir);
34     }
35     if (!dir.isDirectory()) {
36       return;
37     }
38 
39     Qualifiers qualifiers;
40     try {
41       qualifiers = Qualifiers.fromParentDir(dir);
42     } catch (IllegalArgumentException e) {
43       Logger.warn(dir + ": " + e.getMessage());
44       return;
45     }
46 
47     for (FsFile file : dir.listFiles(ENDS_WITH_XML)) {
48       loadResourceXmlFile(new XmlContext(packageName, file, qualifiers));
49     }
50   }
51 
loadResourceXmlFile(XmlContext xmlContext)52   protected abstract void loadResourceXmlFile(XmlContext xmlContext);
53 }
54