RangeBlock.java

/**
 * Copyright (c) 2018 European Organisation for Nuclear Research (CERN), All Rights Reserved.
 */

package cern.accsoft.steering.jmad.tools.modeldefs.creating.lang;

import static java.util.Objects.requireNonNull;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;

public class RangeBlock {

    private final RangeDefinitionBuilder builder;
    private boolean initialConditionsSpecified = false;
    private boolean filtersSpecified = false;
    private boolean postUseSpecified = false;

    public RangeBlock(RangeDefinitionBuilder builder) {
        this.builder = requireNonNull(builder, "builder must not be null");
    }

    public void start(String elementName) {
        AssertUtil.requireNull(builder.getStartElementName(), "start element already set. Cannot define twice.");
        requireNonNull("elementName must not be null");
        this.builder.setStartElementName(elementName);
    }

    public void end(String elementName) {
        AssertUtil.requireNull(builder.getEndElementName(), "end element already set. Cannot define twice.");
        requireNonNull("elementName must not be null");
        this.builder.setEndElementName(elementName);
    }

    public void rotateToStartAt(String elementName) {
        AssertUtil.requireNull(builder.getRotateStartElementName(),
                "The start element to rotate was already set. Cannot set twice.");
        requireNonNull("elementName must not be null");
        this.builder.setRotateStartElementName(elementName);
    }

    public void invert(Consumer<ElementFilterBlock> block) {
        AssertUtil.requireFalse(filtersSpecified, "Invert filters were already specified. Cannot specfy twice.");
        ElementFilterBlock filterBlock = new ElementFilterBlock(builder);
        block.accept(filterBlock);
        filtersSpecified = true;
    }

    public void onPostUse(Consumer<FileBlock> block) {
        AssertUtil.requireFalse(postUseSpecified, "postUse filse already specified. Cannot specfy twice.");
        List<ModelFileBuilder> modelFileBuilders = new ArrayList<>();
        block.accept(new FileBlock(modelFileBuilders));
        modelFileBuilders.stream().map(ModelFileBuilder::build).forEachOrdered(builder::addPostUseFile);
        postUseSpecified = true;
    }

    public void twiss(Consumer<InitialConditionsBlock> block) {
        AssertUtil.requireFalse(initialConditionsSpecified,
                "twiss initial conditions already set. Cannot define twice.");
        initialConditionsSpecified = true;
        block.accept(new InitialConditionsBlock(builder.getTwissInitialConditions()));
    }

}