bloggers bloggers

Marco Napolitano
Messaggi: 79
Stelle: 0
Data: 17/02/22
Jader Jed Francia
Messaggi: 63
Stelle: 0
Data: 18/02/21
Paolo Gambetti
Messaggi: 2
Stelle: 0
Data: 11/11/19
Katia Pazzi
Messaggi: 1
Stelle: 0
Data: 27/06/19
Ezio Lombardi
Messaggi: 11
Stelle: 0
Data: 10/04/18
Chiara Mambretti
Messaggi: 25
Stelle: 0
Data: 27/02/17
Serena Traversi
Messaggi: 3
Stelle: 0
Data: 21/07/16
Francesco Falanga
Messaggi: 8
Stelle: 0
Data: 14/06/16
Antonio Musarra
Messaggi: 2
Stelle: 0
Data: 18/11/13
Simone Celli Marchi
Messaggi: 6
Stelle: 0
Data: 09/07/13
Indietro

Estendere Component in package internal

Nella vostra esperienza con Liferay vi potreste trovare ad aver bisogno di dover rimpiazzare o estendere @Component contenuti all'interno di package di Liferay internal. Quando i package sono "internal" non sono esportati pertanto anche dichiarando la dipendenza dal package nel file build.gradle del vostro modulo, questa, nella migliore delle ipotesi, non darà errori a tempo di compilazione ma produrrà un errore a runtime per dipendenza non risolta.

Vediamo come si può ovviare a questo problema basandoci sull'esempio di una implementazione che ho dovuto realizzare.

L'implementazione consisteva essenzialmente nel realizzare una ricerca customizzata a livello di condizioni di ricerca e visualizzazione dei risultati prodotti  appoggiandosi il più possibile alla ricerca nativa di Liferay. La versione di Liferay utilizzata è la 7.1.3.

La mia ricerca doveva essere effettuata solo per contenuti di tipo "KBArticle". In certe condizioni che non specificherò perchè non inerenti alla soluzione della problematica, quello che succedeva era che nell'operazione di costruzione delle query per ElasticSearch, venissero create condizioni basate su entità diverse dalla "KBArticle", ad esempio Wiki, JournalArticle etc, e perciò non di nostro interesse ai fini della produzione dei risultati custom corretti.

Avevo perciò la necessità di intervenire a livello del component:

@Component(immediate = true, service = PreFilterContributorHelper.class)

public class PreFilterContributorHelperImpl

implements PreFilterContributorHelper {
 
per limitare la creazione delle query di prefiltraggio alla sola entità "KBArticle".
 
La classe PerFilterContributorHelperImpl è però contenuta all'interno del package com.liferay.portal.search.internal.indexer nel jar "com.liferay.portal.search-5.0.26.jar"che come dice il nome è un package internal quindi non esportato.
 
Esiste uno stratagemma per esportare un package internal. Vediamo come fare:
ho creato un bundle Liferay Module Project Fragment che ho chiamato portal-search-filter.
 
Nel file bnd.bnd del modulo portal-search-filter ho esportato il package di mio interesse "com.liferay.portal.search.internal.indexer" in questo modo:
 
Bundle-Name: portal-search-filter
Bundle-SymbolicName: portal.search.filter
Bundle-Version: 1.0.0
Fragment-Host: com.liferay.portal.search;bundle-version="5.0.26"

Export-Package: com.liferay.portal.search.internal.indexer
Attenzione che nel frammento non ho selezionato di fare l' "override" di nessun file .jsp in quanto l'unico e solo scopo del frammento è quello di esportare un package di Liferay di tipo internal. 
 
A questo punto ho potuto creare un mio @Component custom che estende la classe PreFilterContributorHelperImpl con un service.ranking più elevato del service di default in modo da mandarlo in esecuzione. Così:
 
@Component(immediate = true, service = PreFilterContributorHelper.class, property = {

"service.ranking:Integer=1000"

})

public class PreFilterContributorHelperCustom

extends PreFilterContributorHelperImpl

implements PreFilterContributorHelper 
 
Nella classe PreFilterContributorHelperCustom ho potuto fare i seguenti import:
 
import com.liferay.portal.search.internal.indexer.PreFilterContributorHelper;
import com.liferay.portal.search.internal.indexer.PreFilterContributorHelperImpl;
 
package che sono esportarti dal Fragment portal-search-filter che ho creato allo scopo in precedenza.
 
A questo punto ho raggiunto il mio scopo, posso tranquillamente fare l'override dei metodi di PreFilterContributorHelperImpl e variare il comportamento della mia classe perchè crei query di filtraggio su ElasticSearch sulla sola entity KBArticle.
 
 
Commenti
Nessun commento. Vuoi essere il primo.