Autor Thema: DXL in Java nützen (JAXB)  (Gelesen 6562 mal)

Offline Fedaykin

  • Aktives Mitglied
  • ***
  • Beiträge: 229
  • Geschlecht: Männlich
  • Ya Hya Chouhada!
DXL in Java nützen (JAXB)
« am: 22.11.11 - 16:01:54 »
Hallo zusammen

Wie manche hier wissen beschäftige ich mich öfters mit DXL.
Da nun immer mehr Java gefragt ist habe ich mal geschaut was für Möglichkeiten man da mit DXL (Domino XML) hat.
Dabei bin ich auf JAXB (Java to XML Binding) gestossen.

Dadurch wäre es möglich auf DXL zuzugreifen wie auf Java Klassen.
Leider sind meine Java Kenntnisse noch bescheiden. Aber habe es trotzdem versucht.
Also habe ich mit xjc und dem XML Schema von DXL Java Klassen generieren lassen.

Dazu habe ich mir die XSD Datei (zu finden C:\Programme\IBM\Lotus\Notes\xmlschemas) in ein Verzeichnis kopiert und folgende Befehlszeile aufgerufen:
C:\Programme\java\jdk1.6.0_07\bin\xjc domino_8_5_3.xsd

Dann habe ich den ganzen generierten Code in einen Agent importiert und den nachfolgenden Code zusammengeschustert.

Hilfsklasse:
Code
import java.io.StringReader;
import java.io.StringWriter;

import javax.xml.bind.JAXB;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Marshaller;
import javax.xml.namespace.QName;

import com.sun.xml.internal.bind.marshaller.NamespacePrefixMapper;

public class DXLToJava {
	private static class NamespacePrefixDXL extends NamespacePrefixMapper {

		@Override
		public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
			if (suggestion == null)
				return "dxlns";

			return suggestion;
		}
	}

	public static Object toObject(String DXL, Class<?> type) throws Exception
	{
		StringReader input = new StringReader(DXL);		
		Object obj=JAXB.unmarshal(input, type);
		input.close();
		
		return obj;		
	}	
	
	public static String toXML(Object obj) throws Exception
	{
		String result;
		StringWriter writer = new StringWriter();
		JAXBContext objJAXBContext=JAXBContext.newInstance(obj.getClass());
		NamespacePrefixMapper objMapper=new NamespacePrefixDXL();
	    Marshaller marshaller = objJAXBContext.createMarshaller();
	    marshaller.setProperty("com.sun.xml.internal.bind.namespacePrefixMapper", objMapper);
	    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
	    marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
		QName qname=new QName(obj.getClass().getSimpleName().toLowerCase());
		JAXBElement<Object> element=new JAXBElement(qname, obj.getClass(), obj);
		
	    marshaller.marshal (element, writer);
	    
		writer.close();

		result=writer.toString();
		result=result.replace("dxlns:", "");
		
		return result;
	}
}

Java Agent:
Code
import lotus.domino.*;

import com.lotus.dxl.Column;
import com.lotus.dxl.Columnheader;
import com.lotus.dxl.View;

public class JavaAgent extends AgentBase {

	public void NotesMain() {

		try {
			Session session = getSession();
			AgentContext agentContext = session.getAgentContext();

			final String VIEW_NAME="(All Documents)";

			DxlExporter exporter=session.createDxlExporter();
			DxlImporter importer=session.createDxlImporter();

			lotus.domino.Database db=agentContext.getCurrentDatabase();
			lotus.domino.View vw=db.getView(VIEW_NAME);
			lotus.domino.Document doc=db.getDocumentByUNID(vw.getUniversalID());

			String DXL=exporter.exportDxl(doc);
			
			View objView=(View)DXLToJava.toObject(DXL, View.class);

			for (int i=0;i<objView.getColumnOrSharedcolumnref().size();i++){
				Column objColumn=(Column) objView.getColumnOrSharedcolumnref().get(i);
				Columnheader objHeader=(Columnheader) objColumn.getColumnheader();
				//System.out.println(objHeader.getTitle());
				objHeader.setTitle("Test1");
			}

			DXL=DXLToJava.toXML((Object) objView);
			//System.out.println(DXL);
			
			importer.setDesignImportOption(DxlImporter.DXLIMPORTOPTION_REPLACE_ELSE_CREATE);

			try {
				importer.importDxl(DXL, db);
				System.out.println("Import erfolgreich!");
			} catch (Exception e) {
				System.out.println(importer.getLog());
			}

		} catch(Exception e) {
			e.printStackTrace();
		}
	}
}

