Error al ejecutar un applet en el navegador.Acceso denegado

David
03 de Septiembre del 2003
ERROR: Acceso denegado al ejecutar un applet en el navegador.

He construido un applet que llama a una clase perteneciente a un
reproductor de ficheros PCM (WAV). Tengo una página html que llama
al applet de la siguiente forma:

<HTML>
<HEAD>
<TITLE> Reproductor de ficheros PCM </TITLE>
</HEAD>
<BODY>
Salida del programa:
<APPLET CODE="ReproductorApplet.class"
WIDTH=300 HEIGHT=100
ALT = "Applet: REPRODUCTOR DE AUDIO"
CODEBASE = "http://localhost:8080/Reproductor">
<PARAM NAME="fichero" VALUE="http://localhost:8080/Reproductor/Applause.wav">
</APPLET>
</BODY>
</HTML>

El fichero java del applet es el siguiente
import javax.swing.JApplet;
public class ReproductorApplet extends JApplet {
static ReproductorApplet applet;
private ReproductorAudio02 player;
private String param;

public void init(){
applet = this;
param = null;
param = getParameter("fichero");
}
public void start(){
getContentPane().add("Center",
player = new ReproductorAudio02(param));
}
public void stop(){
}
public void destroy(){
}
}//fin ReproductorApplet

El fichero java del reproductor es el siguiente:
/*
Fichero: ReproductorAudio02.java

Descripción: Reproduce un fichero de audio especificado
por el usuario mediante paso por parámetros

Se dispone de una interfaz de usuario formada por los
siguientes componentes:
Botón Play: Reproduce el fichero de audio
Botón Stop: para la reproducción del fichero.


Una vez que se está en elprograma se puede pulsar
el botón Play para reproducir el fichero de audio.

Si se pulsa el botón Stop durante la reproducción del
fichero, entonces se detiene la reproducción del fichero
de audio. Hay un cierto retardo entre la pulsación del botón
Stop y la detención de la reproducción.


El programa muestra el formato de los datos del fichero
de audio antes de reproducirse el fichero. El formato de los
datos se muestra por la pantalla de línea de comandos.

Probado utilizando Java 2 SDK 1.4.1.01 en Windows 98
*/

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.sound.sampled.*;
import java.lang.*;

public class ReproductorAudio02 extends JFrame{


String FAudio;
AudioFormat audioFormat;
AudioInputStream audioInputStream;
SourceDataLine sourceDataLine;
boolean PararReproduccion = false;
final JButton BotonStop = new JButton("Parar");
final JButton BotonPlay = new JButton("Reproducir");

public static void main(String args[]){
if (args.length!=1)
System.out.println("Sintaxis incorrecta: Java ReproductorAudio01 ficheroPCM");
else{
new ReproductorAudio02(args[0]);
}
}//fin main
//-------------------------------------------//

public ReproductorAudio02(String FichAudio){//constructor

FAudio = FichAudio;
BotonStop.setEnabled(false);
BotonPlay.setEnabled(true);

//Instanciar y registrar los action listeners
//en los botones Reproducir y Parar

//Botón Reproducir
BotonPlay.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e){
BotonStop.setEnabled(true);
BotonPlay.setEnabled(false);
Reproducir(FAudio);//Reproducir el fichero
}//fin actionPerformed
}//fin ActionListener
);//fin addActionListener()

//Botón Parar
BotonStop.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e){
//Terminar reproducción después de EOF
PararReproduccion = true;
}//fin actionPerformed
}//fin ActionListener
);//fin addActionListener()

//Añadir los botones y el campo de texto al panel
getContentPane().add(BotonPlay,"West");
getContentPane().add(BotonStop,"East");

//Poner el título
setTitle("Reproductor de Audio");
//Establecer la acción por defecto al cerrar
setDefaultCloseOperation(EXIT_ON_CLOSE);
//Establecer el tamaño
setSize(250,50);
//Hacer visible el reproductor
setVisible(true);
}//end constructor
//-------------------------------------------//


//Este método reproduce los datos de audio desde
//el fichero indicado por el campo de texto
private void Reproducir(String FichAudio) {
try{
//Crear una instaciación al fichero de audio
//indicado en el campo de texto
File FicheroAudio = new File(FichAudio);
//Crear el flujo de entrada del fichero de audio
audioInputStream = AudioSystem.getAudioInputStream(FicheroAudio);
//Tomar el formato del audio del flujo
audioFormat = audioInputStream.getFormat();
//Imprimir por pantalla el formato del fichero de audio
//que se va a reproducir.
System.out.println(audioFormat);

DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class,audioFormat);

sourceDataLine = (SourceDataLine)AudioSystem.getLine(dataLineInfo);


//Crear un hilo para reproducir los datos e inicializar
//la ejecución. Se reproducirá audio mientras no se
//llegue al fin de fichero o no se pulse el botón de Stop
//Debido a la utilización de buffers, normalmente se
//producirá un retardo entre la pulsación del botón de Stop
//y la detención de la reproducción
new HiloReproducir().start();
}catch (Exception e) {
e.printStackTrace();
System.exit(0);
}//end catch
}//end Reproducir


//=============================================//
//Clase para reproducir los datos de audio del fichero
class HiloReproducir extends Thread{
//buffer temporal para los datos de audio
byte tempBuffer[] = new byte[10000];

public void run(){
try{
sourceDataLine.open(audioFormat);
sourceDataLine.start();

int cnt;
//Mientras el método read no devuelva -1 o
//no se pulse el botón de Stop
while((cnt = audioInputStream.read(
tempBuffer,0,tempBuffer.length)) != -1
&& PararReproduccion == false){
if(cnt > 0){
//Escribir los datos al buffer que
//será mandado a los altavoces
sourceDataLine.write(tempBuffer, 0, cnt);
}//if
}//while
//Bloquearse y esperar hasta que el buffer
//interno se vacíe
sourceDataLine.drain();
sourceDataLine.close();

//Prepare to playback another file
//Preparar la reproducción de otro fichero
BotonStop.setEnabled(false);
BotonPlay.setEnabled(true);
PararReproduccion = false;
}catch (Exception e) {
e.printStackTrace();
System.exit(0);
}//catch
}//run
}//class HiloReproducir
//===================================//

}//class Reproductor.java

Cuando llamo desde el navegador IExplore al fichero Reproductor.htm
http://localhost:8080/Reproductor/Reproductor.htm la consola de Java
muestra el siguiente error.

java.security.AccessControlException: access denied (java.lang.RuntimePermission exitVM)

at java.security.AccessControlContext.checkPermission(AccessControlContext.java:270)

at java.security.AccessController.checkPermission(AccessController.java:401)

at java.lang.SecurityManager.checkPermission(SecurityManager.java:542)

at java.lang.SecurityManager.checkExit(SecurityManager.java:762)

at javax.swing.JFrame.setDefaultCloseOperation(JFrame.java:356)

at ReproductorAudio02.<init>(ReproductorAudio02.java:93)

at ReproductorApplet.start(ReproductorApplet.java:13)

at sun.applet.AppletPanel.run(AppletPanel.java:370)

at java.lang.Thread.run(Thread.java:536)



Alguien podría decirme que permiso o permisos debería asignar al fichero
java.policy o si debería crear otro fichero de política independiente.
En caso de crear un nuevo fichero de política, donde debería guardarlo
en el disco duro del servidor? Estoy utilizando Windows XP con Tomcat 4.1