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

Usare i web services di Liferay per popolare utenti: un po' di codice! :)

Nel post precedente abbiamo visto come attivare i web service su Liferay 5.2.3.

Ora vediamo un po' di codice per popolare, da remoto, gli utenti.

Prima di tutto il classpath! :)

Per far funzionare l'esempio, dovete importare nel vostro progetto i seguenti jar:

  • axis.jar
  • commons-discovery.jar
  • commons-io.jar
  • commons-logging.jar
  • jaxrpc.jar
  • portal-client.jar
  • wsdl4j.jar

che sono tutti disponibili nella distribuzione di Liferay, dentro a

<liferay source dir>/lib/portal

Il jar che ho evidenziato, portal-client.jar, è il jar che contiene tutti i client dei web service già confezionati e pronti all'uso, quindi è fondamentale per il nostro esempio.

Una volta importate le lib nel nostro il progetto possiamo procedere all'importazione massiva degli utenti su Liferay.

Supponiamo che il cliente ci fornisca, in formato excel, un elenco di utenti così strutturato:

Cognome, Nome, Data di Nascita, Username, Password, Email

E la data di nascita, campo obbligatorio per Liferay, ce la fornisca nel formato

dd-mm-yy

Come sempre, esportiamo il nostro Excel in un più pratico CSV e, a questo punto abbiamo tutto ciò che ci serve per cominciare!

Questo il codice per creare su Liferay 5.2.3 gli utenti sulla macchina remota:

package it.dvel.liferay.ws.users;

import java.io.*;
import java.net.*;
import java.util.*;

import org.apache.commons.io.*;

import com.liferay.client.soap.portal.model.*;
import com.liferay.client.soap.portal.service.*;
import com.liferay.client.soap.portal.service.http.*;

public class CreateAllUsers {

public static void main(String[] args) throws Exception {
List<String> righe = FileUtils.readLines(new File("/tmp", "lista.csv"));
Iterator<String> iterator = righe.iterator();
while (iterator.hasNext()) {
String riga = iterator.next();

// Excel usa il ; come separatore di campi.. Maledetto! :)
String[] valori = riga.split(";");

// Ci premuriamo di verificare che ci siano tutti i nostri campi e

// la data contenga il carattere '-'

// Uso la notazione ad array perchè è più pratico per il nostro esempio:

// voi modellate correttamente gli oggetti, mi raccomando! :D
if (valori != null && valori.length == 5 && valori[2].indexOf("-") > 0) {
String cognome = valori[0];
String nome = valori[1];
String dataNascita = valori[2];
String username = valori[3];
String password = valori[4];

String email = valori[5];
createUser(nome, cognome, username, password, dataNascita, email);
}
}
}


public static void createUser(String nome, String cognome, String screenName, String password,

String dataNascita, String email) throws Exception {
// Dichiariamo quale dev'essere la company di riferimento

long companyId = 1;
String referenceSite = "http://test:test@www.miosito.it";

// Recupero i ruoli che voglio che ogni mio utente abbia assegnati
RoleServiceSoapServiceLocator roleLocator =

new RoleServiceSoapServiceLocator();
RoleServiceSoap roleService =

roleLocator.getPortal_RoleService(

new URL(referenceSite + "/tunnel-web/secure/axis/Portal_RoleService"));
RoleSoap aRole = roleService.getRole(companyId, "Ruolo Particolare");
RoleSoap anotherRole = roleService.getRole(companyId, "Altro Ruolo");

// A questo punto sono pronto per creare l'utente
UserServiceSoapServiceLocator locator =

new UserServiceSoapServiceLocator();
UserServiceSoap service =

locator.getPortal_UserService(

new URL(referenceSite + "/tunnel-web/secure/axis/Portal_UserService"));
boolean autoPassword = false;
String password1 = password;
String password2 = password;
boolean autoScreenName = false;
String emailAddress = email;
String openId = "";
String locale = "it_IT"; // OCCHIOalla notazione del locale!!
String firstName = nome;
String middleName = "";
String lastName = cognome;
int prefixId = 0;
int suffixId = prefixId;
boolean male = true;

// Prendo i campi della data e li setto correttamente
String[] fields = dataNascita.split("-");
int birthdayMonth = Integer.parseInt(fields[1]) -1;
int birthdayDay = Integer.parseInt(fields[0]);
int birthdayYear = Integer.parseInt(fields[2]) + 1900;
String jobTitle = "";
long[] groupIds = {};
long[] organizationIds = {};
long[] roleIds = {aRole.getRoleId(), anotherRole.getRoleId()};
long[] userGroupIds = {};
boolean sendEmail = false;
ServiceContext serviceContext = new ServiceContext();

// Creo l'utente sul Liferay remoto
service.addUser(companyId, autoPassword, password1, password2, autoScreenName,

screenName, emailAddress, openId, locale, firstName, middleName, lastName,

prefixId, suffixId, male, birthdayMonth, birthdayDay, birthdayYear, jobTitle,
groupIds, organizationIds, roleIds, userGroupIds, sendEmail, serviceContext);
System.out.println("Creato user -->" + screenName + "<--");
}
}

