Revision: 12 Author: svanerac@xxxxxxxxx Date: Tue Oct 13 07:53:08 2009Log: Vi carico quello che ho fatto fino a adesso, ovvero buona parte delle classe Input e InputTast. Piccolo particolare: non funziona la lettura da tastiera, intesa proprio come getChar..e non capisco il motivo, anche perchè sto usando la classe servizio scaricata dal sito di baroni che mi sembra giusta!?!probabilmente è una cazzata ma non la trovo, quindi provate a vedere se riuscite a risolverla voi!
Il resto "dovrebbe" funzionare, mancano ancora i controlli per la correttezza dei dati inseriti (ad es: una relazione riguarda due transizioni che effettivamente esistono..). Questi probabilmente vanno fatti in jml sotto forma di pre e post condizioni. Prima di aggiungerli volevo comunque vedere se il resto funzionava ( cioè immettendo dei dati corretti).
Fate sapere... http://code.google.com/p/cooperativefsm/source/detail?r=12 Modified: /trunk/cooperativefsm/src/cooperativefsm/Fsm.java /trunk/cooperativefsm/src/cooperativefsm/Input.java /trunk/cooperativefsm/src/cooperativefsm/InputTast.java /trunk/cooperativefsm/src/cooperativefsm/InputXML.java /trunk/cooperativefsm/src/cooperativefsm/Main.java /trunk/cooperativefsm/src/cooperativefsm/MyMenu.java /trunk/cooperativefsm/src/cooperativefsm/Servizio.java /trunk/cooperativefsm/src/cooperativefsm/Simulazione.java /trunk/cooperativefsm/src/cooperativefsm/Stato.java /trunk/cooperativefsm/src/cooperativefsm/StatoCorrente.java /trunk/cooperativefsm/src/cooperativefsm/Transizione.java =======================================--- /trunk/cooperativefsm/src/cooperativefsm/Fsm.java Mon Oct 5 14:37:12 2009 +++ /trunk/cooperativefsm/src/cooperativefsm/Fsm.java Tue Oct 13 07:53:08 2009
@@ -11,19 +11,40 @@ private String id; private int numStati; - private Vector<Stato> stati; + private Vector<Stato> stati; private Vector<Transizione> transizioni; private int numRelazioniSincroneTransizioniUscenti; -- public Fsm (String _id, Vector<Stato> _stati,Vector<Transizione> _transizioni) { // costruttore di una macchina a stati finiti
- - id=_id; - stati = _stati; + /** + * Costruttore di una fsm + */ + + public Fsm (String _id) + { + id = _id; + stati = new Vector<Stato> (); + transizioni = new Vector<Transizione> (); + } ++ /** Costruttore (con argomenti in più...) di una macchina a stati finiti ... non so se servirà!?!
+ * + * @param _id + * @param _stati + * @param _transizioni + */ ++ public Fsm (String _id, Vector<Stato> _stati,Vector<Transizione> _transizioni) {
+ + id = _id; + stati = _stati; transizioni = _transizioni; } + + public String getId(){ + return id; + }public void addStato(Stato s) { //aggiunge uno stato al vector listaStati
stati.add(s); @@ -33,18 +54,32 @@ return stati; } - public Stato getStato (int indice) { + public Stato getStatoAt (int indice) { Stato s = (Stato) stati.get(indice); return s; } - public Vector<Transizione> getTransizioni() - { + + + + public void addTrans (Transizione t) { + transizioni.add(t); + } + + public Vector<Transizione> getTransizioni() { return transizioni; } - + public Transizione getTransizioneAt (int indice) { + Transizione t = transizioni.get(indice); + return t; + } + + + + + public void setTransizioniUscentiStati(){ //TODO } =======================================--- /trunk/cooperativefsm/src/cooperativefsm/Input.java Mon Oct 5 14:37:12 2009 +++ /trunk/cooperativefsm/src/cooperativefsm/Input.java Tue Oct 13 07:53:08 2009
@@ -8,117 +8,161 @@ import java.lang.*; -public class Input { -- //Attributi private, metodi public, information hiding ;), per accederci
- //utilizza i get e i set - - //Ricordati il specificatore del tipo di collection per i vector, - //tipo Vector<nome_classe> +public abstract class Input { + +//Per i nomi degli attributi fai riferimento ai diagrammi uml che ho fatto
- //Questi attributi sono in realtà variabili di appoggio che servono ai metodi (astatti)
- private Vector<Stato> listaS; - private Vector<Transizione> listaT;+ //Questi attributi sono in realtà variabili di appoggio che servono ai metodi (astatti) ... SERVONO????
+ //private Vector<Stato> listaS; + //private Vector<Transizione> listaT; +//La documentazione su come deve essere relazioniTransizioni è presente nelle mail
//Se non è ancora chiara contattami +private Simulazione.Relazione relazioniTransizioni[][]; //Relazione è un tipo enum che definisce i tipi di relazione
- private Vector<Fsm> listaFSM; + private Vector<Fsm> listaFsm; - /* - Metodo che inizializza una vera e propria sessione di simulazione - + + /** + * Metodo che inizializza una vera e propria sessione di simulazione + * La chiamata è comune sia per istanze di IputTast sia di InputXML,+ * mentre i metodi che devono specializzarsi sono sovrascritti nelle sottoclassi
*/ + public Simulazione leggiSimulazione() - { - int numFsm=2; - int i = 0; - for(i=0; i<numFsm; i++) - { - Fsm fsm = creaFsm (Integer.toString(i)); - listaFSM.add(fsm); - } - - //Lettura stato iniziale - StatoCorrente statoIniziale = leggiStatoIniziale(); - - //Lettura relazioni - relazioniTransizioni = leggiRelazioni(); - - //Controllo dei vincoli di correttezza della simulazione - if(!simulazioneCorretta() ) - { - //codice per comunicare l'errore all'utente - } -- //L'interfaccia tra io e core è data da questa riga, è l'unico punto di incontro - return (new Simulazione(listaFSM, relazioniTransizioni, statoIniziale));
- } + { + this.inizializzaListaFsm(); + ++ for (int i = 0; i < listaFsm.size(); i++) //si inizializza ogni istanza di fsm nella listaFsm + { //con i suoi stati e le sue transizioni
+ Fsm appoggio = listaFsm.elementAt(i); ++ int numStati = this.leggiNumStati(); //inserimento degli stati
+ this.inizializzaStati(appoggio, numStati); ++ this.inizializzaTrans(appoggio); //inserimento delle transizioni
+ } ++ StatoCorrente statoIniziale = leggiStatoIniziale(listaFsm); //Lettura stato iniziale + relazioniTransizioni = leggiNumRelazioni(); //Lettura relazioni
+ + while (ciSonoRelaz()) + imposta(relazioniTransizioni); ++ if(!simulazioneCorretta() ) //Controllo dei vincoli di correttezza della simulazione
+ {+ System.out.println("I dati inseriti non sono validi!");;
+ } + ++ return (new Simulazione(listaFsm, relazioniTransizioni, statoIniziale)); //L'interfaccia tra io e core è data da questa riga, è l'unico punto di incontro
+ } - - /*- *Metodo che controlla la correttezza delle informazione relative alla simulazione
- * che sono state introdotte/lette - * - */ - public boolean simulazioneCorretta () - { - boolean correct = true; - - ////// - - return correct; - } - - - - -+ //questi metodi in teoria saranno mai invocati perchè non sono mai create istanze della clase Input; + //saranno le loro versioni sovrascritte nelle varie sottoclassi a funzionare
+ + public abstract int leggiNumStati(); + + public abstract boolean ciSonoTrans(); + + public abstract Stato leggiStato(String a); + + /** + * Metodo che imposta lo stato iniziale e imposta lo stato corrente + * lo stato deve € al vettore macch1.listaStati --->controllo! + * @return + */ + + public abstract StatoCorrente leggiStatoIniziale(Vector<Fsm> list); + + public abstract void imposta(Simulazione.Relazione[][] relaz); + + public abstract boolean ciSonoRelaz(); + + + //fine metodi abstract + + + + public Vector<Fsm> getListaFsm () + { + return listaFsm; + } + + + + + /**+ * Metodo indipendente dal tipo di input, verrà chiamato da entrambe le sottoclassi. + * Definisce e istanzia un certo numero (2 in questo caso) di Fsm per la simulazione
+ */ + + public void inizializzaListaFsm() + { + int numFsm = 2; + + for(int i = 0; i < numFsm; i++) + { + Fsm fsm = creaFsm (Integer.toString(i)); + listaFsm.add(fsm); + } + } + + + /**- * Metodo che crea la lista degli stati di una fsm (che però non esiste ancora) - * La lettura del numero di stati può essere effettuata da tastiera o da file xml
- * + * Metodo che crea la lista degli stati di una fsm + ** @param Serve per identificare la fsm nel file xml, oppure è il nome assegnatole da tastiera
+ * @param Numero di stati */ - public void leggiStati (String nomeFsm) - { - listaS = new Vector(); - /*for (int i=0; i<numStati; i++) + + public void inizializzaStati (Fsm x, int numStat) + { + for (int i = 0; i < numStat; i++) { Stato s = new Stato (i); - macch1.addStato(s); - } - */ - - } + x.addStato(s); + } + } /**- * Metodo che crea la lista delle transizioni di una fsm (che però non esiste ancora) - * La lettura delle transizioni può essere effettuata da tastiera o da file xml
- *- * @param Serve per identificare la fsm nel file xml, oppure è il nome assegnatole da tastiera
+ * Metodo che crea la lista delle transizioni di una fsm + * + * @param La Fsm a cui va aggiunta una transizione + * @param Stato sorgente della transizione + * @param Stato destinazione della transizione */ - public void leggiTransizioni (String nomeFsm) - { - listaT = new Vector(); - boolean ciSonoTrans= true; - - while (ciSonoTrans) - { - //Stato sorg,dest; - //Transizione t = new Transizione(sorg,dest); - //macch1.listaTrans.add(t); - } - - } + public void inizializzaTrans (Fsm x) + { + ++ boolean continua = this.ciSonoTrans(); //metodo che verrà sovrascritto dalle sottoclassi
+ + while (continua) + { + Stato sorgente = this.leggiStato("sorgente"); + Stato destinazione = this.leggiStato("destinazione");+ //Controllo per verificare che gli stati € alla fsm [...] <--------------TODO------------------!!!!!
+ + Transizione t = new Transizione (sorgente,destinazione); + x.addTrans(t); + + continua = this.ciSonoTrans(); + }//while + + + } @@ -129,46 +173,54 @@ * @return la nuova istanza di Fsm */ - public Fsm creaFsm (String nome){ - Fsm macchina= new Fsm ( nome , listaS, listaT); - + public Fsm creaFsm (String nome) + { + Fsm macchina= new Fsm ( nome ); return macchina; } - - //ottiene dal parser lo stato iniziale e imposta lo stato corrente - //lo stato deve € al vettore macch1.listaStati --->controllo! - public StatoCorrente leggiStatoIniziale() - { - StatoCorrente s = new StatoCorrente (); - - //s.sCorrenteFsm1 = ; - //s.sCorrenteFsm2 = ; - - return s; - } + + + + /** + * Metodo che ricava le relazioni tra le transizioni delle 2 FSM+ * @return il vettore contenente le relazioni tra TUTTE le transizioni [...]
+ */ + public Simulazione.Relazione[][] leggiNumRelazioni () + {+ int n = listaFsm.elementAt(0).getTransizioni().size();//N° transizioni prima fsm + int m = listaFsm.elementAt(1).getTransizioni().size();//..seconda + Simulazione.Relazione relazioniTransizioni[][] = (new Simulazione.Relazione [n+1][m+1]);
+ + for (int i=0; i<n+1; i++) + { + for(int j=0; j<m+1; j++)+ relazioniTransizioni[i][j] = relazioniTransizioni[i][j].ASINCRONA; //di default le transizioni sono asincrone tra loro, + //solo quelle sincrone e m-ex saranno specificate
+ } + + return relazioniTransizioni; + } + - /** - * Metodo che ricava le relazioni tra le transizioni delle 2 FSM- * @return il vettore contenente le relazioni tra TUTTE le transizioni [...]
- */ - public Simulazione.Relazione[][] leggiRelazioni (){- int n = listaFSM.elementAt(0).getTransizioni().size();//N° transizioni prima fsm - int m = listaFSM.elementAt(1).getTransizioni().size();//..seconda - Simulazione.Relazione _relazioniTransizioni[][] = new Simulazione.Relazione[n+1][m+1];
- - Transizione t1,t2; - //RelazioneTransizioni r = new RelazioneTransizioni (t1,t2); - //listaRelazioni.add(r); - - return relazioniTransizioni; - } - - + /**+ * Metodo che controlla la correttezza delle informazione relative alla simulazione
+ * che sono state introdotte/lette + * + */ + public boolean simulazioneCorretta () + { + boolean correct = true; + + //TODO + + return correct; + } + } =======================================--- /trunk/cooperativefsm/src/cooperativefsm/InputTast.java Sat Oct 3 08:01:59 2009 +++ /trunk/cooperativefsm/src/cooperativefsm/InputTast.java Tue Oct 13 07:53:08 2009
@@ -1,10 +1,105 @@ package cooperativefsm; /**+ * Classe che eredita dalla classe padre Input, e ne sovrascrive alcuni metodi in modo da
+ * specializzarli per la lettura da tastiera * * @author Renato */ + +import java.util.Vector; + public class InputTast extends Input { - //super. -} + + private final String RICH_STATI = "Inserisci il numero di stati: ";+ private final String RICH_TRANS = "Vuoi inserire una nuova transizione? ";
+ private final String INS_STATO = "Inserire il numero dello stato ";+ private final String INS_RELAZ = "Vuoi inserire una nuova relazione tra transizioni? "; + private final String TIPO_RELAZ = "TIPO DI RELAZIONE TRA LE TRANSIZIONI"; + private final String [] SCELTA_RELAZ = {"Relazione sincrona","Relazione mutuamente esclusiva"};
+ + private final int min_stati = 2; + + + /** + * Costruttore specializzato per l'input da tastiera. + */ + public InputTast () + { + + } + + + public @Override Stato leggiStato (String a) + {+ Stato s = new Stato (Servizio.leggiInteroConMinimo(INS_STATO + a + ": ", 0));
+ return s; + } + + + public @Override int leggiNumStati () + {+ int numStati = Servizio.leggiInteroConMinimo(RICH_STATI, min_stati);
+ return numStati; + } + + + /** + * + * @return + */ + public @Override boolean ciSonoTrans () + { + boolean ciSono = Servizio.yesOrNo(RICH_TRANS); + return ciSono; + } + + + /** + * + * @param lista: la lista contenente le fsm + * @return lo stato corrente + * + */ + public @Override StatoCorrente leggiStatoIniziale (Vector<Fsm> lista) + { + StatoCorrente s = new StatoCorrente (); ++ Stato c1 = leggiStato("corrente della fsm " + lista.get(0).getId()); + Stato c2 = leggiStato("corrente della fsm " + lista.get(1).getId());
+ + //TODO controllo di appartenenza + + s.setStati( c1, c2 ); + return s; + } + + public @Override boolean ciSonoRelaz() + { + return Servizio.yesOrNo(INS_RELAZ); + } + + /** + * imposta una relazione tra due transizioni € a due fsm diverse + * @param relaz + */ + + public @Override void imposta(Simulazione.Relazione[][] relaz) + {+ int t1 = Servizio.leggiInteroConMinimo("Transizione di riferimento della fsm 1", 0);
+ //controllo di appartenenza+ int t2 = Servizio.leggiInteroConMinimo("Transizione di riferimento della fsm 2", 0);
+ //controllo di appartenenza + + MyMenu sceltaTipo = new MyMenu ( TIPO_RELAZ, SCELTA_RELAZ); + int sel = sceltaTipo.scegli(); + + switch (sel) + { + case 1: (relaz[t1][t2]) = (relaz[t1][t2]).SINCRONA; + case 2: (relaz[t1][t2]) = (relaz[t1][t2]).M_EX; + break; + } + } +} =======================================--- /trunk/cooperativefsm/src/cooperativefsm/InputXML.java Sat Oct 3 08:01:59 2009 +++ /trunk/cooperativefsm/src/cooperativefsm/InputXML.java Tue Oct 13 07:53:08 2009
@@ -9,11 +9,25 @@ * * @author Renato */ + +import java.util.Vector; + public class InputXML extends Input { public InputXML() { } + public @Override int leggiNumStati(){return 0;} + + public @Override boolean ciSonoTrans(){ return true;} + + public @Override boolean ciSonoRelaz() {return true;} + + public @Override void imposta (Simulazione.Relazione [][] relaz) {} + + public @Override Stato leggiStato(String a){ return new Stato(0);} ++ public @Override StatoCorrente leggiStatoIniziale(Vector<Fsm> list) {return new StatoCorrente();}
} =======================================--- /trunk/cooperativefsm/src/cooperativefsm/Main.java Sat Oct 3 08:01:59 2009 +++ /trunk/cooperativefsm/src/cooperativefsm/Main.java Tue Oct 13 07:53:08 2009
@@ -20,38 +20,39 @@ * @param args the command line arguments */ - public static void main(String[] args) { - - final String TIPOINPUT = "TIPO DI INPUT"; - final String [] SCELTAINPUT = {"da tastiera","da file xml"}; - final String MESS_FINALE = "CIAO!"; - - MyMenu menuInput = new MyMenu( TIPOINPUT , SCELTAINPUT ); - boolean fineProgramma=false; - - int selezione = menuInput.scegli(); - - Input in; - switch (selezione) - { - case 1: in = new InputTast(); - case 2: in = new InputXML(); - default: in = new Input(); - break; - } - -- Simulazione s = in.leggiSimulazione(); //leggiSimulazione è un metodo della interfaccia Input, - //da cui ereditano le classi InputTast e InputXML
- - while (!fineProgramma) - { - fineProgramma = s.eseguiIterazione(); - } - - - System.out.println(MESS_FINALE); - + public static void main(String[] args) + { + final String TIPOINPUT = "TIPO DI INPUT"; + final String [] SCELTAINPUT = {"da tastiera","da file xml"}; + final String MESS_FINALE = "CIAO!"; + + MyMenu menuInput = new MyMenu( TIPOINPUT , SCELTAINPUT ); + boolean fineProgramma=false; + + int selezione = menuInput.scegli(); + + Input in = null; + + switch (selezione) + { + case 1: {in = new InputTast(); System.out.println("ok");} + case 2: in = new InputXML(); + default : System.out.println("boh"); + } + ++ Simulazione s = in.leggiSimulazione(); //leggiSimulazione è un metodo della classe Input, + //da cui ereditano le classi InputTast e InputXML
+ + while (!fineProgramma) + { + fineProgramma = s.eseguiIterazione(); + } + + + System.out.println(MESS_FINALE); + + } =======================================--- /trunk/cooperativefsm/src/cooperativefsm/MyMenu.java Sat Oct 3 08:01:59 2009 +++ /trunk/cooperativefsm/src/cooperativefsm/MyMenu.java Tue Oct 13 07:53:08 2009
@@ -1,8 +1,3 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ - package cooperativefsm; /** @@ -31,10 +26,14 @@ this.voci = voci; } - public int scegli () + /** + * + * @return + */+ public int scegli () //NB: non è stato fatto nessun controllo che il carattere inserito sia un intero
{ stampaMenu(); - return Servizio.leggiIntero(RICHIESTA_INSERIMENTO, 0, voci.length); + return Servizio.leggiIntero(RICHIESTA_INSERIMENTO, 0 ,voci.length); } public void stampaMenu () =======================================--- /trunk/cooperativefsm/src/cooperativefsm/Servizio.java Sat Oct 3 08:01:59 2009 +++ /trunk/cooperativefsm/src/cooperativefsm/Servizio.java Tue Oct 13 07:53:08 2009
@@ -5,6 +5,8 @@ * @author Renato */ import java.util.Scanner; +import java.io.*; +import java.lang.*; public class Servizio { @@ -19,7 +21,7 @@ private final static char RISPOSTA_SI='S'; private final static char RISPOSTA_NO='N'; - + private static Scanner creaScanner () { @@ -70,6 +72,7 @@ System.out.println(ERRORE_STRINGA_VUOTA); } } while (!finito); + return valoreLetto; } =======================================--- /trunk/cooperativefsm/src/cooperativefsm/Simulazione.java Mon Oct 5 14:37:12 2009 +++ /trunk/cooperativefsm/src/cooperativefsm/Simulazione.java Tue Oct 13 07:53:08 2009
@@ -14,6 +14,7 @@ ASINCRONA, M_EX } + private Vector<Fsm> listaFsm;private Vector<TransizioniAbilitate> transizioniAbilitate; //lista dinamica che varia a seconda dello stato corrente
=======================================--- /trunk/cooperativefsm/src/cooperativefsm/Stato.java Mon Oct 5 14:37:12 2009 +++ /trunk/cooperativefsm/src/cooperativefsm/Stato.java Tue Oct 13 07:53:08 2009
@@ -9,7 +9,8 @@ public class Stato { - private int idStato;+ private int idStato; //è il numero progressivo assegnato allo stato, riferito alla fsm cui appartiene + private String nome; //identifica un certo stato (attributo opzionale)
private Vector<Transizione> transizioniUscenti; =======================================--- /trunk/cooperativefsm/src/cooperativefsm/StatoCorrente.java Sat Oct 3 08:01:59 2009 +++ /trunk/cooperativefsm/src/cooperativefsm/StatoCorrente.java Tue Oct 13 07:53:08 2009
@@ -6,9 +6,23 @@* La classe stato corrente definisce la situazione della simulazione in un certo istante
* */ -public class StatoCorrente { - +public class StatoCorrente + +{ public Stato sCorrenteFsm1; public Stato sCorrenteFsm2; -} + /** + * Imposta gli stati correnti delle varie fsm+ * Per comodità si dà per scontato che le macchine di una simulazione siano 2
+ * + * @param corrente1 + * @param corrente2 + */ + public void setStati ( Stato corrente1, Stato corrente2 ) + { + sCorrenteFsm1 = corrente1; + sCorrenteFsm2 = corrente2; + } +} + =======================================--- /trunk/cooperativefsm/src/cooperativefsm/Transizione.java Mon Oct 5 14:37:12 2009 +++ /trunk/cooperativefsm/src/cooperativefsm/Transizione.java Tue Oct 13 07:53:08 2009
@@ -11,21 +11,33 @@ */ public class Transizione { - private int id;+ private int id; //è il numero progressivo assegnato alla transizione, riferito alla fsm cui appartiene + private String nome; //identifica una certa transizione (attributo opzionale)
private Stato stato1; private Stato stato2;private int numRelazioniSincroneStatoCorrente; //Indica quanti relazioni sincrone ha con altre transizioni nello stato corrente
- public Transizione(Stato _stato1, Stato _stato2) { - stato1=_stato1; - stato2=_stato2; + /**+ * Costruttore di una transizione a partire da due stati di una stessa fsm
+ * + * @param _stato1 + * @param _stato2 + */ + + public Transizione(Stato _stato1, Stato _stato2) + { + stato1 = _stato1; + stato2 = _stato2; }- public void setNumRelazioniSincroneStatoCorrente( Simulazione.Relazione relazioni[][]){
++ public void setNumRelazioniSincroneStatoCorrente( Simulazione.Relazione relazioni[][])
+ { //TODO } - public int getNumRelazioniSincroneStatoCorrente(){ + public int getNumRelazioniSincroneStatoCorrente() + { //TODO