Sugar CRM e Apache Axis
Gli articoli più letti di beanizer.org sono senza dubbio quelli riguardanti l'integrazione di SugarCRM . Fino ad ora i nostri articoli si sono focalizzati sull'integrazione con PHP, ma a seguito delle richieste di alcuni lettori, a partire da questo articolo ci occuperemo anche di integrazione tra SugarCRM e Java. Malgrado Java includa da tempo un solido supporto per SOAP, ci è stato chiesto di scriverne nello specifico riguardo Sugar. In questo primo articolo vedremo come utilizzare Axis e il suo strumento WSDL2Java per costruire il fondamento di integrazione tra SugarCRM e Java e come effettuare un'autenticazione al sistema, ottenere la lista di moduli installati ed interrogare SugarCRM attraverso SOAP. Apache Axis è un'implementazione del protocollo SOAP ("Simple Object Access Protocol") definito da W3C. Esiste per Java e C++, noi naturalmente faremo uso del primo. Ciò a cui siamo particolarmente interessati è la classe WSDL2Java (inclusa nella distribuzione) che, dato un file wsdl, è in grado di generare automaticamente le corrispondenti classi per metodi e tipi di dati. Da questo momento darò per scontate le seguenti premesse sugli strumenti da utilizzare: - JDK5 (o superiore)
- Sugar CRM 5
- Axis 1.4 (versione per Java)
Dopo aver scaricato e decompresso la distribuzione di Axis che ci interessa, da riga di comando portiamoci nella directory di axis. Vedrete all'interno una directory "lib", contenente tutti i file jar che ci servono. A questo punto lanceremo la classe "WSDL2Java" con una referenza ad un file wsdl di sugar valido. Supponendo che il nostro Sugar si trovi a "http://localhost/sugarcrm", da riga di comando (su Linux) scriveremo qualcosa del tipo:
java -cp lib/axis.jar:lib/axis-ant.jar:lib/commons-discovery-0.2.jar: lib/commons-logging-1.0.4.jar:lib/jaxrpc.jar: lib/log4j-1.2.8.jar:lib/saaj.jar:lib/wsdl4j-1.5.1.jar org.apache.axis.wsdl.WSDL2Java -o . -d Session -p org.beanizer.sugarcrm http://localhost/sugarcrm/soap.php?wsdl L'opzione "-o" identifica la directory di destinazione delle classi generate, "-d" specifica la implementazione server (in questo caso "Session" significa che verrà creata una nuova istanza della classe di implementazione per ogni sessione) e "-p" definisce il "package" di destinazione da utilizzare. Se tutto va come previsto, avremo nella directory corrente un nuovo package "org.beanizer.sugarcrm", contenente una serie di classi che rappresentano la nostra interfaccia SOAP verso SugarCRM. Nei nostri progetti dovremo fare in modo che il nuovo package e i file jar presenti nella directory "lib" siano inclusi nel "classpath".
Primi passi di integrazione Java/Sugar CRM Nelle nostre classi non dimentichiamo di importare il nuovo "package":
import java.security.MessageDigest; import org.beanizer.sugarcrm.*;
Diamo un'occhiata all'utilizzo delle classi generate. Per prima cosa dovremo istanziare una classe "SugarsoapLocator", che ci permetterà di aprire un oggetto "port" verso Sugar CRM. Sugarsoap service=new SugarsoapLocator(); SugarsoapPortType port=service.getsugarsoapPort (new java.net.URL("http://localhost/sugarcrm/soap.php"));
Ci sono alcuni metodi che non richiedono l'autenticazione, per cui a questo punto possiamo già chiamarli: System.out.println(port.get_server_time()); System.out.println(port.get_server_version());
Credo che il loro utilizzo sia piuttosto ovvio. Ma la maggior parte dei metodi necessitano di preventiva autenticazione. Per fare ciò abbiamo bisogno di un utente/password validi. Da notare che la password deve essre passata in codice MD5 e in formato esadecimale. Ci serviremo della classe "MessageDigest" inclusa in java.security, e di un metodo ad hoc (vedere più sotto) "getHexString" per convertire il risultante array di byte in stringa esadecimale. Se l'autenticazione ha successo riceveremo un id di sessione, che ci servirà per le seguenti chiamate a metodi, altrimenti l'id di sessione restituito sarà "-1" ed otterremo un errore. Ecco il codice:
User_auth userAuth=new User_auth(); userAuth.setUser_name("myuser"); MessageDigest md =MessageDigest.getInstance("MD5"); String password=getHexString(md.digest("mypassword".getBytes())); userAuth.setPassword(password); userAuth.setVersion("0.1"); Set_entry_result loginRes=port.login(userAuth, "myAppName"); System.out.println("Error=" + loginRes.getError().getNumber()); String sessionID = loginRes.getId(); System.out.println("Session ID: " + sessionID); Ottenuto un id di sessione valido possiamo interagire con Sugar CRM. Vediamo come interrogare Sugar CRM per ottenere alcuni "Account" (è il modulo di Sugar che gestisce i contatti aziendali). I parametri da passare al metodo "get_entry_list" dell'oggetto "port" sono:
- un id di sessione
- il nome di un modulo ("Accounts" in questo caso, ma il metodo è generico per cui per interrogare il modulo contatti sarà "Contacts" e così' via)
- una "query" ,vuota questa volta, ma può essere ad es. "name ='myname' " o qualsiasi altra cosa che utilizzi sintassi valida, campi esistenti e tipi di dato corretti (vedremo approfonditamente nel prossimo articolo)
- clausola "order by"
- "offset" (numerico) , da quale record iniziare
- un array di stringhe con i nomi dei campi da estrarre
- numero massimo di record da estrarre
- se i record cancellati debbano essere estratti (Sugar CRM non cancella fisicamente i record, semplicemente li marca come cancellati)
Get_entry_list_result entryList=port.get_entry_list(sessionID,"Accounts","", "",0, new String[]{"name","phone_office"}, 10, 0); System.out.println(entryList.getError().getDescription()); for(Entry_value entry : entryList.getEntry_list()){ Name_value[] nvl=entry.getName_value_list(); System.out.println( nvl[0].getValue() + " - " + nvl[1].getValue()); }
Interroghiamo semplicemente per ottenere una lista di record, e poi "cicliamo" per ottenere la coppia nome/valore per i campi selezionati (in questo caso solo "name" e "phone_office"). Ci sarebbe molto di più da dire su "get_entry_list", ma credo che per questa sessione ci sia abbastanza carne sul fuoco, per cui lascerò ulteriori spiegazioni per i prossimi articoli. L'ultima cosa rimasta è il metodo per convertire un array di byte in stringa esadecimale. Eccolo:
public String getHexString(byte[] b) throws Exception { StringBuffer hex = new StringBuffer(); for (int i=0;i<b.length;i++) { hex.append(Integer.toHexString(0xFF & b[i])); } return hex.toString(); }
Hasta la proxima. Articoli collegati
|