Se tutto va come deve, l'utente sarà creato sul Liferay remoto.

Ora non vi resta che prendere un utente a campione e verificare che tutto sia andato come previsto! :)

Precedente
Commenti
Aggiungi Commento
Andrea Fornelli
Ciao a tutti!
Sono nuovo di Liferay. Sto utilizzando la versione 6.1.1-ce-ga2 con jboss 7.1.1.
Agganciandomi al codice precedente di creazione di un utente attraverso l'invocazione di web service, vi chiedo come fare per inserire untenti in cui sono stati definiti degli attributi aggiuntivi, che ho letto si chiamano expando, sempre utilizzando web service? Non capisco proprio come fare, ammesso che si possa fare.
In attesa di una risposta, vi ringrazio
Inviato il 09/07/15 14.03.
Jader Jed Francia
Ciao Andrea!
Si: si può fare! Ti basterà esporre un metodo custom con una firma realizzata per accettare i parametri che ti occorrono e poi, quando andrai a creare un utente, per ogni property, ti basterà invocare:

user.getExpandoBridge().setAttribute(<String> name, <Serializable> value).

Spero d'esserti stato d'aiuto! emoticon
Fammi sapere se ti occorre altro! emoticon

Ciao, J.
Inviato il 09/07/15 14.03 in risposta a Andrea Fornelli.
Andrea Fornelli
Ciao Jed!
Grazie per la risposta. Mi stai dicendo quindi di creare un nuovo servizio che sarà identico al web service addUser ma che avrà in più, nella firma del metodo, gli attributi aggiuntivi (expando) e nel codice, l'istruzione user.getExpandoBridge().setAttribute(<String> name, <Serializable> value). Giusto? Ho pochissimo tempo per fare tutto ciò...
Grazie Jed
Inviato il 09/07/15 14.03 in risposta a Jader Jed Francia.
Jader Jed Francia
Ciao Andrea!
Si: quello che ti sto dicendo è che devi fare un tuo servizio con una firma come quella che ti serve e poi, internamente a questo WS, implementare il codice che ti dicevo.

Se cerchi qui sul blog tempo fa scrissi un articolo su come fare ad esporre un WS su Liferay: puoi partire da quello per la tua implementazione!

Fammi sapere se hai difficoltà! emoticon

