# XML-Konfigurations-Datei in jar-Archiv



## UseTheSource (31. August 2005)

Hallo allerseits

Ich arbeite an einem Applet, für das ich einige Einstellungen in eine XML-Datei speichere, die per JDOM verarbeitet wird. Der Pfad der Konfig-Datei wird per HTML-Parameter übergeben.
Lokal (bzw. im Appletviewer von JBuilder) funktioniert das Laden und Speicher der Datei ganz gut. Sobald sich das ganze auf dem Server befindet, fangen aber die Probleme an. Als erstes habe ich versucht, die Datei im selben Verzeichnis wie das Applet-Jar anzulegen. Ein Problem dabei ist, das die VM den Pfad immer lokal interpretiert, also vom Desktop aus. Wenn ich den ganzen (SMB-)Netzwerkpfad angegeben habe, ging es teilweise, aber ansonsten meldet der SAXBuilder immer wieder Fehler beim Verbinden mit der Datei.
Ein Kollege hat gemeint, ich soll die Konfig-Datei mit ins jar-Archiv packen, allerdings hab ich dort wiederum so meine Probleme gehabt (Wiederum hat es hier lokal sogar einmal funktioniert, auf dem Server allerdings wieder nicht mehr).
Meine Frage wäre nun, welcher Weg wohl der bessere ist und wie der am besten umgesetzt werden könnte.

Initialiserung der Config-Klasse:

```
Conf = new Config(this.getParameter(String.valueOf("Config_File")));
//"Confi_File" wäre in dem Fall "config.xml"
```

Einlesen der XML-Datei:

```
public class Config {
  public Config(String filename) {
    FileName = filename;
    readConfig();
  }

  static private Document ConfigFile;
  static public String FileName;
  //...

  //XML-Dokument aus Datei lesen und Konfiguration auslesen
  public void readConfig() {
    try {
      ConfigFile = new SAXBuilder().build(FileName);
      QueryList = new Vector(0);
      Element config = ConfigFile.getRootElement();
      //----Allgemeine Einstellungen auslesen----
      //...
    } catch (JDOMException jd_e) {
      jd_e.printStackTrace();
    } 
  }
 
  //...

  public void saveConfig(String filename) {
    FileName = filename;
    saveConfig();
  }

  //XML-Dokument in Datei speichern
  public void saveConfig() {
    updConfigDoc();
    XMLOutputter out = new XMLOutputter("\t", true);
    try {
      File outFl = new File(FileName);
      outFl.createNewFile();
      FileWriter FlWr = new FileWriter(outFl);
      out.output(ConfigFile, FlWr);
      FlWr.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}
```

Es würde mich wiklich freuen, wenn mir jemand helfen könnte, denn danach wär mein Applet so gut wie fertig und ich könnte mich endlich mal etwas Neuem widmen .
Auf jeden Fall möchte ich mich schon mal im Voraus bei euch für die Hilfe bedanken.

MfG UseTheSource


----------



## Thomas Darimont (31. August 2005)

Hallo!

 Lesen und Schreiben von Dateien auf der Festplatte des Benutzers ist nur für signierte Applets erlaubt. Wenn deine Anwendung Daten von der Festplatte des Benutzers lesen oder schreiben soll mußt du sie signieren.

 Hier ein beispiel, wie du deine Konfiguration aus einem jar heraus laden kannst:


```
package de.tutorials.applet;
 
 import javax.swing.JApplet;
 import javax.swing.JLabel;
 import javax.xml.parsers.SAXParserFactory;
 
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.DefaultHandler;
 
 public class AppletExample extends JApplet {
 
 	String text;
 
 	public void init() {
 		try {
 			SAXParserFactory.newInstance().newSAXParser().parse(
 		    	    getClass().getResourceAsStream("config.xml"),
 					new DefaultHandler() {
 						
 		    			boolean isTextElement = false;
 						
 		    			public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
 		    		    	if(qName.equals("text")){
 		    		    		isTextElement = true;
 		    		    	}
 						}
 						
 		    			public void characters(char[] ch, int start, int length)
 		    		    		throws SAXException {
 		    		    	if(isTextElement){
 		    		    		text = new String(ch,start,length);
 		    		    		isTextElement = false;
 		    		    	}
 						}
 					});
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
 	}
 	
 	
 	public void start() {
 		add(new JLabel(text));
 	}
 }
```
 

```
<html>
 	<head>
 		<title>AppletTest</title>
 	</head>
 	<body>
 		<applet archive="applet.jar" code="de.tutorials.applet.AppletExample"/>
 	</body>
 </html>
```
 
 Gruß Tom


----------



## UseTheSource (1. September 2005)

Vielen Dank für die Antwort!

Das Einlesen funktioniert jetzt endlich, aber fürs Speichern benötigt der XMLOutputter ja einen OutputStream, während getResourceAsStream() ja nur einen InputStream hergibt. Gibt es eine Möglichkeit die XML-Datei direkt wieder ins Archiv zu speichern oder muss ich sie vielleicht zurest irgendwo temporär abspeichern und dann ins Archiv packen?

Für alle Interessierten, noch meine Anpassung (das Applet war übrigens schon signiert):

```
//Constructor
  public Config(String resName) {
    ResName = resName;
    readConfig();
  }

  //XML-Dokument aus Datei lesen und Konfiguration auslesen
  public void readConfig() {
    try {
      ConfigFile = new SAXBuilder().build(getClass().getResourceAsStream(ResName));
      QueryList = new Vector(0);
      Element config = ConfigFile.getRootElement();
      //----Allgemeine Einstellungen auslesen----
      //...
    } catch (JDOMException jd_e) {
      jd_e.printStackTrace();
    } 
  }
```

MfG UseTheSource


----------



## UseTheSource (2. September 2005)

Naja, das Schreiben ins Jar-Archiv habe ich mal für's Erste auf Eis gelegt. Ich lege jetzt die Konfigurations-Datei im Anwedungsdaten-Verzeichnis des Benutzers an und lese sie nur aus dem Archiv, wenn sie lokal noch nicht vorhanden ist, also sozusagen als Vorlage. Das hat den (eigentlich ganz nützlichen) Nebeneffekt, dass nun die Konfiguration benutzerspezifisch gespeichert wird.

Also, nochmals herzlichen Dank für die Hilfe!
MfG UseTheSource


----------

