br.usp.poli.lta.cereda.aa.model.Submachine.java Source code

Java tutorial

Introduction

Here is the source code for br.usp.poli.lta.cereda.aa.model.Submachine.java

Source

/**
* ------------------------------------------------------
*    Laboratrio de Linguagens e Tcnicas Adaptativas
*       Escola Politcnica, Universidade So Paulo
* ------------------------------------------------------
* 
* This program is free software: you can redistribute it
* and/or modify  it under the  terms of the  GNU General
* Public  License  as  published by  the  Free  Software
* Foundation, either  version 3  of the License,  or (at
* your option) any later version.
* 
* This program 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 General Public License
* for more details.
* 
**/
package br.usp.poli.lta.cereda.aa.model;

import br.usp.poli.lta.cereda.aa.utils.IdentifierUtils;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Validate;

/**
 * Classe que representa a definio formal de uma submquina. A inteno 
 * tentar representar a teoria da forma mais precisa possvel.
 * @author Paulo Roberto Massa Cereda
 * @version 1.0
 * @since 1.0
 */
public class Submachine {

    // atributos da classe, incluindo um identificador unvoco que representa
    // a submquina corrente, um nome no qual a submquina  referenciada
    // posteriormente, um estado inicial ou de entrada, um conjunto de todos os
    // estados da submquina, e um conjunto de estados finais ou de aceitao.
    private int identifier;
    private String name;
    private State initialState;
    private Set<State> acceptingStates;
    private Set<State> states;

    /**
     * Construtor. Define a estrutura da submquina como um todo.
     * @param name Nome da submquina.
     * @param states Conjunto de todos os estados da submquina.
     * @param initialState Estado inicial ou de entrada da submquina.
     * @param acceptingStates Conjunto de estados finais ou de aceitao.
     */
    public Submachine(String name, Set<State> states, State initialState, Set<State> acceptingStates) {

        this.identifier = IdentifierUtils.getSubmachineIdentifier();
        this.name = name;
        this.initialState = initialState;
        this.acceptingStates = acceptingStates;
        this.states = states;

        // valida se todos os estados definidos esto de acordo com a teoria
        Validate.isTrue(states.contains(initialState) && states.containsAll(acceptingStates),
                "Existem estados indefinidos na submquina '".concat(String.valueOf(name).concat("'.")));
    }

    /**
     * Obtm o identificador unvoco da submquina.
     * @return Um valor inteiro que representa o identificador da submquina.
     */
    public int getIdentifier() {
        return identifier;
    }

    /**
     * Define o identificador unvoco da submquina.
     * @param identifier Um valor inteiro que representa o identificador da
     * submquina.
     */
    public void setIdentifier(int identifier) {
        this.identifier = identifier;
    }

    /**
     * Obtm o nome da submquina.
     * @return Nome da submquina.
     */
    public String getName() {
        return name;
    }

    /**
     * Define o nome da submquina.
     * @param name Nome da submquina.
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * Obtm o estado inicial ou de entrada da submquina.
     * @return Estado inicial ou de entrada da submquina.
     */
    public State getInitialState() {
        return initialState;
    }

    /**
     * Define o estado inicial ou de entrada da submquina.
     * @param initialState Estado inicial ou de entrada da submquina.
     */
    public void setInitialState(State initialState) {
        this.initialState = initialState;
    }

    /**
     * Obtm todos os estados de aceitao ou de sada da submquina.
     * @return Um conjunto contendo os estados de aceitao ou de sada da
     * submquina.
     */
    public Set<State> getAcceptingStates() {
        return acceptingStates;
    }

    /**
     * Define o conjunto de estados finais ou de aceitao da submquina.
     * @param acceptingStates Conjunto de estados finais da submquina.
     */
    public void setAcceptingStates(Set<State> acceptingStates) {
        this.acceptingStates = acceptingStates;
    }

    /**
     * Obtm todos os estados da submquina.
     * @return Conjunto de todos os estados da submquina.
     */
    public Set<State> getStates() {
        return states;
    }

    /**
     * Define o conjunto de todos os estados da submquina.
     * @param states Conjunto de todos os estados da submquina.
     */
    public void setStates(Set<State> states) {
        this.states = states;
    }

    /**
     * Retorna uma representao textual do conjunto de estados.
     * @param set Conjunto de estados.
     * @param separator Separador dos elementos.
     * @return Representao textual do conjunto de estados.
     */
    private String printElements(Set<State> set, String separator) {
        StringBuilder sb = new StringBuilder();
        sb.append("(");
        sb.append(StringUtils.join(set, separator));
        sb.append(")");
        return sb.toString();
    }

    /**
     * Retorna uma representao textual da submquina corrente.
     * @return Representao textual da submquina corrente.
     */
    @Override
    public String toString() {
        String separator = ", ";
        String div = " :: ";
        StringBuilder sb = new StringBuilder();
        sb.append("Submquina: { ");
        sb.append("Identificador: ").append(identifier).append(div);
        sb.append("Nome: ").append(name).append(div);
        sb.append("Estados: ").append(printElements(states, separator)).append(div);
        sb.append("Estado inicial: ").append(initialState).append(div);
        sb.append("Estados de aceitao: ").append(printElements(acceptingStates, separator));
        sb.append(" }");
        return sb.toString();
    }

}