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:
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:
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