Das Notes Forum

Lotus Notes / Domino Sonstiges => Java und .NET mit Notes/Domino => Thema gestartet von: arcon am 08.01.04 - 16:03:33

Titel: JAVA Agent / LDAP-Notes
Beitrag von: arcon am 08.01.04 - 16:03:33
Hallo, ich habe hier einen Agent der aus LDAP Daten lesen und in ein Notesdocument
Schreib soll.


Nur hatt er ein Problem mit dem Vector und ich komme nicht drauf welches ?

Code
Hashtabelle fuer Properties

INITIAL_CONTEXT_FACTORY : com.sun.jndi.ldap.LdapCtxFactory

PROVIDER_URL : ldap://ldap.wuestenrot.at

Context

Initialisieren des Contextes

Result= [uid: aub]

NotesException: Unknown or unsupported object type in Vector

   at lotus.domino.local.Document.NappendItemValue(Native Method)

   at lotus.domino.local.Document.appendItemValue(Unknown Source)

   at JavaAgent.NotesMain(JavaAgent.java:62)

   at lotus.domino.AgentBase.runNotes(Unknown Source)

   at lotus.domino.NotesThread.run(NotesThread.java:208)

Code
import lotus.domino.*;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.DirContext;
import javax.naming.directory.Attributes;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import java.util.Vector;

public class JavaAgent extends AgentBase {

   public void NotesMain() {

      try {
         Session session = getSession();
         AgentContext agentContext = session.getAgentContext();
               
         System.out.println("Hashtabelle fuer Properties");
         Hashtable env = new Hashtable(11);
         
         System.out.println("INITIAL_CONTEXT_FACTORY : com.sun.jndi.ldap.LdapCtxFactory");
         env.put(   Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
         
         System.out.println("PROVIDER_URL : ldap://ldap.xxx.at");
         env.put(   Context.PROVIDER_URL,"ldap://ldap.xxx.at/o=xxx,c=at");
         
         System.out.println("Context");
      try {
         // initialisieren des Contextes
         System.out.println("Initialisieren des Contextes");
         DirContext ctx = new InitialDirContext(env);

         // Suchparameter
         SearchControls constraints = new SearchControls();
         // Auch Unterebenen durchsuchen
         constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);

         // Suche starten
         NamingEnumeration results =
            ctx.search("ou=personen", "o=wds", constraints);

         // Durch alle gefundenen Datensätze durchgehen
         while (results != null && results.hasMore()) {
            // Das nächste Ergebnis aussuchen
            SearchResult si = (SearchResult) results.next();
            // Attribute
            Attributes attrs = si.getAttributes();
            if (attrs == null)
               System.out.println("No attributes");
            else // Nur die UID ausgeben
            try {
               Database db = agentContext.getCurrentDatabase();
               Document doc = db.createDocument();
               doc.appendItemValue("Form", "LDAP");
                  doc.appendItemValue("Subject", "Test Document");
                  
                  Vector v = new Vector();
               v.addElement(attrs.get("uid"));  
               System.out.println("Result= " + v);
               
                  doc.appendItemValue("UID",v);
                  System.out.println("Result= " + attrs.get("uid"));
               doc.save();
               }catch(Exception e) {e.printStackTrace();}                   
         }
         // und tschüss ...
         ctx.close();
      } catch (NamingException e) {
         System.err.println("Problem : " + e);
      }
         
      } catch(Exception e) {
         e.printStackTrace();
      }
   }
}



