Java tutorial
/** * ------------------------------------------------------ * 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(); } }