Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [java] ottimizzazione codice

    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):
    codice:
    /*	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,divis;
     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+this.getValore()+divis+this.getSeparatore()+divis+this.getMsgErrore();
      return str;
     }
     	
    }
    Spero che qualcuno colga il mio appello!
    Grazie
    Rino

  2. #2
    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

  3. #3
    continuo da prima...
    La pagina ASP deve scrivere una stringa così:
    codice:
     START TYPE 8 SEP [S] DATA qualcosa ERROR 0 END
    Mentre il javascript deve solo richiamare i metodi inviaRichiesta() e riceviRichiesta()
    codice:
    var urlPaginaASP="http://localhost/...";
    nomeApplet.inviaRichiesta(urlPaginaASP);
    var ss=nomeApplet.riceviRichiesta();
    alert(ss);
    Spero che ora abbiate tutto il necessario per aiutarmi!
    Ciao

  4. #4
    up

  5. #5
    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.

  6. #6
    up

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.