PDA

Visualizza la versione completa : [java] ottimizzazione codice


rinosan_76
24-05-2004, 20:08
Ciao a tutti... sto realizzando un sistema per interrogare una pagina ASP attraverso un'applet (a dire il vero è un javascript che fa richieste all'applet la quale interroga l'asp) un po' come i remotescripting di microsoft.
Ora il codice l'ho scritto, e sembra funzionare... mi chiedevo se potevate aiutarmi ad ottimizzarlo, io non sono un utente esperto di java e sicuramente ho fatto degli errori. Posto il codice (445 righe):


/* Realizzata da AKKAttp S.n.c.
*
*
*/

import java.applet.Applet;
import java.awt.Graphics;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.*;


public class AKKAremote extends Applet{

private Dati d;
private Leggi leg;
private Scrivi scr;

public AKKAremote(){
d=new Dati();
}

public void init(){}

public void setDivisoreDati(String a){
d.setDivis(a);
}

public String getDivisoreDati(){
return d.getDivis();
}

public void inviaRichiesta(String a){
scr = new Scrivi(d);
scr.setIndirizzo(a);
scr.start();
}

public String riceviRichiesta(){
leg = new Leggi(d);
leg.start();
while(!d.isInviato()){ }
repaint();
scr=null;
leg=null;
return d.toString();
}

public void paint(Graphics g){
g.drawString("Letto da: "+d.getHost(),10,25 );
g.drawString("Nome richiesta: "+d.getNome() ,10,40 );
g.drawString("Stato dati: "+d.getStatoDati() ,10,55);
g.drawString("Tipo dati: "+d.getTipoDati() ,10,70 );
g.drawString("Separatore: "+d.getSeparatore(),10,85 );
g.drawString("Dati: "+ d.getValore(),10,100);
g.drawString("Flag Errore: "+ d.getFlagErrore(),10,115);
g.drawString("MSG Errore: "+ d.getMsgErrore(),10,130);
g.drawString("Str ricevuta: "+ d.getRicevuto(),10,145);
}


/*
public static void main(String[] args){
Dati d=new Dati();
Scrivi scr = new Scrivi(d);
scr.setIndirizzo("http://localhost/akkaremote/functions.asp");
Leggi leg = new Leggi(d);
scr.start();
leg.start();
while(!d.isInviato()){}
System.out.println("Leggo...: "+d.getValore());
}
*/

}

//***************************** Classe SCRIVI **********************************