Hinweis: Musste bei mir die Datei C:\Programme\ibm\lotus\notes\jvm\lib\security\java.policy modifizieren damit Agent genug Rechte bekam.

Werde bei Interesse später noch eine Beispiel Datenbank dazu stellen, aber im Moment leider noch nicht möglich.

Vielen Dank für euer Interesse und jede konstruktive Kritik.

PS: Falls jemand Fragen dazu hat versuche ich gerne zu helfen. Nur wie gesagt sind meine Java Kenntnisse sehr begrenzt.

Gruss
Remo
« Letzte Änderung: 22.11.11 - 16:24:26 von Fedaykin »
Ich sage Euch: "Man muss noch Chaos in sich haben, um einen tanzenden Stern gebären zu können."

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: DXL in Java nützen (JAXB)
« Antwort #1 am: 24.11.11 - 10:22:37 »
Hallo Remo,

Du hast dann die gesamte DXL Struktur als Objekt-Baum?
Wie sieht die Struktur so ungefähr aus?
ObjektB
--> ObjektC
----->ObjektD


Und wo sind die praktischen Einsatzgebiete von DXL? Ich habs nur 1x in einem realen Projekt gebraucht. Da gings um die Portierung einer Notes Anwendung nach Update CRM.

Something completly different: Da Du offenbar an Java interessiert bist und ich nun endlich mein HTTPClient für Notes7 und drüber in eine openSource Form bringen will, könntest Du da nicht eventuell ein wenig mitzumachen?
Da gehts darum auf externe Webseiten zuzugreifen, was einschließt:
- die Konsumption von Webservices jedweger Art
- automatisiertes Herunterladen von Dateien im Web
- eventuell auch periodisches Auslesen von Webseiten
- etc.

Ich habs vor allem für den ersten Punkt mehrfach erfolgreich eingesetzt. Und dafür gibts immer wieder Interesse.

Gruß Axel 


Gruß Axel
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline Fedaykin

  • Aktives Mitglied
  • ***
  • Beiträge: 229
  • Geschlecht: Männlich
  • Ya Hya Chouhada!
Re: DXL in Java nützen (JAXB)
« Antwort #2 am: 24.11.11 - 22:06:41 »
Hallo Alex

Ja, die Struktur hat man dann als Java Objektbaum.
Das Objektmodell ist leider nicht unbedingt bequem zu bedienen.
Die Spaltentitel wie im Beispiel waren zum Beispiel einfach.
Habe inzwischen auch mal die Spaltenformel versucht und die war ziemlich verschachtelt.
Gibt da so ObjectFactory um selbst Elemente zu bauen und musste da einen Zweig austauschen.
Zudem sind da wohl oft diese .get(intIndex).

Bisher habe ich vor allem mit LS mit DXL gearbeitet.
Manchmal versucht Baum schön als Sting aufzubauen, manchmal auch etwas Quick and Dirty XML Snipplets
zusammengeschustert.
Was ich zum Teil schon gemacht hab:
- Ansichten im Erscheinungsbild angleichen
- Bild in RT Item reingehängt
- Tabelle als "aufgehübschtes" Log für RT Item zusammengebaut
- Spaltentitel und Formeln verändern um für andere Sprachen Ansichten zu generieren (noch nicht praktisch eingesetzt)
- Anhänge aus Strings bauen würde auch gehen (aber nicht praktisch eingesetzt)

Wenn man nur etwas verändert kann man bestehendes Note (Daten oder Design) überschreiben.
Bei Ansichten die ich komplett gebaut habe einfach als neues Note importiert.
Um RT Item zu bauen habe ich temporäres Dokument gebaut und dann RT Item in Dokument kopiert wo hin sollte.

Nervig sind übliche Einschränkungen:
- RT Item werden nur durch ReOpen von Dokument in FontEnd sichtbar.
- Veränderungen an Ansichten benötigen manuellem ReOpen der Datenbank bevor benutzbar.

