br.usp.poli.lta.cereda.aa.model.sets.Mapping.java Source code

Java tutorial

Introduction

Here is the source code for br.usp.poli.lta.cereda.aa.model.sets.Mapping.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.sets;

import br.usp.poli.lta.cereda.aa.model.State;
import br.usp.poli.lta.cereda.aa.model.Symbol;
import br.usp.poli.lta.cereda.aa.model.Transition;
import br.usp.poli.lta.cereda.aa.model.predicates.EpsilonPredicate;
import br.usp.poli.lta.cereda.aa.model.predicates.SourceStatePredicate;
import br.usp.poli.lta.cereda.aa.model.predicates.SubmachineCallPredicate;
import br.usp.poli.lta.cereda.aa.model.predicates.SubmachinePredicate;
import br.usp.poli.lta.cereda.aa.model.predicates.SymbolPredicate;
import br.usp.poli.lta.cereda.aa.model.predicates.TargetStatePredicate;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.Predicate;
import org.apache.commons.collections4.PredicateUtils;

/**
 * Classe que define o conjunto de transies do autmato adaptativo.
 * @author Paulo Roberto Massa Cereda
 */
public class Mapping {

    // atributo da classe, que  um conjunto contendo todas as transies do
    // autmato adaptativo.
    private Set<Transition> transitions;

    /**
     * Construtor. Cria o novo conjunto de transies.
     */
    public Mapping() {
        transitions = new HashSet<>();
    }

    /**
     * Obtm o conjunto de transies.
     * @return Conjunto de transies.
     */
    public Set<Transition> getTransitions() {
        return transitions;
    }

    /**
     * Define o conjunto de transies.
     * @param transitions Conjunto de transies.
     */
    public void setTransitions(Set<Transition> transitions) {
        this.transitions = transitions;
    }

    /**
     * Retorna um valor lgico informando se a transio com o identificador
     * informado existe no conjunto de transies.
     * @param identifier Valor inteiro denotando o identificador unvoco de uma
     * transio.
     * @return Valor lgico informando se a transio com identificador
     * informado existe no conjunto de transies.
     */
    public boolean hasIdentifier(int identifier) {
        for (Transition transition : transitions) {
            if (transition.getIdentifier() == identifier) {
                return true;
            }
        }
        return false;
    }

    /**
     * Obtm a cardinalidade do conjunto de transies.
     * @return Valor lgico denotando a cardinalidade do conjunto de transies.
     */
    public int size() {
        return transitions.size();
    }

    /**
     * Consulta quais transies possuem o estado de origem informado.
     * @param state Estado de origem.
     * @return Transies que possuem o estado de origem informado.
     */
    public List<Transition> withSourceState(State state) {
        Collection<Transition> result = CollectionUtils.select(transitions, new SourceStatePredicate(state));
        return new ArrayList<>(result);
    }

    /**
     * Consulta transies que consomem o smbolo informado.
     * @param symbol Smbolo a ser consumido.
     * @return Transies que consomem o smbolo informado.
     */
    public List<Transition> withSymbol(Symbol symbol) {
        Collection<Transition> result = CollectionUtils.select(transitions, new SymbolPredicate(symbol));
        return new ArrayList<>(result);
    }

    /**
     * Consulta transies que possuem o estado de destino informado.
     * @param state Estado de destino.
     * @return Transies que possuem o estado de destino informado.
     */
    public List<Transition> withTargetState(State state) {
        Collection<Transition> result = CollectionUtils.select(transitions, new TargetStatePredicate(state));
        return new ArrayList<>(result);
    }

    /**
     * Consulta transies que fazem chamada  submquina informada.
     * @param submachine Nome da submquina.
     * @return Transies que fazem chamada  submquina informada.
     */
    public List<Transition> withSubmachine(String submachine) {
        Collection<Transition> result = CollectionUtils.select(transitions, new SubmachinePredicate(submachine));
        return new ArrayList<>(result);
    }

    /**
     * Consulta transies que consomem o smbolo informado a partir do estado
     * de origem tambm informado.
     * @param state Estado de origem.
     * @param symbol Smbolo a ser consumido.
     * @return Transies que consomem o smbolo informado a partir do estado
     * de origem tambm informado.
     */
    public List<Transition> withSourceStateAndSymbol(State state, Symbol symbol) {
        Predicate[] chain = { new SourceStatePredicate(state), new SymbolPredicate(symbol) };
        Collection<Transition> result = CollectionUtils.select(transitions, PredicateUtils.allPredicate(chain));
        return new ArrayList<>(result);
    }

    /**
     * Consulta transies que partem do estado de origem informado e seguem at
     * o estado de destino tambm informado.
     * @param state1 Estado de origem.
     * @param state2 Estado de destino.
     * @return Transies que partem do estado de origem informado e seguem at
     * o estado de destino tambm informado.
     */
    public List<Transition> withSourceAndTargetStates(State state1, State state2) {
        Predicate[] chain = { new SourceStatePredicate(state1), new TargetStatePredicate(state2) };
        Collection<Transition> result = CollectionUtils.select(transitions, PredicateUtils.allPredicate(chain));
        return new ArrayList<>(result);
    }

