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