Ciao, J.
Inviato il 09/07/15 14.03 in risposta a Andrea Fornelli.
Andrea Fornelli
Ciao Jed!
Sarebbe possibile scambiarsi i contatti Skype, avrei alcune domande da sottoporti in merito ad alcune esigenze di sviluppo. Te lo chiedo, essendomi approcciato da poco al mondo Liferay, Se ciò non fosse possibile, cercherò di farlo tramite blog. Ti sarei molto grato.
Inviato il 09/07/15 14.03 in risposta a Jader Jed Francia.
Jader Jed Francia
Ciao!
Non sono praticamente mai davanti a un pc con Skype; se vuoi puoi postare qui, ti risponderò senz'altro!
Altrimenti manda una mail attraverso la pagina contatti del sito di D'vel, così ho anche la tua mail!
Ciao!
Inviato il 09/07/15 14.03 in risposta a Andrea Fornelli.
Andrea Fornelli
Ciao Jed,
ti ringrazio per la tua disponibilità, cercherò di esporre le mie esigenze qui e se proprio non riuscirò, ti contatterò. Ho per un attimo messo in standby questa esigenza progettuale che vedrò nelle prossime ore, ora ho un errore su un hook che ho creato. Ho inserito la domanda all'interno dell'argomento di riferimento. Spero tu abbia una risposta. Grazie
Inviato il 09/07/15 14.03 in risposta a Jader Jed Francia.
Andrea Fornelli
Ciao Jed,
non riesco a chiamare un semplice web service perchè ho questo errore:
.....exception in thread "main" AxisFault ..... faultStringemoticon401) unauthorized....
La stringa di connessione è la seguente:
"http://test:andrea@localhost:8080/api/secure/axis/Portal_RoleService"
dove "test" lo recupero dall'indirizzo mail con cui faccio la login (test@liferay.com) e "andrea" è la passaword che utilizzo per la login.
Sto impazzendo! grazie
Inviato il 09/07/15 14.03 in risposta a Andrea Fornelli.
Andrea Fornelli
Ciao Jed,
il problema l'ho risolto, ho cambiato metodo di autenticazione, da indirizzo mail a username e sono riuscito a chiamare da una classe java il webservice. Ora vorrei sapere che differenza c'è tra groupIds e userGroupIds, entrambi da passare al metodo addUser. Ti faccio questa domanda perchè gli utenti che devo inserire non hanno i ruoli associati ma i gruppi a cui appartengono, dove ogni gruppo, già presente, ha dei ruoli associati. Mi sembra quindi di capire che devo passare piena la lista userGroupIds e vuota invece groupIds, confermi?
Inviato il 09/07/15 14.03 in risposta a Andrea Fornelli.
Jader Jed Francia
Ciao Andrea!
Attento: i nomi sono simili ma i concetti che rappresentano sono diversi! emoticon

Quando parli di groupIds parli degli id di quelli che sono i SITI; quando invece parli di userGroupIds parli degli id degli user groups, che sono dei raggruppamenti di utenti!

Ora, io non so come tu abbia fatto questi gruppi ma questa dritta dovrebbe farti capire quali dei due lasciare vuoto oppure riempire! emoticon

Comunque sia, se hai dubbi chiedi pure! emoticon
Ciao, J.
Inviato il 09/07/15 14.03 in risposta a Andrea Fornelli.
Andrea Fornelli
Grazie Jed!
ma cosa sono i SITI? Visto che io parlo di gruppi di utenti come raggruppamenti di utenti, credo che debba passare pieno lo userGroupIds e vuoto groupIds.
Nell'aggiungere in maniera massiva gli utenti mi sono accorto che gli utenti aggiunti sono tutti di default con stato uguale a 2 e quando faccio la ricerca mi vengono fuori solo se metto "qualsiasi stato": come mai? come faccio a attivarli?
Ho visto che c'è un web service, ma vuole l'ID e per recuperalo devo fare una query su DB che mi restituisca tutti gli utenti inseriti massivamente. Non la vedo come soluzione fattibile. Cosa mi consigli?
Inviato il 09/07/15 14.03 in risposta a Jader Jed Francia.
Jader Jed Francia
<joke mode="on">Ma come "cosa sono i SITI"?! emoticon</joke>
Liferay supporta la multi tenancy -che si ottiene con le istanze ma che nel db sono rappresentate dalla tabella company-. All'interno di una istanza ci sono i siti, ovvero dei portali "trasversali" che condividono le utenze ma non, fino alla 6.2, i contenuti -nel db, appunto, la tabella group_-.
In pratica è un modo per creare n siti diversi; qui:

http://www.liferay.com/it/documentation/liferay-portal/6.2/user-guide/-/ai/leveraging-liferays-multi-site-capabili-liferay-portal-6-2-user-guide-02-en

trovi un po' di riferimenti per comprenderli meglio! emoticon

Venendo al tuo caso, comunque, si, devi riempire solo gli userGroupIds e non il groupIds.. Tieni presente che, di solito, potrebbe non essere una cattiva idea mappare gli utenti anche sul site di riferimento; quindi almeno il groupId del sito principale io lo mapperei.. Ma ripeto: non è un vincolo: serve solo perché così poi i tuoi utenti, una volta loggati, sarebbero "site members" del sito e potresti differenziare su di essi i permessi!

