# Applet und JWS auf Apache-Axis (SOAP)



## s-markus (7. Mrz 2007)

Hallo!

Ich habe folgendes gemacht:
Hab mir ein Java-Applet gebaut (funktioniert).
Hab mir Tomcat mit Axis installiert und ihm einen ganz einfachen JavaWebService gegeben.
Also ich habe die Klasse

```
public class test
{
  public double testMethode( String job, double x )
  {
    if( "Quadrat".equalsIgnoreCase( job ) )
      return x * x;
    if( "Wurzel".equalsIgnoreCase( job ) )
      return Math.sqrt( x );
    return 0.;
  }
}
```
in mein Apache-Tomcat-(mit Axis)-Verzeichnis unter ../apache-tomcat/webapps/axis/test.jws abgespeichert. Alles auf meinem
"localhost".
Dann habe ich das Applet um die folgenden Zeilen erweitert:

```
Object webservicereturn=null;
try{
        String  wsEndpoint = "http://localhost:8080/axis/test.jws";
        String  wsMethod   = "testMethode";
****  Service service    = new Service(); *********************************************
        Call    call       = (Call)service.createCall();
        call.setTargetEndpointAddress( new URL( wsEndpoint ) );
        call.setOperationName( wsMethod );
        call.addParameter( "job", Constants.XSD_STRING, ParameterMode.IN );
        call.addParameter( "x",   Constants.XSD_DOUBLE, ParameterMode.IN );
        call.setReturnType( Constants.XSD_DOUBLE );
        webservicereturn = call.invoke( new Object[] { "wurzel", new Double( "12.7" ) } );
 }
    catch(Exception ex) {}

JOptionPane.showMessageDialog(webservicereturn.toString() ... );
```

Jetzt hab ich das Applet als *Applikation* gestartet (vorher natürlich Tomcat gestartet) und die JOptionPane zeigt mir das
richtige Ergebnis.
*DAS PROBLEM:*  Wenn ich die ganze Sache im Firefox als Applet ausführe, dann kommt keine JOptionPane, dafür aber eine
SecurityException:

```
Java Plug-in 1.6.0
Verwendung der JRE-Version 1.6.0 Java HotSpot(TM) Client VM
....
java.lang.ExceptionInInitializerError
        at org.apache.commons.discovery.jdk.JDKHooks.<clinit>(JDKHooks.java:75)
        at org.apache.commons.discovery.tools.DiscoverSingleton.find(DiscoverSingleton.java:412)
        at org.apache.commons.discovery.tools.DiscoverSingleton.find(DiscoverSingleton.java:378)
        at org.apache.axis.components.logger.LogFactory$1.run(LogFactory.java:45)
        at java.security.AccessController.doPrivileged(Native Method)
        at org.apache.axis.components.logger.LogFactory.getLogFactory(LogFactory.java:41)
        at org.apache.axis.components.logger.LogFactory.<clinit>(LogFactory.java:33)
        at org.apache.axis.handlers.BasicHandler.<clinit>(BasicHandler.java:43)
        at org.apache.axis.client.Service.getAxisClient(Service.java:104)
        at org.apache.axis.client.Service.<init>(Service.java:113)
*****at LNdW_Applet.init(LNdW_Applet.java:35) *************************************
        at sun.applet.AppletPanel.run(AppletPanel.java:417)
        at java.lang.Thread.run(Thread.java:619)
Caused by: java.security.AccessControlException: access denied (java.lang.RuntimePermission createClassLoader)
        at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
        at java.security.AccessController.checkPermission(AccessController.java:546)
        at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
        at java.lang.SecurityManager.checkCreateClassLoader(SecurityManager.java:594)
        at java.lang.ClassLoader.<init>(ClassLoader.java:225)
        at org.apache.commons.discovery.jdk.PsuedoSystemClassLoader.<init>(PsuedoSystemClassLoader.java:73)
        at org.apache.commons.discovery.jdk.JDK12Hooks.findSystemClassLoader(JDK12Hooks.java:215)
        at org.apache.commons.discovery.jdk.JDK12Hooks.<clinit>(JDK12Hooks.java:73)
        ... 13 more
```
(Die **** in diesem Code-Abschnitt entsprechen der Zeile im vorherigen Source-Code-Abschnitt.)

Ich hatte die ganze Sache bis jetzt so verstanden, dass ich im Applet schon eine Verbindung zu dem Server aufbauen drauf, von dem auch das Applet selbst gekommen ist - in diesem Fall mein localhost. Was läuft hier verkehrt?

Bei dem, der das alles bis hier durchglesen hat müsste ich mich glaub ich mal persönlich bedanken.

Viele Grüße,

Markus


----------



## s-markus (12. Mrz 2007)

Hallo,

es scheint so, als ob das was ich versuche aussichtslos ist ... 
Deshalb markiere ich den Thread mal als gelöst.

Viele Grüße,

Markus


----------



## Wildcard (12. Mrz 2007)

Das hat nichts mit der Verbindung zum Server zu tun, die ist erlaubt.
at org.apache.commons.discovery.jdk.PsuedoSystemClassLoader.<init>(PsuedoSystemClassLoader.java:73)
        at org.apache.commons.discovery.jdk.JDK12Hooks.findSystemClassLoader(JDK12Hooks.java:215)
        at org.apache.commons.discovery.jdk.JDK12Hooks.<clinit>(JDK12Hooks.java:73) 