class Scrivi extends Thread{

private Dati dati;
private BufferedReader in;
private InputStream inputstream;
private StringTokenizer st;
private int contaRichiesta=0;
private String ricevuto="";
private String indirizzo="";

public Scrivi(Dati v){
dati=v;
}

public void run(){
inserisci(indirizzo);
}

public void setIndirizzo(String a){
indirizzo=a;
}

public String getIndirizzo(){
return indirizzo;
}

public void inserisci(String a){
synchronized (dati){
//try{
if(!isInterrupted()){
dati.resetta();
dati.setHost(a);
contaRichiesta++;
dati.setNome("Richiesta n°" + contaRichiesta);
prendiDati(a);
}
//}catch(InterruptedException e){}
}
}

protected void prendiDati(String host){
URL url;
dati.setStato(1);
try{
url = new URL(host);
inputstream = (url).openStream();
dati.setMsgErrore(inputstream.toString());
in = new BufferedReader(new InputStreamReader(inputstream));
String line;
while ((line = riceviMessaggio())!=null){
if (line.equals("")) continue;
dati.setStato(2);
st = new StringTokenizer(line);
int count = st.countTokens();
if(count>=9) break;
}
ricevuto=line;
dati.setRicevuto(ricevuto);
try{
String cmd=st.nextToken();
if(cmd.equals("START")){
cmd=st.nextToken();
if(cmd.equals("TYPE")){
cmd=st.nextToken();
dati.setTipo(calcolaTipo(cmd));
cmd=st.nextToken();
if(cmd.equals("SEP")){
cmd=st.nextToken();
dati.setSeparatore(cmd);
cmd=st.nextToken();
if(cmd.equals("DATA")){
cmd=st.nextToken();
dati.setValore(cmd);
cmd=st.nextToken();
if(cmd.equals("ERROR")){
cmd=st.nextToken();
if(cmd.equals("0")){
dati.setFlagErrore(false);
dati.setMsgErrore("Nessun Errore!");
}else{
dati.setFlagErrore(true);
dati.setMsgErrore(cmd);
}
cmd=st.nextToken();
if(cmd.equals("END")){
dati.setStato(3);
}else{
dati.setFlagErrore(true);
dati.setMsgErrore("Stringa di ritorno senza terminazione END");
}
}else{
dati.setFlagErrore(true);
dati.setMsgErrore("Alla stringa di ritorno manca l'ERROR");
}
}else{
dati.setFlagErrore(true);
dati.setMsgErrore("Alla stringa di ritorno manca il DATA");
}
}else{
dati.setFlagErrore(true);
dati.setMsgErrore("Alla stringa di ritorno manca il SEP");
}
}else{
dati.setFlagErrore(true);
dati.setMsgErrore("Alla stringa di ritorno manca il TYPE");
}
}else{
dati.setFlagErrore(true);
dati.setMsgErrore("Alla stringa di ritorno manca lo START");
}
}catch(NoSuchElementException _e){
dati.setFlagErrore(true);
dati.setMsgErrore(_e.toString());
}

inputstream.close();
//thread.stop();

}catch(FileNotFoundException _e){
dati.setFlagErrore(true);
dati.setMsgErrore("File Not Found! Manca il file contenente le funzioni lato server.");
}catch(MalformedURLException _e){
dati.setFlagErrore(true);
dati.setMsgErrore("Errore! L'URL non è scritto correttamente.");
}catch(IOException _e){
dati.setFlagErrore(true);
dati.setMsgErrore("Errore di IO nella funzione prendiDati.");
dati.resetta();
}
}

private String riceviMessaggio() {
String line = null;
try {
line = in.readLine();
} catch (IOException e) {
dati.setFlagErrore(true);
dati.setMsgErrore("Errore di IO nella funzione riceviMessaggio.");
}
return line;
}

private int calcolaTipo(String a){
int val;
if(a.equals("0")) val=0; //null
else if(a.equals("1")) val=1; //boolean
else if(a.equals("2")) val=2; //byte
else if(a.equals("3")) val=3; //int
else if(a.equals("4")) val=4; //long
else if(a.equals("5")) val=5; //float
else if(a.equals("6")) val=6; //double
else if(a.equals("7")) val=7; //char
else if(a.equals("8")) val=8; //string
else if(a.equals("9")) val=9; //array
else if(a.equals("10")) val=10; //date
else val=-1; // non esistente
return val;
}

}

//***************************** Classe LEGGI ***********************************

class Leggi extends Thread{

Dati dati;

public Leggi(Dati v){
dati=v;
}

public void estrapola(){
synchronized (dati){
//System.out.println("Sto abilitando la lettura");
dati.setStato(4);
}
}

public void run(){
estrapola();
}

}

//***************************** Classe DATI ************************************

