LDAP Rückgabe: Zahlenfolge erkennen um diese als Datum darzustellen

Hallo,

ich habe eine LDAP Connection umgesetzt und bekomme Daten wie Name, Vorname, LoginDatum etc. heraus.
Leider sind im LDAP Verzeichnis nicht alle Daten immer vollständig vorhanden, so dass ich das LoginDatum nicht immer fassen kann.

Die Daten erhalte ich über eine NamingEnumeration über die LDAP-Rückgabe (results.hasMore()).
Ich müsste jetzt prüfen, ob in den Rückgabewerten ein Datum ist enthalten ist…der Wert ist aber immer ein String. Fällt jemanden ein, wie ich das lösen kann?

Im LDAP werden Datums in dieser Form “1406527102584” geliefert. Ich wandle den String dann in eine Long und dann in ein Datum um.

GGK

wie sehen denn konkrete Beispiele für Rückgabewerte aus? NamingEnumeration klingt nach mehreren Werten, gar mit Keys, oder alles zusammengekleistert ein beliebiger String?

auch dann, falls wunderschönes Format a la “blahblah Date:1406527102584 blahblah”,
dann können ja keine Wünsche offen sein, Zahl herausschneiden und parsen wie du es schon hast,

falls die Werte beliebig zusammengefügt sind, etwa Dateiname endend mit 99 und Date zu “991406527102584” hintereinanderweg,
dann kann es freilich richtig schwer werden, wobei vielleicht noch mit bekannten Werteberech von einem Date zu erraten und abzuschneiden

irgendwo zwischen einfach und schwer liegt sicherlich die Analyse eines Strings, wenn dazu Fragen, dann mehr Details hilfreich,
dieser Punkt ist recht unabhängig von LDAP

wenn du dir andere LDAP-Möglichkeiten wünschst, dann kann ich dazu nix beitragen

ich führe beispielhaft zwei mögliche Rückgabeblöcke an:
Name = Müller
Vname = Hansi
Titel = MasterOFDesaster
lastLogonDate = 1406527102584
Group1 = memberOf

Name = Mayer
Vname = Seppi
lastLogonDate = 1406527102584
Group1 = memberOf