Ich hoffe einer weis Rat  :( Arcon
Titel: Re:JAVA Agent / LDAP-Notes
Beitrag von: animate am 08.01.04 - 16:46:00
Fehler ist scheinbar in dieser Zeile

 System.out.println("Result= " + v);


ich weiß net ob das geht, so nen String mit nem Vector zu verbinden.
ich würds mal mit
 System.out.println("Result= " + v.toString());

probieren
Titel: Re:JAVA Agent / LDAP-Notes
Beitrag von: Axel_Janssen am 10.01.04 - 00:24:43
Fehler ist scheinbar in dieser Zeile

 System.out.println("Result= " + v);


ich weiß net ob das geht, so nen String mit nem Vector zu verbinden.
ich würds mal mit
 System.out.println("Result= " + v.toString());

probieren

Interessanter Thread.  ;D

Potsmoker, das kann es nicht sein.
Jede Klasse erbt von java.lang.Object.
java.lang.Object hat eine Methode toString(), die von der jeweiligen konkreten Klasse überschrieben werden kann.
Klassen sind Förmchen von Objekten.  

Dadurch ist sichergestellt, dass jedes Objekt eine Methode toString() besitzt (da das - sagen wir - Sandkastenförmchen --> Klasse eine hat).
 
Bei einer String-Konkenatierung von Objekten (wie in dem betreffenden System.out.println statement) wird in Java immer automatisch die toString()-Methode der jeweiligen Objekte aufgerufen.  

Das Problem scheint zu sein, dass der Vector Objekte enthält, deren Klassen nicht gefunden werden. Möglicherweise kannst du den Typ der Objekte im Vector über
a) einen Debugger (z.B. von Eclipse)
oder
b) Introspection
herausfinden.

Bin mir aber nicht sicher. Das ist ein nicht-triviales Problem.

Btw. wird in Vector die toString() Methode derart überschrieben, dass über die Elemente des Vectors iteriert wird und das in der Form:
"[" + Object1.toString() + "," + Object2.toString() + "," + ... + "," + Objectn.toString() + "]" ausgegeben wird. Kann jeder Interessierte selbst ausprobieren.

Gruß Axel
Titel: Re:JAVA Agent / LDAP-Notes
Beitrag von: Manfred Dillmann am 10.01.04 - 00:30:43
Hallo Axel !

<off-topic>
Hey, Du lebst ja noch, ich habe ja nix mehr von Dir gehört - hattest bestimmt viel um die Ohren, richtig?
</off-topic>

Gruss
Manfred
Titel: Re:JAVA Agent / LDAP-Notes
Beitrag von: Axel_Janssen am 10.01.04 - 00:42:09
Yup. In-der-Tat.

Inklusive eines Gesprächs mit dem Management, dass ich meine Posting-Politik umstellen soll.

Ich finde das völligst in Ordnung und es ist mehr ein Selbstschutz. Man muss sich einfach mal überlegen, wenn ich mit Leuten in einem Projekt arbeite und jemand da allein 10 Minuten Überstunden machen muß, ohne es zu wollen, ist das schon nicht o.k.. Es gibt noch zahlreiche andere Argumente.

Werde meine hiesigen Aktivitäten also weitgehendst auf das Wochenende beschränken (in der Woche habe ich zusäztlichen Zertifizierungs-Lern-Tasks).

Gruß Axel

 
Titel: Re:JAVA Agent / LDAP-Notes
Beitrag von: Manfred Dillmann am 10.01.04 - 00:49:23
Hallo Axel!

>>Ich finde das völligst in Ordnung und es ist mehr ein Selbstschutz.<<

Man muss seine Schwerpunkte richtig setzen, keine Frage.

Ich bin ja mit meinem Problem auch halbwegs zurande gekommen, es funktioniert scheinbar jetzt auch mit Proxy-Auth. Ich würde Dir aber gerne noch mal den aktuellen Code senden - von wegen error-handling, also diese "catch" Anweisungen. In Deinem Code hast Du da ja (wenn erforderlich) noch mal expizit den Input-Stream "zugemacht".

Gruss
Manfred
Titel: Re:JAVA Agent / LDAP-Notes
Beitrag von: Axel_Janssen am 10.01.04 - 00:58:51
Hallo Axel!

>>Ich finde das völligst in Ordnung und es ist mehr ein Selbstschutz.<<

Man muss seine Schwerpunkte richtig setzen, keine Frage.

Ich bin ja mit meinem Problem auch halbwegs zurande gekommen, es funktioniert scheinbar jetzt auch mit Proxy-Auth. Ich würde Dir aber gerne noch mal den aktuellen Code senden - von wegen error-handling, also diese "catch" Anweisungen. In Deinem Code hast Du da ja (wenn erforderlich) noch mal expizit den Input-Stream "zugemacht".