Deine lib versucht einen Classloader zu installieren den der SecurityManger nicht erlaubt.
Wenn du dein Applet signierst funktioniert das auch.


----------



## s-markus (12. Mrz 2007)

Danke!

Es hat jemand geantwortet! Juhu! -> DANKE!
Nun zum Thema:
Mir ist klar, dass ich ja noch nicht mal gesagt habe wohin ich connecten will.
Die Exception wird ja in der Zeile new Service(); gethrowt.
Die lib die etwas verbotenes Versucht ist nicht von mir sondern von Apache oder so.
Ich habe jetzt schon 3 Tage im Internet gesucht und versucht irgendwie zu verstehen warum es so ist wie es ist.
Warum will den diese lib eine ClassLoader installieren? Wozu? Kann man das nicht abstellen?
Ich möchte doch einfach nur diesen jws im Applet nutzen. Mehr nicht.
Ja, ich habe auch gelesen dass man Applets signieren kann. Aber dann wird der User beim Laden 
aufgefordert eine Security-Frage zu beantworten. Das möchte ich nicht.
Es würde glaube ich in dem Context für den ich programmiere unseriös wirken.

Sollte jemand wissen wie man den WebService im Applet nutzen kann ohne das Applet zu signieren, dann bin ich für jeden Rat wirklich sehr dankbar, gebe aber an dieser Stelle auf ...

Warum möchte ich das eigentlich?
1. Habe ein Applet das etwas ausrechnet. <- Diese Berechnung möchte ich gern auf den Server auslagern.
2. Es soll für die Erbebnisse eine Druckansicht geben. Applets auszudrucken geht in vielen Browser (zumindest in meinem Firefox nicht) nicht. Deshalb hab ich mir gedacht: Schickst die Ergebnisse zu deinem WebServer, der geniert schnell eine html-seite und ein dafür benötigtes Bild und schickt dem Applet die URL zurück. Das Applet macht dann ...showDocument(..) und die Druckansicht ist erledigt. 

Ich überlege jetzt wie ich die ganze Sache mit Servlets implementieren kann. Die Berechnung auszulagern scheint soweit kein Problem. Nur für das Generieren der html-Seite und dem Bild ist mir noch nichts gutes eingefallen. Dazu vielleicht irgendjemand gute Ideen?

Viele Grüße,

Markus


----------



## Wildcard (12. Mrz 2007)

War mir schon klar das es sich um eine Apache lib handelt  :wink: 
Sofern die Apache Leute keinen SecurityManager freundlichen Patch haben (der Logging und ähnliches entfernt) und du dein Applet nicht signieren möchtest bleibt dir nur übrig die Lib selbst entsprechend anzupassen oder sie schlicht nicht zu verwenden.
Anders geht's nunmal nicht.
Eventuell mal bei Apache vorbeischauen und freundlich um Hilfe bitten.


----------



## s-markus (12. Mrz 2007)

Wildcard hat gesagt.:
			
		

> ... bleibt dir nur übrig die Lib selbst entsprechend anzupassen oder sie schlicht nicht zu verwenden.



Ohh, meine Ohren spitzen sich!
Wie mach ich das? 
Also die lib nicht verwenden ... mhhh ... mir würde jetzt nicht einfallen wie das gehen soll.
Und die lib anpassen ... mhhh. .. gibts denn den Quellcode irgendwo?
Hat das schon mal jemand erfolgreich gemacht? Ist das überhaupt legal?

Viele Grüße,

Markus

p.s. @ Wildcard: Glaubst du es wäre eine bessere Idee auf richtige eigenständige Servlets umzusteigen?


----------



## Wildcard (12. Mrz 2007)

Steht unter der Apache Licence welche sehr freizügig ist (für Details bitte selbst die Lizenz lesen), aber dieses Vorhaben würde ich nicht empfehlen da es vermutlich einige Zeit in Anspruch nehmen wird.
Nimm doch stattdessen zum Beispiel WSIF oder ein anderes Webservice Framework.
Ob's im Applet funktioniert? Keine Ahnung, da musst du dich selbst schlau machen.
http://en.wikipedia.org/wiki/Web_Services_Invocation_Framework


----------



## s-markus (12. Mrz 2007)

Wildcard hat gesagt.:
			
		

> ... aber dieses Vorhaben würde ich nicht empfehlen da es vermutlich einige Zeit in Anspruch nehmen wird.


Glaub auch wirklich dass das etwas für Freaks ist, sonst wäre ich denke ich in den letzten Tagen auf so eine abgespeckte lib gestoßen. Also die lib verändern oder weglassen ist keine Option mehr. 

Ich werde mal versuchen WSIF zu benutzen und poste dann nochmal ob ich Erfolg hatte.

Ich tendiere aber im Moment wirklich sehr dazu mir einfach selbst so ein Servlet zuschreiben. Das hätte dann wahrscheinlich auch den Vorteil, dass meine jar (meines Applets) nicht so groß wird. Die Axis jars sind ja fast 3 MB. Kann allerdings auch sein, dass man da noch einiges weglassen kann.

Vielen Dank!

Markus


----------



## s-markus (2. Apr 2007)

WSIF verwendet die selbe lib. Deshalb habe ich das dann auch gelassen und ein Servlet geschrieben.
War auch für meine Zwecke irgendwie sinnvoller. Aber das hab ich erst im Nachhinein, als ich mich dann näher mit diesen ganzen Java Enterprise Sachen beschäftigt hatte gemerkt.

Viele Grüße,

Markus


----------

