Newsgroup: it.comp.java
Titolo: [JAXB] Modificare le classi generate

Ciao a tutti
mi sto ponendo questo problema: è corretto modificare manualmente le classi 
(aggiungendo solamente logica, senza quindi intaccare la parte interessata 
al marshaling) generate dal xjc fidandosi del fatto che lo schema xsd su 
cui ci si è appoggiati non cambierà mai? 
Chiaramente mi sembra una scelta pericolosa ma al momento non vedo buone 
alternative.
Sul tutorial mi pare che non si parli di questo problema ma i commenti 
automaticamente generati dal tool avvertono del "pericolo" ("Any 
modifications to this file will be lost upon recompilation of the source 
schema" ). Mi piacerebbe sentire le vostre opinioni o sapere se c'è qualche 
pattern che potrebbe venirmi in aiuto.
Grazie
pole
-- 
Note: Some input words use a deprecated author.
Note: Read with -deprecation to understand.
http://web.tiscali.it/meridies

 qualche pattern che potrebbe venirmi in aiuto.
Uhm... se c'è ancora qualcuno "in ascolto" provo a riformulare la domanda in 
modo più generico (e spero chiaro :) ).
Allora, sia data una Factory A che crea oggetti di tipo B. Ora io ho bisogno 
di aggiungere funzionalità agli oggetti creati senza modificare nè A nè B.
L'ereditarietà sembra non venirmi in aiuto perché, se anche io creassi una 
classe C che deriva da B con le funzionalità aggiuntive la Factory 
continuerebbe comunque a crearmi oggetti di tipo B. Per le interfacce vale 
lo stesso discorso.
La soluzione che mi viene in mente è di estendere B con una classe C che 
prenda un oggetto B nel costruttore. Le chiamate alla factory 
diventerebbero:
C c = new C( A.createB() );
In questo modo, tornando al problema del post precedente, se anche 
ricompilassi le classi A e B (ricordo generate automaticamente con jaxb) 
non rischierei di perdere il lavoro.
Questa soluzione mi sembra convincente ma mi piacerebbe sapere se qualcun 
altro ha mai affrontato questo problema e come l'ha risolto.
ciao :)


 di aggiungere funzionalità agli oggetti creati senza modificare nè A nè B.
Visitor ti va bene?
ciao
uL

 Visitor ti va bene?
Ciao Ugo
il problema che vedo nel Visitor è che necessita comunque del metodo 
accept() nell' Element da visitare (nel mio caso B che purtroppo non posso 
modificare) e in più "lavora" a run-time: il comportamento del sistema è 
definito a tempo di esecuzione mentre io cercavo qualcosa di "statico".
Nel caso concreto devo aggiungere agli oggetti di tipo B delle funzionalità 
di comparazione (p.e. equals() ) stabilite una sola volta a compile-time in 
modo tale che dato un qualunque oggetto di quel tipo (o al massimo di un 
suo sottotipo col meccanismo che ho descritto sopra) io possa sempre avere 
disponibili queste funzionalità.
Qualunque chiarimento/suggerimento firmato uL è sempre ben accetto ;)
Ovviamente grazie mille per l'interesse! 


 disponibili queste funzionalità.
se non puoi cambiarne l'interfaccia, non mi viene in mente altro che un 
bell'adapter. Se poi vuoi mantenere stabile l'interfaccia di adapter 
(che sostanzialmente e' un proxy), aggiungi solo visit ed utilizzi il 
visitor per l'implementazione delle operazioni. Il problema delle 
operazioni col visitor e' che probabilmente dovranno "rompere 
l'incapsulamento"
Se poi vuoi uscire dagli schemi classici, e sempre a condizione che io 
abbia capito qualcosa di quello che vuoi fare :) , forse la 
programmazione per aspetti puo' darti una mano. (forse, poiche' ancora 
non me ne sono fatto un parere preciso)
uL
P.S. Ovviamente tutto quanto detto senza conoscere bene il tuo problema, 
senza aver visto una riga di codice, ha il valore che ha... :)

 senza aver visto una riga di codice, ha il valore che ha... :)
