Home | History | Annotate | Download | only in res
      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 
     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