Scenario.java

package org.jbehave.core.model;

import static org.apache.commons.lang3.StringUtils.EMPTY;

import java.util.Arrays;
import java.util.List;
import java.util.Properties;
import java.util.UUID;

import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

public class Scenario extends StepsContainer {

    private final String id = UUID.randomUUID().toString();
    private final String title;
    private final Meta meta;
    private final GivenStories givenStories;
    private final ExamplesTable examplesTable;

    public Scenario() {
        this(Arrays.<String>asList());
    }

    public Scenario(List<String> steps) {
        this(null, steps);
    }

    public Scenario(String title, Meta meta) {
        this(title, meta, null, null, Arrays.<String>asList());
    }

    public Scenario(String title, List<String> steps) {
        this(title, null, null, null, steps);
    }

    public Scenario(String title, Meta meta, GivenStories givenStories, ExamplesTable examplesTable,
            List<String> steps) {
        super(steps);
        this.title = title;
        this.meta = meta;
        this.givenStories = givenStories;
        this.examplesTable = examplesTable;
    }

    public String getTitle() {
        if (title == null) {
            return EMPTY;
        }
        return title;
    }

    public boolean hasGivenStories() {
        return givenStories != null;
    }

    public GivenStories getGivenStories() {
        if (!hasGivenStories()) {
            return GivenStories.EMPTY;
        }
        return givenStories;
    }

    public boolean hasExamplesTable() {
        return examplesTable != null;
    }

    public ExamplesTable getExamplesTable() {
        if (!hasExamplesTable()) {
            return ExamplesTable.EMPTY;
        }
        return examplesTable;
    }

    public String getId() {
        return id;
    }

    public boolean hasMeta() {
        return meta != null;
    }

    public Meta getMeta() {
        if (!hasMeta()) {
            return Meta.EMPTY;
        }
        return meta;
    }

    public Meta asMeta(String prefix) {
        Properties p = new Properties();
        p.setProperty(prefix + "title", getTitle());
        p.setProperty(prefix + "givenStories", getGivenStories().asString());
        p.setProperty(prefix + "examplesTable", getExamplesTable().asString());
        return new Meta(p);
    }

    @Override
    public String toString() {
        return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
    }

}