Ciao a tutti e bentrovati sul nostro blog!
Oggi pomeriggio, mentre m'annoiavo, ho deciso di risolvere uno dei puzzle più grandi che m'attanagliano da sempre su Liferay: capire dove finiscono (o dove hanno infilato.. :)) le JSP che sono richiamate dalle taglib di portale!
[NdJ: lo so, non è una di quell cose da non doverci dormir di notte, però sapete che non ho una vita semplice, quindi abbiate pietà di me! ;D]
Prima di svelarvi il segreto, però, vorrei farvi comprendere il caso d'uso, così che, se dovesse capitare anche a voi, possiate arrivare celermente ad una soluzione!
Taglib core di prodotto e JSP che ne implementano la view
Una volta mi sono trovato a dover mettere mano all'output di una taglib e, di conseguenza, mi sono fiondato nella classe java ce ne implementava la logica e sono andato a prendermi il nome della pagina JSP corrispondente per modificarla.
Ora non ricordo più quale fosse quella volta la taglib, però, per semplicità, prendiamo come esempio la com.liferay.taglib.ui.IconDeleteTag.
Se aprite questa classe e andate a cercare la JSP, troverete questo statement:
private static final String _PAGE = "/html/taglib/ui/icon_delete/page.jsp";
Allora, come spesso faccio quando parto per la tangente ;), sono partito a cercare sul FS il file incriminato ma...
jedd@ne:~/liferay-ce-portal-src-7.1.1-ga2$ find . -type f -name page.jsp | grep -i icon_delete
jedd@ne:~/liferay-ce-portal-src-7.1.1-ga2$
Niente! Della mia JSP non c'è traccia! :(
Allora, sconfortato e sempre pronto a reinventar la ruota come se non ci fosse un domani, sarò sicuramente partito a creare la mia versione di taglib per sistemare il problema che avevo (non ricordo, ma conoscendo i tempi che ho a disposizione io quando faccio questo genere di cose, può essere che non mi sbagli poi di tantissimo.. :)).
E invece, come sempre, bastava leggere! :)
Se io avessi investito più di 7 secondi per analizzare il codice della taglib, forse (dico forse perché non è detto.. :D) mi sarei accorto che all'inizio del metodo getPage()
c'è questa implementazione:
if (FileAvailabilityUtil.isAvailable(servletContext, _PAGE)) {
return _PAGE;
}
la quale mi avrebbe fornito un indizio molto interessante, ovvero che il concetto "IF IS AVAILABLE" può significare, per logica ;), che il file potrebbe anche non esserci.. Ah, ecco perché non lo trovavo.. :D
Allora da dove viene preso il codice che genera l'output della taglib?
Chiaramente il codice è presente nel resto dell'implementazione del metodo getPage(); ora però c'è da capire il perché e, soprattutto, come dovrei fare io se volessi modificarne l'output.
Perché l'output della taglib è dentro al metodo getPage()?
Chiaramente, al solito, i nostri amici hanno ottimizzato l'implementazione per far si che l'overhead di rendition delle singole taglib -che, come avrete notato anche voi in LR sono usate parecchio.. :D- sia super ridotto! A tal fine, quindi, hanno semplicemente eliminato le singole page.jsp
e portato il codice che esse contenevano all'interno del metodo getPage()
.
Come faccio ad affermare che il motivo è questo? :)
Beh, continuate a leggere.. :D
Ok ma.. Come faccio a modificare l'output di una taglib di LR?
Questa cosa l'ho scoperta, invece, navigando sul FS e cianfrusagliando tra i sorgenti del portale..
Ho trovato dentro le taglib dei file chiamati page.jsp.readme
che, stranamente :D, ho aperto per leggerli..
Guardate che cosa ci ho trovato dentro:
The content of this JSP file was inlined to improve performance. To use your own
content instead, remove the ".readme" extension and add your content to this
file.
Eggià: avevo proprio ragione!
I file sono scomparsi perché hanno integrato la logica nel getPage()
e se volessi modificarne l'output mi basterebbe seguire il suggerimento!
Molto bene! A questo punto, però, ripenso al comando che ho dato prima.. E lo rilancio aggiustandolo:
jedd@ne:~/liferay-ce-portal-src-7.1.1-ga2$ find . -type f -name page.jsp.readme | grep -i icon_delete
jedd@ne:~/liferay-ce-portal-src-7.1.1-ga2$
Ma come?? Non c'è il mio file!!
Quindi?? Come faccio a modificare il mio output?
Beh, questa volta il gioco è semplice: siccome il mio getPage()
s'aspetta che la JSP possa esserci, dovrò solo fare in modo di fargliela trovare nel punto giusto del FS!
E per farlo, mi basterà fare un fragment host per fargliela trovare! :)
Anche per oggi è tutto; spero d'aver chiarito anche a tutti voi uno dei misteri più grandi di Liferay che da anni m'attanaglia la vita..
... E concludo dicendo che la seniority, se proprio vogliamo, sta anche nel saper leggere il codice! Cosa che, evidentemente, come dice anche l'Ing. Napolitano :D, io ancora non ho imparato a fare!
Passate un buon fine settimana e divertitevi (magari non con i sorgenti di LR, se potete! :D), voi che potete!
Alla prossima!