Ciao, J.
Inviato il 09/07/15 14.03 in risposta a Andrea Fornelli.
Andrea Fornelli
Grazie Jed!
in merito all'altra domanda che ti scrivevo, sullo stato degli utenti aggiunti tramite il web service addUser esposto da Liferay, come faccio x vederli attivi?
Inviato il 09/07/15 14.03 in risposta a Jader Jed Francia.
Jader Jed Francia
Ah, scusa: mi era sfuggita! emoticon
Premesso che vado a memoria, il modo per farlo è passare come costante nel ServiceContext la property workflowAction con la costante WorkflowConstants.STATUS_APPROVED (o uno di quelli; ora non ricordo proprio! emoticon

Fammi sapere se questo risolve!

Ciao, J.
Inviato il 09/07/15 14.03 in risposta a Andrea Fornelli.
Andrea Fornelli
Jed, ho scritto esattamente quanto mi hai suggerito
serviceContext.setWorkflowAction(WorkflowConstants.STATUS_APPROVED);
e sembra che nel DB memorizzi sempre il valore 2 allo stato dell'utente che inserisco. La situazione strana è che Il valore della costante WorkflowConstants.STATUS_APPROVED è paria a 0 quando la verifico in debug (ci sono anche le costanti per settare inattivo, negato...). Come faccio?
Inviato il 09/07/15 14.03 in risposta a Jader Jed Francia.
Andrea Fornelli
Ciao Jed!
il motivo per cui non mi ritrovo lo stato attivo, anche se lo setto nel serviceContext, può dipendere dalla versione del portal-service.jar, jar nel quale c'è la classe WorkflowConstants? Attualmente del portal-service.jar, io ho agganciato la versione "...Bundle-Version: 6.1.2..." che ho recuperato dal MANIFEST.MF del jar. Io sto usando il liferay-portal-6.1.1-ce-ga2. Puoi aiutarmi?
Inviato il 09/07/15 14.03 in risposta a Andrea Fornelli.
Andrea Fornelli
Ciao Jed!
in fase di inserimento di un utente attraverso il web service addUser, come faccio a sollevare l'eccezione di utente con screenName già presente?
Mi spiego: da console di Eclipse vedo che è stata sollevata l'eccezione DuplicateUserScreenNameException
ma il metodo addUser fa lo throws solo della RemoteException, racchiudendo quindi diversi errori che si possono verificare sul metodo addUser.
Quindi se nella catch della Remote inserisco il messaggio "ScreenName già presente", potrei non essere preciso perchè magari l'errore è stato sollevato x altri problemi
e non per lo screenName già presente. come posso fare?
Inviato il 09/07/15 14.03 in risposta a Andrea Fornelli.
Antonio Musarra
Ciao Andrea,
hai risolto. Ho ripreso un vecchio progetto e non ho avuto problemi riguardo lo status dell'utente. Purtroppo sul problema utente esistente non viene restituito nessun messaggio, potresti eventualmente fare un lookup prima dell'utente.

Non appena ho qualche minuto posterò sul mio repository github il progetto completo dell'importer.

Bye,
Antonio.
Inviato il 09/07/15 14.03 in risposta a Andrea Fornelli.
Antonio Musarra
Ciao Andrea,
ho appena postato all'indirizzo https://github.com/amusarra/ImportUsersLiferayViaWS il progetto da cui potresti prendere spunto.

Bye,
Antonio.
Inviato il 09/07/15 14.03 in risposta a Antonio Musarra.
Antonio Musarra
Buongiorno Andrea,
se può interessarti ho pubblicato su questo blog un articolo che tratta proprio l'import degli utenti da excel con la possibilità di specificare site e ruoli oltre che custom fields. Gli utenti sono inseriti in stato attivo, io non ho specificato la constante ma direttamente il valore, questo perché sul portal client non c'è la WorkflowConstants.

Bye,
Antonio.
Inviato il 09/07/15 14.03 in risposta a Antonio Musarra.