Il mio problema (se così lo vogliamo chiamare) è abbastanza banale: lo copio 
dal post precedente esemplificando:
Nel caso concreto devo aggiungere agli oggetti di tipo B delle funzionalità 
di comparazione (p.e. equals() ) stabilite una sola volta a compile-time in 
modo tale che dato un qualunque oggetto di quel tipo (o al massimo di un 
suo sottotipo col meccanismo che ho descritto sopra) io possa sempre avere 
disponibili queste funzionalità.
In sostanza io ho oggetti di tipo B *non modificabili* definiti ad es. così:
public class B
{
        //...
}
e un factory A più o meno così:
public class A
{
        public static B createB()
        {
                //...
        }
}
Ovviamente io ho la possibilità di accedere a oggetti di tipo B *solo* 
attraverso la factory, però dentro quelli oggetti vorrei trovarci il mio 
metodo equals() o compare(). 
La ovvia soluzione è creare una classe C derivata da B:
public class C extends B
{
        public boolean compare( B b )
        {
                // ...
        }
}
col "piccolo" inconveniente che la Factory mi crea oggetti *B* e non *C*.
A questo punto, come ho espresso sopra, la soluzione migliore mi sembra 
questa:
public class C extends B
{
        public C( B b )
        {
                //...
        }
}
facendo funzionare C (come tu mi hai fatto notare) come Adapter. A questo 
punto le chamate alla factory diventerebbero:
C c = new C( A.createB() );
e utilizzando all'interno del progetto solo oggetti di tipo C il problema 
sarebbe risolto. Che ne dici?
Thanks


 
L'intento di Adapter in realta' e' quello di adattare l'interfaccia, 
mentre qui vuoi proprio aggiungere direttamente funzionalita' 
sull'oggetto. Puoi vederlo come un decorator degenere (ossia ad un solo 
livello) o come un proxy (Decorating Proxy), ma non e' molto importante 
trovare il nome giusto
Se ti va bene usare dei C al posto dei B (ossia non e' importante 
l'identita' di tipo) mi sembra tutto a posto cosi'.
Forse dovresti anche direttamente farti costruire i C da una factory 
"parallela" ad A per evitare quel new.
Non mi sembra pero' che in questo modo tu riesca a far rispettare a C 
l'interfaccia di B, ossia la estenderai violando il principio LSP, 
perdendo un bel po' di OO: ma forse e' inevitabile per la natura del tuo 
problema, ed in fondo lo fanno anche alcune delle librerie io di java...
In parole povere non potrai mai fare B b = new C(A.createB()) poiche' B 
non ha il metodo log() - o quello che ti interessa aggiungere
ciao
uL

 non ha il metodo log() - o quello che ti interessa aggiungere
Credo di aver capito bene i tuoi argomenti (merito tuo non mio ovviamente 
:)). Visti i "vizi di parentela" rintracciati credo che alla fine opterò 
per una banale relazione di contenimento tra C e B (slegando completamente 
l'interfaccia di C da B) magari trovando un nome adatto al caso per C :). 
Non sarà il massimo ma certamente è molto più faticoso "far credere" al 
sistema che gli oggetti C siano di tipo B, come hai avuto modo di farmi 
capire.
PS: bellissimo thread (almeno per me :)). 
Grazie 1000


 capire.
Beh, gli oggetti C sono di tipo B, solo che B non supporta l'operazione 
che hai aggiunto.
Vedi tu come e' meglio, prova pero' a pensare come se fossi il client di 
queste classi, come vorresti che funzionassero, e dopo cerca un modo per 
farlo: forse si puo' fare senza grossi stravolgimenti.
Maagri comincia con l'associazione semplice e poi vede come e se la cosa 
si evolve.
ciao e buon lavoro
uL

 ciao e buon lavoro
anche a te :)


 perso qualcosa :/ 
Si, adapter ha due varianti, class adapter e object adapter, a seconda 
che sia per ereditarieta' o per contenimento.
E' l'intento che e' diverso dal proxy o dal decorator: l'adapter lo fai 
per adattare delle interfacce che non sono compatibili, ma non per 
aggiungere funzionalita'. Per essere precisi, l'importante e' ricordare 
che molti pattern hanno lo stesso diagramma delle classi, ma intenti 
diversi: ed e' quello che li distingue
A seconda infatti di cosa vuoi risolvere, puo' essere un proxy, un 
adapter o un decorator o piu' probabilmente un mix di questi: i pattern 
non esistono mai "da soli".
Non ti preoccupare assolutamente del nome, fallo e basta!
ciao
uL

Scusa se mi intrometto ma il discorso mi interessa particolarmente.
JAXB č stato rilasciato? Se sě come faccio a scaricarlo? Su SUN non
trovo alcun riferimento in merito.
Grazie 
body

 James Cooper... Bruno, ne sai qualcosa? :)
Eh? C'è qualche problema con questo autore? E' lo Shildt dei pattern (per 
chi frequenta it.comp.lang.c++) :)? Butto via il libro? :)


 trovo alcun riferimento in merito.
Fa parte del Java Web Services Developer Pack 1.2. Per raggiungerlo basta 
cliccare su web services dalla hp di 
java.sun.com
. Il link diretto č 
questo:
http://java.sun.com/webservices/webservicespack.html
ciao :)


 
http://java.sun.com/webservices/webservicespack.html
Dagli esempi per caricare un JAXBContenxt
JAXBContext jc = JAXBContext.newInstance( "primer.do" );
Ma primer.do dove lo pesco?
Ciao 
body