# Signierte Applets über html-Link aufrufen



## Sued_Faust (7. Jul 2010)

Moin,

mein Problem ist das wenn ich ein applet über ein html-Button bzw einem link ausführen möchte, ich die exception: java.awt.AWTPermission(showWindowWithoutWarningBanner). lege ich ein Button schon im Applet an, ist das ganze kein problem und mein signiertes Applet darf ausgeführt werden.

Kann mir jemand diesbezüglich weiterhelfen?

Gruß


----------



## Sued_Faust (7. Jul 2010)

Kann mir denn keiner helfen ?


----------



## L-ectron-X (7. Jul 2010)

Ja und wo ist nun das Problem? Warum willst du das Applet überhaupt mit einem HTML-Button starten?


----------



## Sued_Faust (7. Jul 2010)

Ok das kristalisiert sich wirklich nicht ganz klar.

Mein Problem ist, dass ich eine Funktion einer OpenSource Applikation erweitern möchte. Die gegebene Funktion, welche vorher einen Browserdownload initiiert hat, wollte ich nun durch ein von mir modifiziertes Applet ersetzen. Dabei wollte ich aber bestimmte gegebnheiten bestehen lassen wie z.B. den Butten welcher eine JavaScriptFunktion aufruhft in welcher im grunde auch dann mein Applet aufgerufen wird. Das Problem wie gesagt ist, dass er einen Funktionsaufruhf eines externen Buttons, also ein Button der nicht zum Applet gehört, nicht gestattet wird.

Ich hoffe das ich mein Problem nun genauer spezifizieren konnte und ihr mir ein wenig weiterhelfen könnt.

Gruß!


----------



## L-ectron-X (7. Jul 2010)

Ich kann mir das nicht richtig vorstellen, was da eigentlich passieren soll.
Kann man sich das mal irgendwo ansehen?


----------



## Sued_Faust (8. Jul 2010)

naja mal so  eben anschaun ist schlecht, es handelt sich dabei um die OpenSource version von Alfresco (DMS). Also im grunde muss man das ganze hintergrund wissen nicht kennen denke ich. Ich will ja im grunde nur wissen wie und ob man überhaupt aus einem externen link,Button,etc eine über Javascript-Funktion eine Methode eines Signierten Applets aufruft so das keine AWTPermission ausgeworfen wird. 
Hier mal ein mini Beispiel:

Java:

```
public class FileOpener extends Applet implements ActionListener{
	private static final long serialVersionUID = 9088692722667562263L;

	static FileOutputStream fos;
	static ProgressMonitorInputStream pmis;
	static ProgressMonitor pm;
	static InputStream is;
	
	String fileURL = null;
	String msg = "Applet geladen!";

	public void runDownloadApplet(String fileURL){
                          this.fileURL = fileURL
		try{
			fos = new FileOutputStream("C:/TestData/PDFtest.pdf");	
			
			msg = fileURL;
			repaint();
		
			openConnection(fos);
		}catch(Exception e){
			msg = e.getMessage();
			repaint();
			e.printStackTrace();
		}
	}
	
	public void openConnection() throws IllegalStateException, MalformedURLException,
    ProtocolException, IOException {
		URL url = new URL(fileURL);
			
		HttpURLConnection con = (HttpURLConnection) url.openConnection();
	    con.setRequestMethod("GET");
	    con.connect();

	    int responseCode = con.getResponseCode();	    
	    if (responseCode == HttpURLConnection.HTTP_OK) {
	    	
	    	initProgressMonitor(url, con);
	    	
	    	Thread t = new Thread(new Runnable(){
	    	      public void run(){
	    	    	  try{
	    	    		  byte tmp_buffer[] = new byte[4096];
	    	    		  
	    	    		  downloadFile(pmis, tmp_buffer);
	    	    		  
	    	    		  pmis.close();
	    	    	  }catch(IOException ioe){
	    	    		  ioe.printStackTrace();
	    	    	  }
	    	    	  finally{
	    	    		  try{
	    	    			  fos.close();
	    	    			  
	    	    			  openFile();
	    	    		  }
	    	    		  catch (Exception e){
	              e.printStackTrace();
	            }
	          }
	        }
	      });
	      t.start();
	    } else {
	    	msg = String.valueOf(responseCode);
	    	repaint();
	    	throw new IllegalStateException("HTTP response: " + responseCode);
	    } 	  
	}
	
	public void initProgressMonitor(URL url, HttpURLConnection con) throws IOException{
		is = con.getInputStream();
		
		pmis = new ProgressMonitorInputStream(null,"Liest " + url.getFile().toString(), is);
        pm = pmis.getProgressMonitor();
        pm.setMillisToDecideToPopup(0);
        pm.setMillisToPopup(0);
        pm.setMinimum(0);
        pm.setMaximum(con.getContentLength());
	}
	
	public void downloadFile(ProgressMonitorInputStream pmis, byte tmp_buffer[]) throws IOException{
		int bytes;
		msg = "downloading...";
		repaint();
        while ((bytes = pmis.read(tmp_buffer)) > 0) {
        	fos.write(tmp_buffer, 0, bytes);
        	fos.flush();
        }
	}
	
	public void openFile() throws IOException{
		Desktop.getDesktop().open( new File(System.getProperty("user.home") + File.separator + "test.pdf"));
	}
	
	public void paint(Graphics g){
		g.drawString(msg, 50, 25);
	}

}
```

html-Code:

```
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <script language="JavaScript" type="text/javascript" src="javascript/openfile.js"></script>
  </head>
  <body>
    <applet name="FileOpener" codebase="C:/Testen" archive="FileOpener.jar" code="de.fme.fileopener.FileOpener" width=800 height=200 id="FileOpener">
    </applet>
    <input type="button" value="Open File!" onclick="OpenFile()">
  </body>
</html>
```

JavaScript:

```
function OpenFile()
  {
    var link="http://www.starfinanz.de/download/handbuch/StarMoney-60-Handbuch.pdf";
    document.FileOpener.run(link);
  }
```


----------



## Sued_Faust (9. Jul 2010)

Soooo konnte das Problem beheben.

und zwar muss man der Methode die aus JavaScript aufgerufen wird ein bestimmte privilegien hinzufügen.

die kann man z.B. über:


```
ccessController.doPrivileged(new PrivilegedAction() {
			public Object run(){
				try{			
					openConnection();
				}catch(Exception e){
					e.printStackTrace();
				}
			return null;
			}
		});
```

Aber hier ist vorsicht geboten, da eine komplette Methode, hinter der sich wieder mehrer Metoedn verbergen können, der Vollzugriff gestattet.

Mehr Informationen dazu unter:
AccessController (Java 2 Platform SE v1.4.2)

Gruß


----------

