Autor Thema: JAVA Agent / LDAP-Notes  (Gelesen 7584 mal)

Offline arcon

  • Frischling
  • *
  • Beiträge: 47
  • Geschlecht: Männlich
  • Notes4Ever
JAVA Agent / LDAP-Notes
« 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

Offline animate

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.540
  • Uh, I'm just gonna go find a cash machine.
    • LA2
Re:JAVA Agent / LDAP-Notes
« Antwort #1 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
Thomas

Fortunately, I'm adhering to a pretty strict, uh, drug, uh, regimen to keep my mind, you know, uh, limber.

Offline Axel_Janssen

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 769
Re:JAVA Agent / LDAP-Notes
« Antwort #2 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
... design patterns are abstract designs that help identify the structure and elements involved in a specific design solution. From this, a concrete implementation can be produced.
Kyle Brown

Offline Manfred Dillmann

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 859
  • Geschlecht: Männlich
    • www.madicon.de
Re:JAVA Agent / LDAP-Notes
« Antwort #3 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

Support, Beratung, Schulung, Anwendungsentwicklung oder Tipps & Tricks zu Lotus Notes/Domino?
www.madicon.de

Personalisierte Notes/Domino Serienmails?
madicon easyMail


Offline Axel_Janssen

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 769
Re:JAVA Agent / LDAP-Notes
« Antwort #4 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

 
« Letzte Änderung: 10.01.04 - 00:44:31 von Axel_Janssen »
... design patterns are abstract designs that help identify the structure and elements involved in a specific design solution. From this, a concrete implementation can be produced.
Kyle Brown

Offline Manfred Dillmann

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 859
  • Geschlecht: Männlich
    • www.madicon.de
Re:JAVA Agent / LDAP-Notes
« Antwort #5 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

Support, Beratung, Schulung, Anwendungsentwicklung oder Tipps & Tricks zu Lotus Notes/Domino?
www.madicon.de

Personalisierte Notes/Domino Serienmails?
madicon easyMail


Offline Axel_Janssen

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 769
Re:JAVA Agent / LDAP-Notes
« Antwort #6 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
... design patterns are abstract designs that help identify the structure and elements involved in a specific design solution. From this, a concrete implementation can be produced.
Kyle Brown

Offline arcon

  • Frischling
  • *
  • Beiträge: 47
  • Geschlecht: Männlich
  • Notes4Ever
Re:JAVA Agent / LDAP-Notes
« Antwort #7 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();
      }
   }
}

« Letzte Änderung: 21.01.04 - 10:29:51 von arcon »

Offline Axel_Janssen

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 769
Re:JAVA Agent / LDAP-Notes
« Antwort #8 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.
... design patterns are abstract designs that help identify the structure and elements involved in a specific design solution. From this, a concrete implementation can be produced.
Kyle Brown

Offline arcon

  • Frischling
  • *
  • Beiträge: 47
  • Geschlecht: Männlich
  • Notes4Ever
Re:JAVA Agent / LDAP-Notes
« Antwort #9 am: 20.01.04 - 13:19:30 »
Hab es geändert, hoffe nix übersehen zu haben !

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz