package docen_archivos;

import java.applet.Applet;
import java.awt.TextArea;
import java.awt.BorderLayout;
import java.net.URL;
import java.awt.Color;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.MalformedURLException;
import java.io.IOException;

/********************************************************************************
 * Este applet nos muestra la información que obtenemos con una serie de métodos
 * que nos permiten situarnos dentro del sistema de archivos
 *******************************************************************************/
public class applet_informador extends Applet {
   TextArea editor = new TextArea();

   /************** Inicializar el applet *********************/
   public void init() {
       try { jbInit(); }
       catch (Exception e) { e.printStackTrace(); }
   }

   /****************** Inicialización de componentes **********/
   private void jbInit() throws Exception {
      editor.setBackground( Color.orange );

      editor.append( "getName(): " + this.getName() + "\n" );
      editor.append( "getClass().getName(): " + getClass().getName() + "\n" );
      editor.append( "Protocol: " + this.getDocumentBase().getProtocol() + "\n");
      editor.append( "CodeBase (getFile): " + this.getCodeBase().getFile() + "\n");
      editor.append( "CodeBase (toString): " + this.getCodeBase().toString() + "\n");
      editor.append( "DocumentBase (getFile): " + this.getDocumentBase().getFile() + "\n");
      editor.append( "DocumentBase (toString): " + this.getDocumentBase().getFile() + "\n");
      editor.append( "Habrá podido ver que getCodeBase().getFile() y getCodeBase().toString()" +
		     " no dan el mismo resultado\n\n");
      /*** Obtengo la URL, si no se encuentra el recurso, entonces la url es null ***/
      URL url = getClass().getResource("applet_informador.class");
      if (url == null)
	 editor.append( "Don´t find Resource applet_informador.class. \n");
      else
	 editor.append( "Resource (\"applet_informador.class\"): " + url.toString() + "\n");
      editor.append( "getClass().getResource(\"xx\") tiene como directorio de referencia el del applet\n\n");

      /******* Lee el archivo de código fuente y lo escribe en el editor *********/
      editor.append( "CODIGO FUENTE:\n");
      if ( !leer_archivo( "codigo_fuente/applet_informador.java", editor) )
	 editor.append( "No he podido abrir el archivo de código fuente");

      this.setLayout(new BorderLayout());
      this.add( editor, BorderLayout.CENTER );
   }

   /****************************************************************************
    * Lee el archivo de código fuente y lo escribe en el editor.
    * Devuelve false si se ha producido un error, true en caso contrario.
    ****************************************************************************/
   boolean leer_archivo( String archivo, TextArea area ) {
      try {

	 /****** Crea un BufferedReader a partir de la URL del archivo **********/
	 URL url = new URL(getCodeBase().toString()+archivo);        // Abro URL
	 InputStream is = url.openStream();                          // Abro InputStream desde URL
	 BufferedReader di = new BufferedReader(new InputStreamReader(is));
	 String linea;

	 /***** Lee línea a línea el  archivo ... ****/
	 do {
	    linea = di.readLine();
	    if (linea == null)
	       break;
	    else
	       area.append( linea + "\n" );
	 } while ( true );
	 return true;
      }
      /****** Las salidas con print y println se dirigen a la consola Java ****/
      catch (SecurityException e) {     // Hija de RuntimeException
	     System.out.print( "SecurityException. Función leer_archivos(). ");
	     System.out.println(e.getMessage() );
	     return false;
      }
      catch (MalformedURLException mue) {    // Hija de IOException
	     System.out.print( "MalformedURLException. Funcion leer_archivos(). ");
	     System.out.println(mue.getMessage() );
	     return false;
      }
      catch (IOException e ) {               // // Hija de Exception
	     System.out.print( "IOException. Funcion leer_archivos(). ");
	     System.out.println(e.getMessage() );
	     return false;
      }
      catch (Exception e ) {
	     System.out.print( "Exception. Funcion leer_archivos(). ");
	     System.out.println(e.getMessage() );
	     e.printStackTrace();
	     return false;
      }
   }  //////////// FIN DE leer_archivo //////////////////

}
