/* * Copyright (c) 2007 - OQube / Arnaud Bailly This library is free software; you * can redistribute it and/or modify it under the terms of the GNU Lesser * General Public License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with this library; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * * Created 29 mai 07 */ package rationals; /** * A class for step-by-step creation of transitions. A TransitionBuilder can be * used to add expesiveness to transition creation withing automaton. * * @author nono * */ public class TransitionBuilder implements Builder<TransitionBuilder> { private State start; private Automaton automaton; protected Object label; /** * Creates a transition builder for given automaton. * * @param state * the starting state of transition. * @param automaton * the automaton where transition will be added. */ public TransitionBuilder(State state, Automaton automaton) { this.start = state; this.automaton = automaton; } public TransitionBuilder() { // TODO Auto-generated constructor stub } /** * Sets the label of the transition. * * @param label * @return this transition builder. */ public TransitionBuilder on(Object label) { this.label = label; return this; } /** * Sets the end state and terminates transition construction. This method * effectively adds the transition to the automaton. * * @param o * the label of the end state. */ public TransitionBuilder go(Object o) { State s = automaton.state(o); try { automaton.addTransition(new Transition(start, label, s)); } catch (NoSuchStateException e) { assert false; } return this; } /** * Adds a new transition in the automaton that loops on current label and from * state. * * @return */ public TransitionBuilder loop() { try { automaton.addTransition(new Transition(start, label, start)); } catch (NoSuchStateException e) { assert false; } return this; } /** * Resets this builder to another starting state. Note that the state is * created if needed. * * @param label * the state to start from. * @return this builder. */ public TransitionBuilder from(Object label) { this.start = automaton.state(label); this.label = null; return this; } /* * (non-Javadoc) * * @see rationals.Builder#build(java.lang.Object, rationals.Automaton) */ public TransitionBuilder build(State state, Automaton<TransitionBuilder> auto) { this.start = state; this.label = null; this.automaton = auto; return this; } }