    /**
     * Consulta quais transies partem de um estado de origem, consomem o
     * smbolo e chegam at um estado de destino.
     * @param state1 Estado de origem.
     * @param symbol Smbolo a ser consumido.
     * @param state2 Estado de destino.
     * @return Transies partem de um estado de origem, consomem o smbolo e
     * chegam at um estado de destino.
     */
    public List<Transition> withSourceStateSymbolAndTargetState(State state1, Symbol symbol, State state2) {
        Predicate[] chain = { new SourceStatePredicate(state1), new SymbolPredicate(symbol),
                new TargetStatePredicate(state2) };
        Collection<Transition> result = CollectionUtils.select(transitions, PredicateUtils.allPredicate(chain));
        return new ArrayList<>(result);
    }

    /**
     * Consulta transies que partem de um estado de origem e chamam uma
     * determinada submquina.
     * @param state Estado de origem.
     * @param submachine Nome da submquina.
     * @return Transies que partem de um estado de origem e chamam uma
     * determinada submquina.
     */
    public List<Transition> withSourceStateAndSumbmachine(State state, String submachine) {
        Predicate[] chain = { new SourceStatePredicate(state), new SubmachinePredicate(submachine) };
        Collection<Transition> result = CollectionUtils.select(transitions, PredicateUtils.allPredicate(chain));
        return new ArrayList<>(result);
    }

    /**
     * Consulta transies em vazio a partir do estado de origem.
     * @param state Estado de origem.
     * @return Transies em vazio a partir do estado de origem.
     */
    public List<Transition> withEpsilonFromSourceState(State state) {
        Predicate[] chain = { new SourceStatePredicate(state), new EpsilonPredicate() };
        Collection<Transition> result = CollectionUtils.select(transitions, PredicateUtils.allPredicate(chain));
        return new ArrayList<>(result);
    }

    /**
     * Consulta transies em vazio.
     * @return Transies em vazio.
     */
    public List<Transition> withEpsilonTransitions() {
        Collection<Transition> result = CollectionUtils.select(transitions, new EpsilonPredicate());
        return new ArrayList<>(result);
    }

    /**
     * Consulta transies em vazio ou com chamadas de submquina a partir do
     * estado de origem informado.
     * @param state Estado de origem.
     * @return Transies em vazio ou com chamadas de submquina a partir do
     * estado de origem informado.
     */
    public List<Transition> withEpsilonOrSubmachineFromSourceState(State state) {
        Predicate[] chain = { new EpsilonPredicate(), new SubmachineCallPredicate() };
        Collection<Transition> result = CollectionUtils.select(
                CollectionUtils.select(transitions, new SourceStatePredicate(state)),
                PredicateUtils.anyPredicate(chain));
        return new ArrayList<>(result);
    }

    /**
     * Consulta transies com o consumo de um smbolo especfico, em vazio ou
     * com chamadas de submquina a partir do estado de origem informado.
     * @param state Estado de origem.
     * @param symbol Smbolo a ser consumido.
     * @return Transies com o consumo de um smbolo especfico, em vazio ou
     * com chamadas de submquina a partir do estado de origem informado.
     */
    public List<Transition> withSymbolEpsilonOrSubmachineFromSourceState(State state, Symbol symbol) {
        Predicate[] chain = { new EpsilonPredicate(), new SubmachineCallPredicate(), new SymbolPredicate(symbol) };
        Collection<Transition> result = CollectionUtils.select(
                CollectionUtils.select(transitions, new SourceStatePredicate(state)),
                PredicateUtils.anyPredicate(chain));
        return new ArrayList<>(result);
    }

    /**
     * Adiciona a transio no conjunto de transies.
     * @param t Transio a ser adicionada.
     */
    public void add(Transition t) {
        transitions.add(t);
    }

    /**
     * Consulta transies que consomem um determinado smbolo e chegam at o
     * estado de destino especificado.
     * @param symbol Smbolo a ser consumido.
     * @param state Estado de destino.
     * @return Transies que consomem um determinado smbolo e chegam at o
     * estado de destino especificado.
     */
    public List<Transition> withSymbolAndTargetState(Symbol symbol, State state) {
        Predicate[] chain = { new SymbolPredicate(symbol), new TargetStatePredicate(state) };
        Collection<Transition> result = CollectionUtils.select(transitions, PredicateUtils.allPredicate(chain));
        return new ArrayList<>(result);
    }

    /**
     * Remove a transio contendo o identificador informado do conjunto de
     * transies.
     * @param identifier Valor inteiro contendo o identificador da transio a
     * ser removida.
     */
    public void removeFromIdentifier(int identifier) {
        Transition result = null;
        for (Transition transition : transitions) {
            if (transition.getIdentifier() == identifier) {
                result = transition;
                break;
            }
        }
        if (result != null) {
            transitions.remove(result);
        }
    }

    /**
     * Retorna uma representao textual do conjunto de transies.
     * @return Representao textual do conjunto de transies.
     */
    @Override
    public String toString() {
        String newline = "\n";
        String tab = "  ";
        String bullet = ":: ";
        StringBuilder sb = new StringBuilder();
        sb.append("Conjunto de transies: {").append(newline);
        if (transitions.isEmpty()) {
            sb.append(tab).append("O conjunto est vazio.").append(newline);
        } else {
            for (Transition t : transitions) {
                sb.append(tab).append(bullet).append(t).append(newline);
            }
        }
        sb.append("}");
        return sb.toString();
    }

}