1package org.robolectric.res;
2
3import javax.annotation.Nonnull;
4import org.robolectric.util.Logger;
5
6public 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
16  public DocumentLoader(String packageName, FsFile resourceBase) {
17    this.packageName = packageName;
18    this.resourceBase = resourceBase;
19  }
20
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
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
52  protected abstract void loadResourceXmlFile(XmlContext xmlContext);
53}
54