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

Creazione Albero di categorie in Liferay

Supponiamo di dover creare manualmente un albero di categorizzazione in liferay non utilizzando le classi di utilità del framework ma di doverli inserire a “manualmente” nel database.
Questa necessità potrebbe verificarsi ad esempio nella migrazione dati da una versione di liferay ad un'altra senza dover mettere in piedi il meccanismo dei web services ma utilizzando semplicemente degli statements JDBC.
Prima di addentrarci nel codice è necessario spendere due parole sulla struttura delle tabelle delle categorie in liferay 606.
Le tabelle coinvolte nella categorizzazione sono principalmente due :
-assetvocabulary: Dove vengono inseriti tutti i vocabolari creati
-assetcategory: Dove vengono inserite le categorie di tutti i vocabolari con la relazione al genitore.
Altra cosa molto importante è che liferay utilizza una generazione “propria” degli id delle entità del database.
Facendo un’inserimento manuale è necessario quindi gestire anche la numerazione facendo in modo che liferay riesca ad adattarsi alla nostra modifica.
Gestione degli id di insert
Prima di qualsiasi operazione di insert sulle tabelle citate precedentemente è necessario conoscere l’ultimo id che è stato assegnato in modo da inserire i successivi progressivamente.
La tabella deputata alla gestione degli id in liferay è la tabella Counter, ed in questo caso gli id delle tabelle sono gestiti proprio dall’entity che ha il campo “name” uguale a “com.liferay.counter.model.Counter”.
Quindi per recuperare il primo id utile da utilizzare andremo a scrivere un frammento di codice del genere:
String sqlSelectCategoryStartingId = "select currentId from counter where name = 'com.liferay.counter.model.Counter'";
String updateCategoryCounterId = "update counter set currentId = ? where name='com.liferay.counter.model.Counter'";
PreparedStatement selectCategoryStartingIdStat = lr6Database.prepareStatement(sqlSelectCategoryStartingId);
PreparedStatement updateCounterId = lr6Database.prepareStatement(updateCategoryCounterId);
ResultSet categoryStartingIdRes = selectCategoryStartingIdStat.executeQuery();
long assetEntryId = 1;
if(categoryStartingIdRes.next())
assetEntryId = categoryStartingIdRes.getLong(1);
..inserimento utilizzando come id della query assetEntryId ed incrementandolo per ogni insert…
updateCounterId.setLong(1, assetEntryId);
Questo frammento di codice andrà utilizzato sempre nel momento in cui si vanno a fare operazioni di insert manuali su tabelle di liferay o comunque su tabelle per le quali la numerazione è gestita dalla tabella counter.
ATTENZIONE: Non tutti gli id sono gestiti tramite l’entity con attributo “name” pari a “com.liferay.counter.model.counter”, ma bisogna capire (sbirciando sulle tabelle e facendo delle prove inserendo entità da liferay) qual è il “name” di riferimento per la entity per la quale si vuole conoscere il primo id disponibile.
Creazione Vocabolari e Categorie
Per prima cosa si deve creare un vocabolario nel quale le categorie andranno inserite,questo è abbastanza semplice ,basta creare una query di insert:
insert into assetvocabulary (uuid_,vocabularyId,companyId,groupId,userId,username,createDate,modifiedDate,name,title) VALUES (?,?,?,?,?,?,Now(),Now(),?,?)
fatto questo ,per l’inserimento di una categoria all’interno di un vocabolario basta eseguire la query di insert sottostante:
insert into assetcategory (uuid_,categoryId,companyId,groupId,userId,username,createDate,modifiedDate,parentCategoryId,leftCategoryId,rightCategoryId,name,title,vocabularyId) VALUES (?,?,?,?,?,?,Now(),Now(),?,0,0,?,?,?)
ATTENZIONE: i campi ‘vocabularyId’ e ‘categoryId’ devono essere valorizzati con progressivi che partono dal contenuto della tabella counter, come detto nel paragrafo precedente.
Come si può notare la procedura è molto semplice.

Per la generazione di un valore valido per il campo‘uuid’ può essere utilizzata la class java UUIDinvocando il metodo UUID.randomUUID().

Per i valori di ‘leftcategoryid’ e ‘righcategoryid’ inizialmente si popolano con il valore 0.

Ultima accortezza è che per poter permettere effettivamente liferay di ricercare le entry associate alle categories bisogna numerare tutti i nodi dell’albero (per ogni group id) tramite un algoritmo ricorsivo che va a ricalcolare i valori di ‘leftcategoryid’ e ‘rightcategoryid’. Esiste il metodo “rebuild tree” in liferay che fa una cosa simile, ma nell’eventualità in cui il codice viene eseguito dall’esterno dell’ambiente, il codice di seguito potrebbe tornarvi utile:
publicvoid rebuildTree(Connection lr6Database) throws SQLException{
long parentCategoryId = -1;
String getAncestorsSql = "select categoryId from assetcategory where groupId = ? and parentCategoryId = 0";
PreparedStatement ancestorsSql = lr6Database.prepareStatement(getAncestorsSql);
Iterator<Long> it = this.root.getGroupIds().iterator();
while(it.hasNext()){
long groupId = it.next();
long leftCategoryId = 1;
ancestorsSql.clearParameters();
ancestorsSql.setLong(1, groupId);
ResultSet catRes = ancestorsSql.executeQuery();
while(catRes.next()){
parentCategoryId = catRes.getLong(1);
leftCategoryId = rebuildTree(leftCategoryId,groupId,parentCategoryId,lr6Database);
}
}
}
Questo metodo dovrebbe essere invocato al termine del popolamento delle tabelle assetvocabulary ed assetcategory.
A questo punto non ci resta solo che installare la portlet di categorizzazione.
Inserimento di entry nelle categorie di liferay
Una volta costruito l’albero delle categorie lo step successivo è quello di inserire le relazioni tra le entità della nostra applicazione in liferay e le categorie presenti nell’albero di categorizzazione.
Per fare questo è necessario fare differenti operazioni,che riassumiamo di seguito:
-Inserire un riferimento alla nostra entità nella tabella assetentry
-Inserire una relazione nella tabella assetentries_assetcategories che rappresenta l’associazione effettiva tra l’entity e la categoria stessa.
Praticamente sono due query di insert:
insert into assetentry (entryId,groupId,companyId,userId,username,createDate,modifiedDate,classPk,classnameid,visible) VALUES(?,?,?,0,'',Now(),Now(),?,?,true);
Unica accortezza qui è di inserire il ‘classnameid’ ed il ‘classpk’ ovvero l’id della classe che per la quale stiamo inserendo la entry,recuperabile dalla tabella ‘classname_’ e la chiave primaria della stessa entità.
"insert into assetentries_assetcategories (entryId,categoryId) VALUES(?,?)";
Anche qui nella prima query il campo “entryId” è gestito sempre prelevando dalla tabella counter il primo id disponibile,incrementandolo e alla fine aggiornando il valore della tabella counter.
Precedente
Commenti
Nessun commento. Vuoi essere il primo.