class Dati{

private String valore,nome,msgErrore,host,separatore,ricevuto,div is;
private int stato,tipo;
private boolean flagErrore;

public Dati(){
nome="Senza Nome";
stato=0;
tipo=8;
flagErrore=false;
msgErrore="Nessun Errore!";
valore="";
host="";
separatore="";
ricevuto="";
divis="[T]";
}

public void resetta(){
this.setNome("Senza nome");
this.setStato(0);
this.setTipo(8);
this.setFlagErrore(false);
this.setMsgErrore("Nessun Errore!");
this.setValore("");
this.setSeparatore("");
this.setRicevuto("");
}

public String getNome(){
return nome;
}

public String getDivis(){
return divis;
}

public String getSeparatore(){
return separatore;
}

public String getHost(){
return host;
}

public int getStato(){
return stato;
}

public int getTipo(){
return tipo;
}

public boolean getFlagErrore(){
return flagErrore;
}

public String getMsgErrore(){
return msgErrore;
}

public String getValore(){
return valore;
}

public String getTipoDati(){
String a;
switch (tipo){
case 0: a="null";
break;
case 1: a="boolean";
break;
case 2: a="byte";
break;
case 3: a="int";
break;
case 4: a="long";
break;
case 5: a="float";
break;
case 6: a="double";
break;
case 7: a="char";
break;
case 8: a="string";
break;
case 9: a="array";
break;
case 10: a="date";
break;
case -1: a="inesistente";
break;
default: a="Tipo non compatibile";
}
return a;
}

public String getStatoDati(){
String a;
switch (stato){
case 0: a="libero";
break;
case 1: a="inizio";
break;
case 2: a="incompleto";
break;
case 3: a="completo";
break;
case 4: a="inviato";
break;
default: a="Stato non precisato";
}
return a;
}

public void setDivis(String a){
divis=a;
}

public String getRicevuto(){
return ricevuto;
}

public void setNome(String a){
nome=a;
}

public void setSeparatore(String a){
separatore=a;
}

public void setHost(String a){
host=a;
}

public void setStato(int a){
stato=a;
}

public void setTipo(int a){
tipo=a;
}

public void setFlagErrore(boolean a){
flagErrore=a;
}

public void setMsgErrore(String a){
msgErrore=a;
}

public void setValore(String a){
valore=a;
}

public void setRicevuto(String a){
ricevuto=a;
}

public boolean isLibero(){
if(stato==0)
return true;
else
return false;
}

public boolean isInviato(){
if(stato==4)
return true;
else
return false;
}

public String toString(){
String str =this.getFlagErrore()+divis+this.getTipo()+divis+t his.getValore()+divis+this.getSeparatore()+divis+t his.getMsgErrore();
return str;
}

}


Spero che qualcuno colga il mio appello!
Grazie
Rino

V1RuZ
24-05-2004, 20:13
in breve? non puoi sintetizzare tu i punti dove credi che il codice sia da ottimizzare? Credo che nessuno abbia voglia di leggersi 445 righe di codice

rinosan_76
24-05-2004, 20:14
continuo da prima...
La pagina ASP deve scrivere una stringa così:

START TYPE 8 SEP [S] DATA qualcosa ERROR 0 END

Mentre il javascript deve solo richiamare i metodi inviaRichiesta() e riceviRichiesta()


var urlPaginaASP="http://localhost/...";
nomeApplet.inviaRichiesta(urlPaginaASP);
var ss=nomeApplet.riceviRichiesta();
alert(ss);

Spero che ora abbiate tutto il necessario per aiutarmi!
Ciao

rinosan_76
26-05-2004, 11:00
up

rinosan_76
03-06-2004, 16:20
Originariamente inviato da V1RuZ
in breve? non puoi sintetizzare tu i punti dove credi che il codice sia da ottimizzare? Credo che nessuno abbia voglia di leggersi 445 righe di codice

Non avevo più letto il 3d... hai ragione!
Allora in effetti le parti da ottimizzare sono quelle legate alla sincronizzazione dei thread e delle loro chiamate, quindi la classe Leggi e la classe Scrivi (controllare se sono corrette) ed i metodi inviaRichiesta() e riceviRichiesta() (controllare se richiamano correttamente i thread).
Facendo delle prove in java tutto sembra funzionare, ma da javascript ho l'impressione che richiamando prima inviaRichiesta() e dopo riceviRichiesta() la sincronizzazione funzioni male. Mi sembra che alla prima chiamata non arrivi nessuna risposta, mentre alla seconda arrivi la risposta della prima e così via.

Altro punto, funzionante, ma non so se ottimizzato è il prendiDati() nelle prime righe... ho usato bene tutti gli oggetti o si poteva far di meglio? Nella gestione degli errori... si può far resettare il tutto rendendo l'applet nuovamente funzionante in caso di errori come IOException? Normalmente se si verifica l'errore devo ricaricare la pagina.

rinosan_76
15-06-2004, 16:34
up

Loading