/** FILE: simulator.java **/
package SIMULA;
import BUFFER.*;
import java.io.*;
import java.util.*;
// Referenced classes of package SIMULA:
// Maingetter, fine, getter, grafico,
// putter
/*
* CLASS simulator
*
* Al momento della creazione, presi in input gli opportuni parametri (--> vedi interfaccia.java),
* salva il contenuto del file in un array di byte, lo converte in stringa per poi tokenuzzarlo
* (spezzettarlo in singoli messaggi) con tre delimitatori, lo spazio la tabulazione e l'invio.
* Quando viene lanciato crea un thread maingetter (--> vedi Maingetter.java) e N thread putter
* dove N=numero di token in input(messaggi).
* Poi attende che siano terminati tutti i getter(--> vedi getter.java) lanciati da maingetter.
* Infine lancia due oggetti grafico (--> vedi grafico.java) e uno fine (--> vedi fine.java).
*
*/
public class simulator extends Thread
{
/*
* COSTRUTTORE(1)
*
* impostazione delle variabili e dei token dal file
* inoltre mi ricavo modulo moltipliando beta per in numero di messaggi
*
*/
simulator(FileInputStream fileinputstream, int i, float f, String s, boolean flag)
{
System.out.println("\n\nNuova Simulazione");
totcaratteri = 0;
piugrande = 0;
piupiccola = 200;
numparole = 0;
tolleranza = 0;
nograp = flag;
nomefile = s;
alpha = f;
beta = i;
try
{
byte abyte0[] = new byte[fileinputstream.available()]; // crea un vettore di appoggio
fileinputstream.read(abyte0); // vi copia dentro il contenuto del file
fileinputstream.close(); // chiude il file
String s1 = new String(abyte0, 0); // copia il contenuto del vettore in una nuova stringa
tin = new StringTokenizer(s1); // tokenizza la stringa
}
catch(Exception _ex) { }
modulo = i * tin.countTokens(); // beta*numero_messaggi per ottenere un tempo medio di interarrivo
// pari a beta impostiamo il limite superiore di dormita(modulo).
// ipotizzando una distribbuzione casuale ma omoggenea possiamo
// affermare che il tempo medio di interarrivo č proprio beta.
}
/*
* COSTRUTTORE(2)
*
* impostare, secondo i dati in input, la politica di gestione del buffer.
* (--> vedi package BUFFER - buffer.java)
*/
public simulator(boolean flag, float f, int i, FileInputStream fileinputstream, String s, boolean flag1)
throws IOException
{
this(fileinputstream, i, f, s, flag1);
if(flag)
{
politica = "F.I.F.O.";
buffer = new bufferfi(); // FIFO --> vedi bufferfi.java
return;
}
else
{
politica = "Anarchica";
buffer = new bufferan(); // ANARCHICA --> vedi bufferan.java
return;
}
}
/*
* COSTRUTTORE(3)
*
* impostare, secondo i dati in input, la politica di gestione del buffer.
* (--> vedi package BUFFER - buffer.java)
*/
public simulator(int i, float f, int j, FileInputStream fileinputstream, String s, boolean flag)
throws IOException
{
this(fileinputstream, j, f, s, flag);
politica = "Personalizzata";
buffer = new buffermy(i); // PERSONALIZZATA --> vedi buffermy.java
tolleranza = i;
}
/*
* METODO caso()
*
* restituisce un valore casuale da 0 a modulo (cosč modulo?? --> vedi COSTRUTTORE(1))
*/
static float caso()
{
return (float)Math.abs(1.0D + (double)((float)r.nextInt() % (float)modulo));
}
/*
* METODO caricaparola()
*
* restituisce un messaggio (token) effettuando alcuni controlli:
* 1) piupiccola e piugrande per avere il range dei messaggi inviati
* 2) se il messaggio č pių lungo di 200 caratteri restituisce 200 asterischi
*
*/
private String caricaparola()
{
String s = "";
try
{
s = tin.nextToken();
}
catch(Exception _ex) { }
if(s == " ")
s = "*";
if(s.length() > 200)
for (int h=0; h<200; h++)
s = s+ '*';
totcaratteri += s.length();
if(piupiccola > s.length())
piupiccola = s.length();
if(piugrande < s.length())
piugrande = s.length();
numparole++;
return s;
}
/*
* METODO visualizza_accessi()
*
* crea tre finestre: due grafico (--> vedi grafico.java) e una fine (--> vedi fine.java)
*
*/
public void visualizza_accessi()
{
if(buffer.accessi != 0)
{
grafico grafico1 = new grafico(buffer.Startaccput, "Mittenti");
grafico grafico2 = new grafico(buffer.Startaccget, "Destinatari");
new fine(grafico1.tempomedio, grafico2.tempomedio);
}
}
/*
* METODO run()
*
* crea un thread maingetter (--> vedi Maingetter.java) e N thread putter dove N=numero di token
* in input(messaggi).
* Poi attende che siano terminati tutti i getter(--> vedi getter.java) lanciati da maingetter.
*/
public void run()
{
int i = tin.countTokens();
T = new getter[i];
Maingetter maingetter = new Maingetter(buffer);
maingetter.start();
millisecondi = (new Date()).getTime(); // prende i millisecondi di partenza
try
{
for(int j = 0; j < i; j++)
(new putter(buffer, caricaparola())).start(); // crea e lancia il thread
maingetter.join(); // attende che maingetter termini
for(int k = 0; k < i; k++)
T[k].join(); // attende che termini il thread
}
catch(Exception _ex) { }
millisecondi = (new Date()).getTime() - millisecondi; // tempo che impiega la simulazione
visualizza_accessi();
}
/*
* VARIABILI
*
*/
buffer buffer;
static long millisecondi;
static float alpha;
static String nomefile;
static Random r = new Random();
static int beta;
static getter T[];
static String politica;
static int totcaratteri;
static int piugrande;
static int piupiccola = 200;
static int numparole;
static int tolleranza;
static int maxget;
static int maxput;
StringTokenizer tin;
static int modulo;
static int chiudi;
static boolean nograp;
}