ImportToFilesystem.java

package org.jbehave.core.io.rest.filesystem;

import static org.jbehave.core.io.rest.filesystem.FilesystemUtils.asFile;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Map;

import org.jbehave.core.io.ResourceLoader;
import org.jbehave.core.io.rest.Resource;
import org.jbehave.core.io.rest.ResourceImporter;
import org.jbehave.core.io.rest.ResourceIndexer;

/**
 * <p>Implementation that writes to filesystem the imported resources, using the target file path and extension
 * specified.</p>
 * 
 * <p>The importer requires an instance of a {@link ResourceIndexer} and of a {@link ResourceLoader}.</p>
 */
public class ImportToFilesystem implements ResourceImporter {

    private final ResourceIndexer indexer;
    private final ResourceLoader loader;
    private final String targetPath;
    private final String targetExt;

    public ImportToFilesystem(ResourceIndexer indexer, ResourceLoader loader, String targetPath, String targetExt) {
        this.indexer = indexer;
        this.loader = loader;
        this.targetPath = targetPath;
        this.targetExt = targetExt;
    }

    @Override
    public void importResources(String rootURI) {
        Map<String, Resource> index = indexer.indexResources(rootURI);
        loadResources(index);
        writeResources(index, targetPath, targetExt);
    }

    private void loadResources(Map<String, Resource> index) {
        for (String name : index.keySet()) {
            Resource resource = index.get(name);
            String text = loader.loadResourceAsText(resource.getURI());
            resource.setContent(text);
        }
    }

    private void writeResources(Map<String, Resource> index, String targetPath, String targetExt) {
        for (String name : index.keySet()) {
            Resource resource = index.get(name);
            writeResource(resource, asFile(resource, targetPath, targetExt));
        }
    }

    private void writeResource(Resource resource, File file) {
        try {
            file.getParentFile().mkdirs();
            if (resource.hasContent()) {
                FileWriter writer = new FileWriter(file);
                writer.write(resource.getContent());
                writer.close();
            }
        } catch (IOException e) {
            throw new RuntimeException("Failed to write resource " + resource + " to file " + file, e);
        }
    }

}