package com.android.ide.common.resources; import static com.android.SdkConstants.FD_RES; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import com.android.annotations.NonNull; import com.android.ide.common.res2.MergingException; import com.android.ide.common.res2.RecordingLogger; import com.android.ide.common.res2.ResourceMerger; import com.android.ide.common.res2.ResourceSet; import com.android.io.FolderWrapper; import com.android.io.IAbstractFolder; import com.google.common.base.Charsets; import com.google.common.io.Files; import java.io.File; import java.io.IOException; public class TestResourceRepository extends ResourceRepository { private final File mDir; TestResourceRepository(@NonNull IAbstractFolder resFolder, boolean isFrameworkRepository, File dir) { super(resFolder, isFrameworkRepository); mDir = dir; } @NonNull @Override protected ResourceItem createResourceItem(@NonNull String name) { return new TestResourceItem(name); } public File getDir() { return mDir; } public void dispose() { deleteFile(mDir); } private static void deleteFile(File dir) { if (dir.isDirectory()) { File[] files = dir.listFiles(); if (files != null) { for (File f : files) { deleteFile(f); } } } else if (dir.isFile()) { assertTrue(dir.getPath(), dir.delete()); } } /** * Creates a resource repository for a resource folder whose contents is identified * by the pairs of relative paths and file contents */ @SuppressWarnings("ResultOfMethodCallIgnored") @NonNull public static TestResourceRepository create(boolean isFramework, Object[] data) throws IOException { File dir = Files.createTempDir(); File res = new File(dir, FD_RES); res.mkdirs(); assertTrue("Expected even number of items (path,contents)", data.length % 2 == 0); for (int i = 0; i < data.length; i += 2) { Object relativePathObject = data[i]; assertTrue(relativePathObject instanceof String); String relativePath = (String) relativePathObject; relativePath = relativePath.replace('/', File.separatorChar); File file = new File(res, relativePath); File parent = file.getParentFile(); parent.mkdirs(); Object fileContents = data[i + 1]; if (fileContents instanceof String) { String text = (String) fileContents; Files.write(text, file, Charsets.UTF_8); } else if (fileContents instanceof byte[]) { byte[] bytes = (byte[]) fileContents; Files.write(bytes, file); } else { fail("File contents must be Strings or byte[]'s"); } } IAbstractFolder resFolder = new FolderWrapper(dir, FD_RES); return new TestResourceRepository(resFolder, isFramework, dir); } /** * Creates a res2 resource repository for a resource folder whose contents is identified * by the pairs of relative paths and file contents * * @see #create(boolean, Object[]) */ @SuppressWarnings("ResultOfMethodCallIgnored") @NonNull public static com.android.ide.common.res2.ResourceRepository createRes2( boolean isFramework, Object[] data) throws IOException, MergingException { File dir = Files.createTempDir(); File res = new File(dir, FD_RES); res.mkdirs(); assertTrue("Expected even number of items (path,contents)", data.length % 2 == 0); for (int i = 0; i < data.length; i += 2) { Object relativePathObject = data[i]; assertTrue(relativePathObject instanceof String); String relativePath = (String) relativePathObject; relativePath = relativePath.replace('/', File.separatorChar); File file = new File(res, relativePath); File parent = file.getParentFile(); parent.mkdirs(); Object fileContents = data[i + 1]; if (fileContents instanceof String) { String text = (String) fileContents; Files.write(text, file, Charsets.UTF_8); } else if (fileContents instanceof byte[]) { byte[] bytes = (byte[]) fileContents; Files.write(bytes, file); } else { fail("File contents must be Strings or byte[]'s"); } } File resFolder = new File(dir, FD_RES); ResourceMerger merger = new ResourceMerger(); ResourceSet resourceSet = new ResourceSet("main"); resourceSet.addSource(resFolder); resourceSet.loadFromFiles(new RecordingLogger()); merger.addDataSet(resourceSet); com.android.ide.common.res2.ResourceRepository repository; repository = new com.android.ide.common.res2.ResourceRepository(isFramework); merger.mergeData(repository.createMergeConsumer(), true /*doCleanUp*/); return repository; } private static class TestResourceItem extends ResourceItem { TestResourceItem(String name) { super(name); } } }