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.
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
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.
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
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.
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
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?
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 :
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.
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…
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.
ist eigentlich ein guter Anfang im ersten Posting, aber Attribute taucht nicht recht auf, ‚Daten‘ ist allgemein, und schon bald bei ‚Strings‘