ExportFromFilesystem.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.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Map;

import org.apache.commons.io.FileUtils;
import org.jbehave.core.io.rest.Resource;
import org.jbehave.core.io.rest.ResourceExporter;
import org.jbehave.core.io.rest.ResourceIndexer;
import org.jbehave.core.io.rest.ResourceUploader;

/**
 * <p>Implementation that reads from filesystem the resources and uploads them.</p>
 * 
 * <p>An include pattern of the resources may be provided.</p>
 * 
 * <p>The exporter requires an instance of a {@link ResourceIndexer} and of a {@link ResourceUploader}.</p>
 */
public class ExportFromFilesystem implements ResourceExporter {

    private final ResourceIndexer indexer;
    private final ResourceUploader uploader;
    private final String sourcePath;
    private final String sourceExt;
    private String syntax;
    private String includes;

    public ExportFromFilesystem(ResourceIndexer indexer,
            ResourceUploader uploader, String sourcePath, String sourceExt,
            String syntax, String includes) {
        this.indexer = indexer;
        this.uploader = uploader;
        this.sourcePath = sourcePath;
        this.sourceExt = sourceExt;
        this.syntax = syntax;
        this.includes = includes;
    }

    @Override
    public void exportResources(String rootURI) {
        Map<String, Resource> index = indexer.indexResources(rootURI,
                sourcePath, syntax, includes);
        readResources(index, sourcePath, sourceExt);
        uploadResources(index);
    }

    private void uploadResources(Map<String, Resource> index) {
        for (String name : index.keySet()) {
            Resource resource = index.get(name);
            uploader.uploadResource(resource);
        }
    }

    private void readResources(Map<String, Resource> index, String sourcePath,
            String sourceExt) {
        for (String name : index.keySet()) {
            Resource resource = index.get(name);
            readResource(resource, asFile(resource, sourcePath, sourceExt));
        }
    }

    private void readResource(Resource resource, File file) {
        if (file.isDirectory() || !file.exists()) {
            return;
        }
        try {
            String text = FileUtils.readFileToString(file, StandardCharsets.UTF_8);
            resource.setContent(text);
        } catch (IOException e) {
            throw new RuntimeException("Failed to read resource " + resource
                    + " from file " + file, e);
        }
    }

}