Bei der zweiten Gruppe fehlt der Titel. Die einfachste Variante ist in der For Schleife einen Count laufen zu lassen und so das Datum rauszufischen. Das funktioniert nicht, wenn ein Rückgabeblock dieses Datum nicht hat. Da ich ausschlieslich den Datentyp String erhalte, kann ich nicht auf den Datentyp zurückgreifen.

         	  for (NamingEnumeration e = attr.getAll();e.hasMore();) {   
         	   count++;
       		   data = (String) e.next();
       		   if (count != 3 ) {
       			   
       			   //*System.err.println("data ["+count+"]: "+data);
       			   log.debug("data ["+count+"]: "+data);
       		   } else {
       			   
       			   long ticks = Long.parseLong(data);
       			   long milliseconds = ticks/10000;
       			   long timestamp = milliseconds - 11644473600000L;
       			   System.out.println(timestamp);
       			   SimpleDateFormat sdf = new SimpleDateFormat();
       			   sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
       			   System.err.println("data ["+count+"]: "+sdf.format(timestamp) );
       			   log.debug("data ["+count+"]: "+sdf.format(timestamp));
       			   
       			   System.err.println("data [4]: Tage seit letzem Login "+(System.currentTimeMillis()-timestamp)/1000/3600/24+"
");
       			   log.debug("data [4]: Tage seit letzem Login "+(System.currentTimeMillis()-timestamp)/1000/3600/24+"
");
       			   
       		   }

Ich könnte aber jeden Wert eines Blockes in eine Zahl umwandeln…wenn ich einen Fehler erhalte, dann wars definitiv ein String…das gefällt mir aber nicht.

GGK

was ist mit ‚lastLogonDate‘, das hast du nur einfach so dazugeschrieben?
nun, was du sonst noch an Information nutzen könntest (ungefähre Position in der Liste, Anzahl Ziffern, Wertebereich des Dates wenn fertig (Jahr 2014, nicht 1245) ) ergibt sich eigentlich alles von selbst,
müsste ich kaum erwähnen obwohl ich es nun doch gemacht habe,

im Wesentlichen bleibt es bei deinem Code, den hast du schon, auch das nichts neues,
dann bleibt mir nur nochmal zu sagen dass ich nix weiter zu sagen habe :wink:

edit:

NamingEnumeration<? extends Attribute> getAll()
Retrieves an enumeration of the attributes in the attribute set.
NamingEnumeration getIDs()
Retrieves an enumeration of the ids of the attributes in the attribute set.

http://docs.oracle.com/javase/7/docs/api/javax/naming/directory/Attributes.html

kannst du nicht doch an ‚lastLogonDate‘ usw. kommen?
wobei dieses getAll() Attribute liefert, nicht String…, in Attribute gibt es auch getAll(), das sieht verdächtiger aus

[QUOTE=SlaterB]

kannst du nicht doch an ‘lastLogonDate’ usw. kommen?[/QUOTE]

JA, aber dann müsste ich dieses Attribut in einer zweiten Abfrage konkret abfragen. Mehrfach Abfragen möchte ich aber vermeiden.

[QUOTE=SlaterB;98798]
wobei dieses getAll() Attribute liefert, nicht String…, in Attribute gibt es auch getAll(), das sieht verdächtiger aus[/QUOTE]
was meinst du damit?

GGK

was meine ich damit: ich habe Methoden zitiert, die nicht nur Werte sondern auch Ids liefern,
allerdings anscheinend nicht das getAll() das du verwendest wegen Attribute und nicht String als Werte der NamingEnumeration,

wenn du Attribute-Klasse vorliegen hast, deren getAll()-Methode dann wirklich String liefern könnte,
dann sehe ich auf die Schnelle in dieser Klasse keine Methode die etwa Ids liefert

des weiteren gilt sicherlich wie zuvor, ich muss immer einen Stand einnehmen :wink: :
Lage zu reinen Strings klar,
‚weitere Abfragen‘ oder sonstige LDAP-Möglichkeiten kann ich (nun wohl endgültig) nicht weiter kommentieren

Von welchem Typ ist denn attr in deinem Snippet und welche Javaversion nutzt du?
Sollte attr vom Typ javax.naming.Attribute sein, dann sollte getAll() eine NamingEnumeration<? extends Attribute> zurückgeben (prüfbar indem Zeile 4 deines Snippets durch folgendes ersetzt:

Object o = e.next();
System.out.println(e.getClass());
data = (String) o;

)

Sollte an dieser Stelle javax.naming.Attribute als Ausgabe kommen, dann ist dein Cast auf String falsch. Dann castest du auf Attribute und kannst anschließend die Methode getId() und get() arbeiten.

Ich bin noch auf der 6’er Version…

Attr ist vom Typ javax.naming.directory.Attribute;

und get.Class liefert mit immer String, diese Idee hatte ich schon mal…

Object: class java.lang.String	130511869487630565

Ich habe mir die Attribute nochmals angeschaut…und habs endlich kapiert…

mittels
attr.getID().equals("lastLogonTimestamp")

hab ich genau das bekommen, was ich brauche.

Ich bedanke mich fürs mitdenken und Spuren legen

GGK

ah, sind die 4 bis 5 Einträge nicht alle in einer getAll()-Enumeration von einem Attribute?
wenn du auch 4 bis 5 Attribute-Objekte hast, mit jeweils einen String aus getAll(), dann doch wirklich nicht schwer,

genauere Code-Übersicht, die hätte gleich am Anfang geholfen

[QUOTE=SlaterB]ah, sind die 4 bis 5 Einträge nicht alle in einer getAll()-Enumeration von einem Attribute?
wenn du auch 4 bis 5 Attribute-Objekte hast, mit jeweils einen String aus getAll(), dann doch wirklich nicht schwer,
[/QUOTE]

genau so ist es…
Für einen Anfänger auf dem Gebiet ist manches schwer…was für einen Profi ein Kinderspiel ist…
Warum ist das so:
es wird einem Anfänger relativ leicht gemacht eine LDAP Anbindung umzusetzen…ein bissl kopieren…anpassen und es flutscht…wenn jedoch Probleme auftauchen, muss man gleich verdammt tief in die Materie NamingEnumerations, Attributes einsteigen…und da wird einem klar, dass man in eine neue Materie eintaucht…und JAVA Docs zu den Themen zu lesen ist auch nicht gerade simple…

GGK

ich will nicht ewig drauf rumreiten, nur bei Gelegenheit ganz gut einmal zu realisieren, dass die Schwierigkeit hier nicht ausschließlich bei LDAP-Details lag,

mit deinem Code in Posting #3 hast du, ohne Absicht natürlich, angedeutet (ich bin selbst jetzt noch nicht zum letztlichen Stand sicher),
dass in der einen Schleife alle 4-5 Werte als Strings in einer NamingEnumeration zurückgeben werden,
damit kann man nicht viel machen

wenn aber eher

Schleife über 5 Attribute {
  String einzelwertJeAttribut = attr.getAll().next();
}

vorliegt, dann sind viel leichter die Möglichkeiten zu erkennen, dann liegt zu jedem String-Wert ein ganzes Attribute-Objekt mit Zusatz-Infos vor,

allein auch dass du ‚Attribute‘ selber in den ersten Postings nicht erwähnt hast,
in Sekunden ist die API dazu nachzuschlagen und getId() zu finden

alles kein Vorwurf, so geht es absolut zu als Anfänger, richtig,
aber lerne das richtige daraus: nicht irgendein Detail irgendeiner API jetzt bekannt,
sondern möglichst umfassenden Code posten (zuviel natürlich auch nicht gut…), verwendete Klassen in Fragen benennen usw. :wink:

ist eigentlich ein guter Anfang im ersten Posting, aber Attribute taucht nicht recht auf, ‚Daten‘ ist allgemein, und schon bald bei ‚Strings‘