Newsgroup: it.comp.java
Titolo: Collection

Ciao a tutti,
è la prima volta che scrivo qui, sto facendo la tesi ed è da poco che
mi sono avvicinata a java.
Spero possiate aiutarmi.. il mio problema è questo:
ho estratto da un certificato digitale degli attributi, tramite il
metodo getSubjectAlternativeNames della classe
java.security.cert.X509Certificate.
Se nella mia servlet faccio una stampa di questi attributi, non ho
problemi (il ché significa che il metodo è applicato correttamente).
Il metodo estrae una Collection che è composta da massimo 9 entry
[0-8], ognuna delle quali è una lista che contiene 1 intero ed 1
stringa. Nel mio caso ho 2 entry, quindi 2 liste.
Quello che dovrei fare è estrarre da tale collection la stringa della
seconda entry e memorizzarla per usi successivi, ma non so
assolutamente come fare......
Innanzitutto è corretto memorizzare la mia Collection in questo modo:
(?)
Collection altnam = cert.getSubjectAlternativeNames();
E, se sì, posso utilizzare il metodo toArray() per portare tutti gli
elementi della Collection in un array oppure no? Una cosa tipo:
Object[] obj = altnam.toArray();
A questo punto dovrei fare il casting per riportare tutto in
stringhe??? Si può fare? C'è un modo + veloce per avere quello che mi
serve?
Beh è molto tardi e inizio ad avere sonno, spero di essermi spiegata e
che qualcuno mi possa chiarire le idee.....
Grazie
Letizia

 qualcuno mi possa chiarire le idee..... Grazie Letizia
 
Come anche tu hai scritto, gli oggetti presenti nella Collection
restituita dal metodo getSubjectAlternativeNames() non sono String, ma
List contenenti ciascuno due elementi: il primo e' un Integer che
rappresenta il tipo del nome, il secondo e' il nome e puo' essere un
oggetto di tipo String (se ne esiste una forma codificata come tale) o un
array di byte (se tale forma non esiste, ad esempio per i nomi X.400).
Quindi non puoi fare semplicemente un cast a String degli oggetti presenti
nel tuo array obj. Se l'unica cosa che ti interessa e' la stringa presente
nel secondo elemento dela lista (che a sua volta e' nel secondo elemento
della collection) puoi scrivere una cosa del genere:
String str = new String(((List)obj[1]).get(1));
La creazione di una nuova stringa risolve il problema che nella lista puoi
trovare sia una stringa che un array di byte. Se invece sei sicura che
l'oggetto nella lista e' proprio una stringa puoi limitarti a fare un
cast:
String str = (String)((List)obj[1]).get(1);
Chiedi anche se c'e' un modo "+ veloce". Non mi pare ci siano problemi di
"velocita'" in questo caso. Forse intendi con un codice un po' piu'
compatto o semplice?
Provo a riscriverlo piu' compattamente eliminando le variabili intermedie
(ma non e' sicuramente piu' semplice o chiaro):
String str =
(String)((List)(cert.getSubjectAlternativeNames().toArray())[1]).get(1);
...abbastanza illeggibile, no?
-- 
Lucio Benfante
Brainbench MVP for Java 1
http://www.brainbench.com
MyTranscript: 
http://www.brainbench.com/transcript.jsp?pid=167064

 ...abbastanza illeggibile, no?
Ti sembrerà assurdo ma, seppure quest'ultima istruzione compattata sia
meno leggibile delle altre, è l'unica che mi funziona, con la variante
che aggiungo toString() alla fine, cioè:
String str = 
(((List)(cert.getSubjectAlternativeNames().toArray())[1]).get(1)).toString();
Comunque così tutto ok. 
Se invece provo a scrivere la stessa cosa scompattando in 3 istruzioni
(quelle del primo messaggio e della tua risposta) o in 2 istruzioni,
non va.
Ho provato così:
Object obj[] = (Object [])cert.getSubjectAlternativeNames().toArray();
String str = (((List)obj[1]).get(1)).toString();
L'errore che mi viene segnalato dal compilatore è "cannot resolve
symbol: variable obj"
Eppure misembra corretta...ho dichiarato un array di object generici e
gli ho assegnato la collection trasformata in array..
Ho provato anche con 
Object[] obj = cert.getSubjectAlternativeNames().toArray();
Idem...
Scompattando anche questa istruzione in 2:
Collection coll = getSubjectAlternativeNames();
Object[] obj = coll.toArray();
String str = ((List)obj[1].get(1)).toString();
è su coll che mi viene segnalato l'errore...
Ma cosa sto sbagliando secondo te?
Ciao Letizia

 Ciao Letizia
 
Ciao,
prova cosi' (mancava l'indicazione della variabile cert e una parentesi
attorno a obj[1]):
Collection coll = cert.getSubjectAlternativeNames();
Object[] obj = coll.toArray();
String str = (String)((List)(obj[1])).get(1);


 String str = (String)((List)(obj[1])).get(1);
Perfetto, ora è tutto a posto.
A buon rendere :)
Ciao, Letizia