StoryMapper.java

package org.jbehave.core.embedder;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.jbehave.core.model.Meta;
import org.jbehave.core.model.Story;
import org.jbehave.core.model.StoryMap;
import org.jbehave.core.model.StoryMaps;

/**
 * Maps {@link Story}s by a {@link MetaFilter}.
 * 
 * @author Mauro Talevi
 */
public class StoryMapper {

    private Map<String, Set<Story>> map = new HashMap<>();

    /**
     * Maps a story if it is not excluded by the meta filter
     * 
     * @param story
     *            the Story
     * @param metaFilter
     *            the meta filter
     */
    public void map(Story story, MetaFilter metaFilter) {
        Meta storyMeta = story.getMeta();
        if (!metaFilter.excluded(storyMeta)) {
            boolean allScenariosExcluded = story.getScenarios().stream()
                    // scenario also inherits meta from story
                    .map(scenario -> scenario.getMeta().inheritFrom(storyMeta))
                    .allMatch(metaFilter::excluded);
            if (!allScenariosExcluded) {
                add(metaFilter.asString(), story);
            }
        }
    }

    public StoryMap getStoryMap(String filter) {
        return new StoryMap(filter, storiesFor(filter));
    }

    public StoryMaps getStoryMaps() {
        List<StoryMap> maps = new ArrayList<>();
        for (String filter : map.keySet()) {
            maps.add(getStoryMap(filter));
        }
        return new StoryMaps(maps);
    }

    private void add(String filter, Story story) {
        storiesFor(filter).add(story);
    }

    private Set<Story> storiesFor(String filter) {
        Set<Story> stories = map.get(filter);
        if (stories == null) {
            stories = new HashSet<>();
            map.put(filter, stories);
        }
        return stories;
    }

    @Override
    public String toString() {
        return this.getClass().getSimpleName();
    }

}