Newsgroup: it.comp.java
Titolo: compilare runtime

Seguendo un vostro consiglio (anche se non era diretto a me [vd. e-mails con
soggetto "compilare runtime"]) ho scritto nella mia applicazione le seguenti
istruzioni, per compilare i sorgenti all'interno dell'applicazione stessa:
Runtime run = Runtime.getRuntime();
Process c = run.exec(command);
InputStream inStream = c.getInputStream();
OutputStream outStream = c.getOutputStream();
text = "is:\n" + inStream.toString() + "\nos:\n" + outStream.toString();
System.out.println(text);
inStream.close();
compilare, compila; ma il problema sta nel fatto che la stringa text risulta
uguale a ca:
is:
java.lang.ProcessInputStream@6232b5
os:
java.io.BufferedOutputStream@6f144c
Dov'è che sbaglio?
Anticipatamente grazie,
Nihil

 
a dire il vero non ho capito cosa dovrebbe rappresentare la variabile
"text"... cmq a quanto vedo chiami il metodo toString() sugli oggetti
stream di input e output e non (come probabilmente dovresti) sui dati
che vengono trasportati dagli stessi (le stringhe che formano l'input e
l'output del processo da te avviato)!
Se il tuo scopo e' catturare e stampare l'output del processo generato,
ho gia` postato domenica scorsa in risposta a Mario un semplice esempio
che fa proprio questo.
-- 
Ciao,  |  I play Russian roulette everyday, a man's sport,
Matteo |  With a bullet called life, yeah called life, (SUGAR)

 Matteo |  With a bullet called life, yeah called life, (SUGAR)
Ciao e grazie,
Nihil


Ho seguito il tuo esempio ma, se il sorgente è corretto la classe non viene
generata; se contiene errori le stringhe che catturano l'output rimangono
vuote...
Che faccio? Mi sparo?
Nihil

 
Ho controllato: a me la compila ed esegue correttamente.
Se il processo che generi manda in output sul proprio "standard error
stream" potresti aver bisogno di leggere da quello (lo ottieni con
getErrorStream() di Process), ma ho fatto una prova e gia` cosi`
dovrebbe cmq funzionare...
Non so`: spiegati meglio, altrimenti non posso aiutarti.



Anch'io ho provato a compilare ed eseguire la tua classe ma non mi fa (anzi
mi stampa l'errore sollevato dal primo catch).
Tutti questi miei problemi possono dipendere dal fatto che uso il jdk 1.3
(su linux)? Tu quale stai usando?
Oppure può essere che dipenda dal fatto che ho usato BufferedReader invece
di DataInputStream? [non credo!]
ho usato:
InputStreamReader inStream = new InputStreamReader(p.getInputStream());
// p è il processo chiamato per compilare
BufferedReader in = new BufferedReader(inStream);
NB: new BufferedReader(p.getInputStream()); mi dava errore...
Cosa mi consigli?
Decapitazione o Avvelenamento  ?¿
Ti ringrazio enormemente per la tua disponibilità,
Nihil

 
di chi? ;-)


 di chi? ;-)
La mia!!!
Ancora grazie,
Nihil


 [cut]
Scusa per il ritardo con cui ti rispondo, ma ho avuto un paio di
scadenze di lavoro da rispettare, e pochissimo tempo per tutto il resto.
Cmq ho dato un'occhiata al tuo codice: cosi` sbrigativamente non ho
notato errori ...se non gira io rimango dell'idea che potrebbe essere un
problema di "riga di comando" (quella eseguita tramite l'istanza
Runtime.getRuntime()).
Non so` se nel frattempo gia` hai risolto. Se cosi` non fosse puoi dare
un'occhiata al seguente codice che ho buttato giu` adesso al volo:
implementa un'interfaccia per il javac *estremamente rudimentale* (AWT
"very old style", pieno di codice deprecated, ecc) ma funzionante
(almeno *credo* ! ;-).
Il programma e` composto da 3 classi (che andrebbero poste ognuna nel
rispettivo .java, anche se io le copiero` qui sotto una di seguito
all'altra, e indichero` una sola volta la sezione di import, che e`
comune a tutti e 3 i sorgenti) :
- Executor, le cui istanze, data una riga di comando, generano i
            processi figli e ne catturano l'output e l'exit-code. Questo
            puo` essere utilizzato anche come programma stand-alone a
            riga di comando.
- TextAreaOutputStream, un FilterStream che si attacca ad una TextArea
            e permette di scriverci come se fosse un'OutputStream
            (non so` se c'e` un modo piu` semplice di farlo, a me e`
            venuto in mente questo...)