Das sind allgemeine best practices, die in jedem besseren Java-Buch stehen.

Überleg dir einfach:

Zeile 1: try
Zeile 2: openStream()
Zeile 3: doStuff
Zeile 4: doMoreStuff
Zeile 5: closeStream()
Zeile 6 catch IOException

Was ist, wenn in Zeile 3 oder 4 ein Error auftritt?
Der Stream wird nicht geschlossen.
Der Stream ist dann eine blockierte Ressource (nicht gut).

Gruß Axel
Titel: Re:JAVA Agent / LDAP-Notes
Beitrag von: arcon am 13.01.04 - 14:54:53
So habe den Fehler gefunden, im "javax.naming.directory.Attribute" gibt es die Methode get()die man verwenden sollte  ::)

Das heist attrs.get("uid") gibt das Objekt ansich zurück und mit der Methode attrs.get("uid").get() bekommt man den Wert. Darum konnte Notes nichts damit anfangen beim Zuweisen.

System.out.println("Result= " + attrs.get("uid")) => Funktioniert auch ohne get(), aus den von Axel erklärten gründen.

THX for Help Arcon

Hier vollständigkeitshalber der funktionierende Code.

import lotus.domino.*;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.DirContext;
import javax.naming.directory.Attributes;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import java.util.Vector;

public class JavaAgent extends AgentBase {

   public void NotesMain() {

      try {
         Session session = getSession();
         AgentContext agentContext = session.getAgentContext();
               
         System.out.println("Hashtabelle fuer Properties");
         Hashtable env = new Hashtable(11);
         
         System.out.println("INITIAL_CONTEXT_FACTORY : com.sun.jndi.ldap.LdapCtxFactory");
         env.put(   Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");
         
         System.out.println("PROVIDER_URL : ldap://ldap.xxx.at");
         env.put(   Context.PROVIDER_URL,"ldap://ldap.xxx.at/o=xxx,c=at");
         
         System.out.println("Context");
      try {
         // initialisieren des Contextes
         System.out.println("Initialisieren des Contextes");
         DirContext ctx = new InitialDirContext(env);

         // Suchparameter
         SearchControls constraints = new SearchControls();
         // Auch Unterebenen durchsuchen
         constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);

         // Suche starten
         NamingEnumeration results =
            ctx.search("ou=personen", "o=wds", constraints);

         // Durch alle gefundenen Datensätze durchgehen
         while (results != null && results.hasMore()) {
            // Das nächste Ergebnis aussuchen
            SearchResult si = (SearchResult) results.next();
            // Attribute
            Attributes attrs = si.getAttributes();
            if (attrs == null)
               System.out.println("No attributes");
            else // Nur die UID ausgeben
            try {
               Database db = agentContext.getCurrentDatabase();
               Document doc = db.createDocument();
               doc.appendItemValue("Form", "LDAP");
               doc.appendItemValue("Subject", "Test Document");        
               doc.appendItemValue("UID",attrs.get("uid").get());
                  System.out.println("Result= " + attrs.get("uid"));
               doc.save();
               doc.recycle();
               db.recycle();
               }catch(Exception e) {e.printStackTrace();}                  
         }
         // und tschüss ...
         ctx.close();
      } catch (NamingException e) {
         System.err.println("Problem : " + e);
      }
         session.recycle();
      } catch(Exception e) {
         e.printStackTrace();
      }
   }
}

Titel: Re:JAVA Agent / LDAP-Notes
Beitrag von: Axel_Janssen am 17.01.04 - 01:12:13
danke für den code.

WICHTIGER TIPP: Recycle die Notes-Objekte. Das kann zu memory leaks führen.
morgen mehr.
Titel: Re:JAVA Agent / LDAP-Notes
Beitrag von: arcon am 20.01.04 - 13:19:30
Hab es geändert, hoffe nix übersehen zu haben !