Hallo,
ich schreibe gerade eine Anwendung in der man Systemdaten hinterlegen kann.
Diese Systemdaten möchte ich auch wenn das Programm geschlossen wird in einer XML speichern, damit diese beim nächsten Programmaufruf wieder zur Verfügung stehen.
Jetzt bin ich mir nicht sicher, mit welcher API ich diese ganze Sache angehen soll. Ich habe das ganze mal mit JAXP ausprobiert. Das Einlesen klappt auch. Allerdings frage ich mich, ob dieses die richtige API ist. Habe vorher nicht viel mit XML in Java gemacht. Besonders kein Auslesen und später wieder reinschreiben.
Also der Ablauf soll so sein: Programmstart --> Einlesen der Datei --> Programmende --> Schreiben der Datei.
Ich habe die folgende Struktur in der XML
[XML]
<?xml version="1.0" encoding="UTF-8"?>
<environment>
<system>
<name>system1</name>
<hostname>system1</hostname>
<user>user1</user>
<password>user1pwd</password>
</system>
<system>
<name>system2</name>
<hostname>system2</hostname>
<user>user2</user>
<password>userpwd2</password>
</system>
</environment>
[/XML]
Hier einmal mein Programmcode. Kann man das so machen?
System-Klasse
Environment-Klasse
ObjectFactory-Klasse
XMLToObject - Klasse (Hier wird der ganze Vorgang gestartet)
Hier Frage ich mich, ob es ebenfalls in Ordnung ist, wie ich das mit dem Environment umgesetzt habe. Kann ich mit in meiner Singleton-Klasse Environment eine setEnvironment() Methode schreiben die ein Environment Object entgegennimmt und das einzige Object damit updatet? Sinn hie rist, dass ich die ArrayList mit den Systems in jeder Klasse verfügbar sind. Denn diese zeige ich später in einer JList an.
Ist eventuell ein wichtiger Hintergrund, damit ihr mein Problem versteht, bzw. mir helfen könnt.
Wenn noch eine Verbesserung entweder mit einer anderen API oder im Programmcode würde ich mich über eure Vorschläge freuen..
Viele Grüße von der Insel
ich schreibe gerade eine Anwendung in der man Systemdaten hinterlegen kann.
Diese Systemdaten möchte ich auch wenn das Programm geschlossen wird in einer XML speichern, damit diese beim nächsten Programmaufruf wieder zur Verfügung stehen.
Jetzt bin ich mir nicht sicher, mit welcher API ich diese ganze Sache angehen soll. Ich habe das ganze mal mit JAXP ausprobiert. Das Einlesen klappt auch. Allerdings frage ich mich, ob dieses die richtige API ist. Habe vorher nicht viel mit XML in Java gemacht. Besonders kein Auslesen und später wieder reinschreiben.
Also der Ablauf soll so sein: Programmstart --> Einlesen der Datei --> Programmende --> Schreiben der Datei.
Ich habe die folgende Struktur in der XML
[XML]
<?xml version="1.0" encoding="UTF-8"?>
<environment>
<system>
<name>system1</name>
<hostname>system1</hostname>
<user>user1</user>
<password>user1pwd</password>
</system>
<system>
<name>system2</name>
<hostname>system2</hostname>
<user>user2</user>
<password>userpwd2</password>
</system>
</environment>
[/XML]
Hier einmal mein Programmcode. Kann man das so machen?
System-Klasse
Java:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"name",
"hostname",
"user",
"password"
})
@XmlRootElement(name = "system")
public class System {
@XmlElement(required = true)
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
@XmlSchemaType(name = "NCName")
protected String name;
@XmlElement(required = true)
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
@XmlSchemaType(name = "NCName")
protected String hostname;
@XmlElement(required = true)
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
@XmlSchemaType(name = "NCName")
protected String user;
@XmlElement(required = true)
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
@XmlSchemaType(name = "NCName")
protected String password;
public System(String name, String hostname, String user, String password) {
this.name = name;
this.hostname = hostname;
this.user = user;
this.password = password;
}
public System() {
}
public String getName() {
return name;
}
public void setName(String value) {
this.name = value;
}
public String getHostname() {
return hostname;
}
public void setHostname(String value) {
this.hostname = value;
}
public String getUser() {
return user;
}
public void setUser(String value) {
this.user = value;
}
public String getPassword() {
return password;
}
public void setPassword(String value) {
this.password = value;
}
}
Environment-Klasse
Java:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"system"
})
@XmlRootElement(name = "environment")
public class Environment {
private static Environment environment = null;
private Environment(){
}
public void setEnvironment(Environment environment){
this.environment = environment;
}
public static Environment getInstance(){
if(environment == null){
environment = new Environment();
}
return environment;
}
@XmlElement(required = true)
protected ArrayList<System> system;
public ArrayList<System> getSystem() {
if (system == null) {
system = new ArrayList<System>();
}
return this.system;
}
}
ObjectFactory-Klasse
Java:
@XmlRegistry
public class ObjectFactory {
private final static QName _Name_QNAME = new QName("", "name");
private final static QName _Hostname_QNAME = new QName("", "hostname");
private final static QName _Password_QNAME = new QName("", "password");
private final static QName _User_QNAME = new QName("", "user");
public ObjectFactory() {
}
public System createSystem() {
return new System();
}
public Environment createEnvironment() {
return Environment.getInstance();
}
@XmlElementDecl(namespace = "", name = "name")
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
public JAXBElement<String> createName(String value) {
return new JAXBElement<String>(_Name_QNAME, String.class, null, value);
}
@XmlElementDecl(namespace = "", name = "hostname")
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
public JAXBElement<String> createHostname(String value) {
return new JAXBElement<String>(_Hostname_QNAME, String.class, null, value);
}
@XmlElementDecl(namespace = "", name = "password")
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
public JAXBElement<String> createPassword(String value) {
return new JAXBElement<String>(_Password_QNAME, String.class, null, value);
}
@XmlElementDecl(namespace = "", name = "user")
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
public JAXBElement<String> createUser(String value) {
return new JAXBElement<String>(_User_QNAME, String.class, null, value);
}
}
XMLToObject - Klasse (Hier wird der ganze Vorgang gestartet)
Hier Frage ich mich, ob es ebenfalls in Ordnung ist, wie ich das mit dem Environment umgesetzt habe. Kann ich mit in meiner Singleton-Klasse Environment eine setEnvironment() Methode schreiben die ein Environment Object entgegennimmt und das einzige Object damit updatet? Sinn hie rist, dass ich die ArrayList mit den Systems in jeder Klasse verfügbar sind. Denn diese zeige ich später in einer JList an.
Ist eventuell ein wichtiger Hintergrund, damit ihr mein Problem versteht, bzw. mir helfen könnt.
Java:
public class XMLtoObject {
static Log4JLogger logger = Log4JLogger.getInstance();
public static void createObjectFromXML(){
try {
JAXBContext jc = JAXBContext.newInstance("de.ernstings.xml");
Unmarshaller unmarshaller = jc.createUnmarshaller();
Environment environment = Environment.getInstance();
environment = (Environment) unmarshaller.unmarshal(new File(System.getProperty("user.dir") + "\\conf\\environment.xml"));
Environment.getInstance().setEnvironment(environment);
// for(int i = 0; i < environment.getSystem().size(); i++){
// de.ernstings.model.System system = environment.getSystem().get(i);
// System.out.println("System " + system.getName());
// }
} catch (JAXBException e) {
logger.log(Level.ERROR, XMLtoObject.class, "Fehler beim Einlesen der XML Datei.", e);
}
}
}
Wenn noch eine Verbesserung entweder mit einer anderen API oder im Programmcode würde ich mich über eure Vorschläge freuen..
Viele Grüße von der Insel