- MyVJ (interfaccia grafica di Executor) che e` il programma grafico
            vero e proprio
<!-- cut here -->
import java.io.*;
import java.awt.*;
public class TextAreaOutputStream extends PrintStream {
   protected ByteArrayOutputStream buffer;
   protected TextArea target;
   public TextAreaOutputStream( TextArea target ) {
        super( new ByteArrayOutputStream(), true );
        this.buffer = (ByteArrayOutputStream)out;
        this.target = target;
   }
 
   public void flush() {
        synchronized( target ) {
           target.appendText( buffer.toString() );
           buffer.reset();
        }
   }
}
public class Executor implements Runnable {
   private PrintWriter out;     // per copiarci l'output del programma
   private String cmdLine;      // comando da eseguire
   private Process process;     // processo in esecuzione
   public Executor( String cmdLine ) {
     this( cmdLine, new PrintWriter( System.out ) );
   }
   public Executor( String cmdLine, PrintWriter out ) {
       this.cmdLine = cmdLine;
       this.out = out;
   }
   public int exec() {
      int exitCode = -1;
      try {
         process = Runtime.getRuntime().exec( cmdLine );
         new Thread( this ).start();
         exitCode = process.waitFor();
      } catch( Exception e ) {
         System.err.println( "Errore: "+e.getMessage() );
      }
      return exitCode;
   }
   public void run() {
      try {
         BufferedReader in = new BufferedReader(
               new InputStreamReader( process.getInputStream() ) );
         BufferedReader err = new BufferedReader(
               new InputStreamReader( process.getErrorStream() ) );
         String s = "";
         while( ( s = err.readLine() ) != null ||
                ( s = in.readLine() ) != null ) {
            out.println( s );
         }
      }catch( IOException e ) {
         out.println( "Il thread ha chiuso a causa di "+e.getMessage());
      } finally {
         out.flush();
      }
   }
   public static void main( String[] args ) {
      if( args.length > 0 ) {
        Executor t = new Executor( args[0] );
        int exitCode = t.exec();
        System.out.println( "Exit Code = " + exitCode );
        System.exit( exitCode );
      } else {
        System.err.println( "Sintassi: TestProcess  NOME-PROGRAMMA" );
      }
   }
}
public class MyVJ extends Frame {
   // aggiungere le opzioni desiderate, come -verbose, -classpath, ...
   private static final String JAVAC = "/opt/jdk1.2.2/bin/javac";
   private Executor executor;
   private String sourceFileName;
   private TextField tfPath = new TextField("choose a source file",30);
   private TextArea logArea = new TextArea( 25, 40 );
   public MyVJ() {
        super( "MyVJ v0.01  (c)2000, Matteo Mattia" );
        Panel up = new Panel();
        up.add( tfPath );
        up.add( new Button( "Browse..." ) );
        Panel down = new Panel();
        down.add( new Button( "Compile" ) );
        down.add( new Button( "Quit" ) );
        add( "North", up );
        add( "Center", logArea );
        add( "South", down );
   }
   public boolean action( Event evt, Object what ) {
        if( what.equals( "Browse..." ) ) {
           FileDialog fd = new FileDialog( this,
                               "Choose a Java Source File",
                               FileDialog.LOAD );
           fd.show();
           if( fd.getFile() != null )
              tfPath.setText(
                new File(fd.getDirectory(), fd.getFile()).toString() );
        } else if( what.equals( "Compile" ) ) {
           TextAreaOutputStream pipe=new TextAreaOutputStream(logArea);
           pipe.println( "Compiling " + tfPath.getText() + " ...\n");
           Executor runner = new Executor(
                                   JAVAC + " " + tfPath.getText(),
                                   new PrintWriter( pipe ) );
           int exitCode = runner.exec();
           if( exitCode == 0 )
              pipe.println( "\nCompiled OK!" );
           else
              pipe.println( "\nERROR! Exit code: " + exitCode );
           pipe.close();
        } else if( what.equals( "Quit" ) ) {
           System.exit( 0 );
        } else {
           return super.action( evt, what );
        }
        return true;
   }
   public static void main( String[] args ) {
        MyVJ vj = new MyVJ();
        vj.resize( 400, 400 );
        vj.show();
   }
}
<!-- cut here -->
Spero -vista anche l'ora- di essere riuscito a scrivere qualcosa di
sensato! ;-)


 un'occhiata al seguente codice che ho buttato giu` adesso al volo:
[cut]
Grazie ora provo il codice.
PS: mi stupisci sempre d + per la tua disponibilta'; ancora grazie.
Nihil
-+-
nihil est quod ratio facere non posse

 
vorra` dire che la prossima volta che ho un problema con i DB sapro` a
chi chiedere!! :-)


Ok, mi hai illuminato, risolto tutto e, vista l'inutilita' dell'applicazione
(che in realta' non aveva applicazione), ho abbandonato il progetto. Ti
ricordo, cmq, che lo avevo iniziato solo a scopo *didattico*.
Adesso, per prendere confidenza con i database (ebbene si' non ci sto'
ancora dentro) ho iniziato a fare un programma che risponde a alcune
semplici domande fatte dall'utente (ambizioso? Beh, meglio: piu' e'
difficile e piu' mi diverto).
Credo che, questo, mi crei ancora piu' problemi del primo; ma arrivero' in
fondo! o no?
Beh, ancora grazie per il tuo utilissimo aiuto (o utilissimi aiuti?),