Zum zweiten Teil. Interesse habe ich schon.
Bin aber alles andere als Java Profi und relativ wenig Erfahrung mit Webservices.
Aber wenn meinst, dass ich wo helfen kann versuche ich gerne.

Gruss
Remo
« Letzte Änderung: 24.11.11 - 22:10:25 von Fedaykin »
Ich sage Euch: "Man muss noch Chaos in sich haben, um einen tanzenden Stern gebären zu können."

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: DXL in Java nützen (JAXB)
« Antwort #3 am: 25.11.11 - 19:12:31 »
Ist natürlich die Frage, ob es wirklich einfacher ist, den Objektbaum zu bearbeiten als das DXL selbst mit der DOM Api.
Java besitzt noch verschiedene mögliche Alternativen zu DOM. Ich hab letztlich die besten Erfahrungen mit JDom gemacht, vor allem weils auch XPath Unterstützung hat. In Java gibts seit 1.5 XPath Unterstützung in der Sprache selbst, nur hab ich damit noch nicht gearbeitet. Eine weitere Alternative wäre XSLT. Mit Java hast du auch XSLT 2.0 Unterstützung, was vieles einfacher macht. Ich hab nach einem gescheiterten Projekt jahrelang den Standpunkt vertreten, dass XSLT einfach zu crazy ist. Nun begegne ich aber immer wieder Leuten, die damit erstaunliches zu Wege bringen. Da ist dann mein Interesse wieder erwacht. Ich glaub, dass das der beste Weg ist, um DXL, das ja ein sehr komplexes Format ist, in den Griff zu bekommen. Erfordert aber sicher einiges an Einarbeitung.
 
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline Fedaykin

  • Aktives Mitglied
  • ***
  • Beiträge: 229
  • Geschlecht: Männlich
  • Ya Hya Chouhada!
Re: DXL in Java nützen (JAXB)
« Antwort #4 am: 28.11.11 - 12:56:07 »
Hallo zusammen

Dazu würde ich sagen das kommt natürlich darauf an was man damit überhaupt vor hat.
In Java existieren recht viele Möglichkeiten ein XML zu bearbeiten.

Nachfolgend mal eine Liste zu was wo einsetzen.
Diese muss nicht unbedingt so stimmen und ist wahrscheinlich auch nicht vollständig.
Aber ergänze und korrigiere Liste gerne bei Einwänden und vielleicht ist sie ja für jemanden hilfreich.

Für sehr simple Sachen kann es manchmal sogar Sinn machen die Struktur zu ignorieren (das ganze als String zu betrachten):
- StringReplace
- Snipplets zusammenbauen

Um Werte in der Struktur abzuändern würde ich sagen:
- XPath

Zum bauen:
- DOM
- Was eigenes (gibt es eigentlich so etwas wie Node "Prototyp", das man in Java dafür nehmen könnte?)

Zum parsen (auseinandernehmen):
- SAX
- StAX
- DOM

Um das ganze komplett umzuwandeln:
- XSLT

Um ein XML nach Schema zu bearbeiten:
- JAXB

Je nachdem kann natürlich auch Speicherbedarf und Kenntnisse des Programmierers eine Rolle spielen:

So ist für mich XSLT immer noch ein spanisches Dorf.
Und JAXB wird bei grösseren Sachen wohl recht speicherhungrig sein.


Freue mich auf Korrekturen, Ergänzungen usw.

Gruss
Remo
« Letzte Änderung: 30.11.11 - 17:20:06 von Fedaykin »
Ich sage Euch: "Man muss noch Chaos in sich haben, um einen tanzenden Stern gebären zu können."

Offline Gandhi

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 918
  • Geschlecht: Männlich
  • Domino for the masses
Re: DXL in Java nützen (JAXB)
« Antwort #5 am: 30.11.11 - 15:27:48 »
In der Liste der XML Tools fehlt unter den Parsen mein neuer Liebling StAX
Der "Wenn ich" und der "Hätt' ich" das sind zwei arme Leut'
oder für den Süden:
Hatti Tatti Wari - san drei Larifari

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz