package docen_archivos;

import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;
import java.applet.AudioClip;
import java.net.URL;
import java.net.URLConnection;
import java.net.JarURLConnection;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.net.MalformedURLException;
import java.lang.SecurityException;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.Vector;
import java.util.Enumeration;

/******************************************************************
 * Clase que descarga un gráfico y un archivo midi del archivo JAR.
 * Reproduce el archivo de audio.
 * Pone una lista con información de archivos en mitad superior del applet.
 * Pinta imagen en mitad inferior del applet
 *****************************************************************/
public class applet_jar extends Applet {
   List lista = new List();
   Image imagen;
   AudioClip audio = null;;

   /************** Inicializar el applet *********************/
   public void init() {
       try { jbInit(); }
       catch (Exception e) { e.printStackTrace(); }
   }

   /****************** Inicialización de componentes **********/
   private void jbInit() throws Exception {


      this.setLayout( new GridLayout(2,1));  // Divido el applet en filasxcolumnos

      definir_lista();     // Pone entradas de JAR en lista
      cargar();            // Carga de audio e imagen (también escribe en lista)

      if (audio != null)   // Si el audio no es nulo, se reproduce
	 audio.play();

      add(lista);
      repaint();  // Para asegurar que se ve bien la imagen desde el inicio
   }

   /*** Pinto la imagen centrada y en mitad inferior del applet ***/
   public void paint(Graphics g) {
      Rectangle rec = g.getClipBounds();
      int ancho_imagen = imagen.getWidth( this );
      int alto_imagen = imagen.getHeight( this );
      g.drawImage( imagen, rec.width/2 - ancho_imagen/2, rec.height/2, this );
   }


   /***************** Al destruir el applet se para la música *********/
   public void destroy() {
      if (audio != null)
	 audio.stop();
   }

   /************************************************************************
    * Escribe en la lista: 1) URL ABSOLUTA del archivo JAR y 2) URLs RELATIVAS
    * de las entradas del JAR.
    ***********************************************************************/
   void definir_lista() {
      try {
	 /****** Consigo un JarFile a partir de la URL *****/
	 URL url = new URL("jar:" + this.getCodeBase().toString() + "jar/pack.jar!/");
	 JarURLConnection conexion = (JarURLConnection) url.openConnection();
	 JarFile jar = conexion.getJarFile();

	 /******* Añado a lista ***************/
	 lista.add( "------- URL ABSOLUTA DE ARCHIVO JAR: -------");
	 lista.add( url.toString());  //

	 /***** Consigo las entradas del JarFile y las añado a la lista ********/
	 JarEntry entry;
	 lista.add( "------- ENTRADAS RELATIVAS DEL ARCHIVO JAR: -------" );
	 for (Enumeration e = jar.entries(); e.hasMoreElements(); ) {
	    entry = (JarEntry) e.nextElement();
	    lista.add(entry.getName()); // Añadir a la lista
	 }
      }
      catch (NullPointerException e) {
	  System.out.print("NullPointerException:");
	  System.out.println(e.getMessage() + "\r\n");
	  e.printStackTrace();
       }
      catch (SecurityException e) {
	   System.out.print("SecurityException:");
	   System.out.println(e.getMessage() + "\r\n");
	   e.printStackTrace();
       }
       catch (MalformedURLException mue) {  // Hija de IOException
	   System.out.print("URL inadecuada:");
	   System.out.println(mue.getMessage() + "\r\n");
	   mue.printStackTrace();
       }
       catch (IOException ioe) {            // Hija de Exception
	   System.out.print("IOException:");
	   System.out.println(ioe.getMessage() + "\r\n");
	   ioe.printStackTrace();
       }
       catch (Exception e) {
	   System.out.print("Exception:");
	   System.out.println(e.getMessage() + "\r\n");
	   e.printStackTrace();
       }
   }
   /*******************************************************************************
    * Cargo imagen y audio.
    * Ademas se añaden las URLs absolutas del archivo de imagen y del de sonido.
    *******************************************************************************/
   void cargar() {
       try {
	  /*** Salidas a la consola ***/
	  System.out.println( "jar:" + getCodeBase().toString() +
				     "jar/pack.jar!/canon_pachelbel.mid" + "\r\n");
   	  System.out.println( "jar:" + getCodeBase().toString() +
					    "jar/pack.jar!/buho.gif" + "\r\n");

	 /* Añade a lista un titulo */
	 lista.add("------- URLs ABSOLUTAS DE ENTTRADAS (de imagen y sonido): -------");

	 /********* Obtener audio del archivo JAR ****************/
	 URL url_audio = new URL( "jar:" + getCodeBase().toString() +
				      "jar/pack.jar!/canon_pachelbel.mid" );
	 audio = getAppletContext().getAudioClip( url_audio ); // Consigo un AudioClip


	 /********* Obtener imagen del archivo JAR ***************/
	 URL url_imagen = new URL( "jar:" + getCodeBase().toString() +
				      "jar/pack.jar!/buho.gif" );
	 imagen = this.getImage( url_imagen );                  // Consigo un Image

	 /********* Añado URLs absolutas a lista *********/
	 lista.add(url_audio.toString());                      // Añado a lista
	 lista.add(url_imagen.toString());                      // Añado a lista

      }
      catch (NullPointerException e) {
	  System.out.print("NullPointerException:");
	  System.out.println(e.getMessage() + "\r\n");
	  e.printStackTrace();
       }
      catch (SecurityException e) {
	   System.out.print("SecurityException:");
	   System.out.println(e.getMessage() + "\r\n");
	   e.printStackTrace();
       }
       catch (MalformedURLException mue) {  // Hija de IOException
	   System.out.print("URL inadecuada:");
	   System.out.println(mue.getMessage() + "\r\n");
	   mue.printStackTrace();
       }
       catch (IOException ioe) {            // Hija de Exception
	   System.out.print("IOException:");
	   System.out.println(ioe.getMessage() + "\r\n");
	   ioe.printStackTrace();
       }
       catch (Exception e) {
	   System.out.print("Exception:");
	   System.out.println(e.getMessage() + "\r\n");
	   e.printStackTrace();
       }
   }
}
