Non mi interessa se voi usate la SDK remote o se la SDK remote sia migliore o peggiore di axis o altri strumenti per webservices. Di seguito ci sono le istruzioni per autenticarsi in alfresco tramite webservices con uno strumento “generico”, nel mio caso AXIS
Per connettersi ai WS di alfresco è necessario usare WSS4j per passare credenziali utente e ticket. E' comunque necessario prestare attenzione ad alcune cose
Il file per il deploy del client axis deve essere simile al seguente
<deployment xmlns='http://xml.apache.org/axis/wsdd/' xmlns:java='http://xml.apache.org/axis/wsdd/providers/java'> <transport name='http' pivot='java:org.apache.axis.transport.http.HTTPSender'/> <globalConfiguration > <requestFlow > <handler type='java:org.apache.ws.axis.security.WSDoAllSender' > <parameter name='action' value='UsernameToken Timestamp'/> <parameter name='user' value='ticket'/> <parameter name='passwordCallbackClass' value='mains.AlfresoPWCallback'/> <parameter name='passwordType' value='PasswordText'/> </handler> </requestFlow > </globalConfiguration> </deployment>
attenzione al Timestamp che va passato per forza! (la doc di alfresco non lo maneziona)
l'handler per gestire i ticket e le credenziali deve essere tipo il seguente
public class AlfresoPWCallback implements CallbackHandler { public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { for (int i = 0; i < callbacks.length; i++) { if (callbacks[i] instanceof WSPasswordCallback) { WSPasswordCallback pc = (WSPasswordCallback)callbacks[i]; String currentTicket = __TROVA_UN_MODO_DI_PASSARE_UNA_PASSWORD_TIPO_CON_UN_THREADLOCAL_O_CHE_TI_PARE; pc.setPassword(currentTicket); } else { throw new UnsupportedCallbackException(callbacks[i], "Unrecognized Callback"); } } } }
Schema
String alfresco_base = "http://alfresco.mio.dominio/alfresco"; EngineConfiguration econfig = new FileProvider("client_deploy.wsdd"); AuthenticationServiceLocator authenticationServiceLocator = new AuthenticationServiceLocator(); AuthenticationServiceSoapPort auth = authenticationServiceLocator. getAuthenticationService(new URL(alfresco_base + "/api/AuthenticationService")); String password = "password"; AuthenticationResult sess = auth.startSession("pippo", password); String ticket = sess.getTicket(); METTI_IL_TICKET_DA_QUALCHE_PARTE UN_THREADLOCAL_VA_BENE ... chiama WS AdministrationServiceLocator asl = new AdministrationServiceLocator(econfig); AdministrationServiceSoapPort adminService = asl.getAdministrationService(new URL ( alfresco_base + "/api/AdministrationService")); UserDetails u = adminService.getUser("pippo"); System.out.println(u.getUserName());; .. fine chiama WS auth.endSession(ticket);
Se durante una chiamata al webservice viene generato un messaggio di errore tipo <note important>… argument qname is mandatory …</note> allora è bene controllare i parametri passati ai metodi degli stub. L'argomento property deve essere non vuoto (basta anche una stringa con uno spazio)
<deployment xmlns='http://xml.apache.org/axis/wsdd/' xmlns:java='http://xml.apache.org/axis/wsdd/providers/java'> <transport name='http' pivot='java:org.apache.axis.transport.http.HTTPSender'/> <globalConfiguration > <requestFlow > <handler type='java:org.apache.ws.axis.security.WSDoAllSender' > <parameter name='action' value='UsernameToken Timestamp'/> <parameter name='user' value='ticket'/> <parameter name='passwordCallbackClass' value='mains.AlfresoPWCallback'/> <parameter name='passwordType' value='PasswordText'/> </handler> </requestFlow > </globalConfiguration> </deployment>
package mains; import java.io.IOException; import javax.security.auth.callback.Callback; import javax.security.auth.callback.CallbackHandler; import javax.security.auth.callback.UnsupportedCallbackException; import mains.Staticone; import org.apache.ws.security.WSPasswordCallback; public class AlfresoPWCallback implements CallbackHandler { /** * The implementation of the password callback used by the WS Security * * @see javax.security.auth.callback.CallbackHandler#handle(javax.security.auth.callback.Callback[]) */ public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { for (int i = 0; i < callbacks.length; i++) { if (callbacks[i] instanceof WSPasswordCallback) { WSPasswordCallback pc = (WSPasswordCallback)callbacks[i]; String currentTicket = Staticone.getPass(); // Set the password to be the current users ticket pc.setPassword(currentTicket); } else { throw new UnsupportedCallbackException(callbacks[i], "Unrecognized Callback"); } } } }
package mains; public class Staticone { private static ThreadLocal<String> pass = new ThreadLocal<String>(); public static void setPass(String p) { pass.set(p); } public static String getPass() { return pass.get(); } public static void remove() { pass.remove(); } }
package mains; import java.net.MalformedURLException; import java.net.URL; import javax.xml.rpc.ServiceException; import org.alfresco.www.ws.model.content._1_0.ContentFormat; import org.alfresco.www.ws.model.content._1_0.NamedValue; import org.alfresco.www.ws.model.content._1_0.Predicate; import org.alfresco.www.ws.model.content._1_0.Reference; import org.alfresco.www.ws.model.content._1_0.ResultSet; import org.alfresco.www.ws.model.content._1_0.ResultSetRow; import org.alfresco.www.ws.model.content._1_0.ResultSetRowNode; import org.alfresco.www.ws.model.content._1_0.Store; import org.alfresco.www.ws.service.administration._1_0.AdministrationServiceLocator; import org.alfresco.www.ws.service.administration._1_0.AdministrationServiceSoapPort; import org.alfresco.www.ws.service.administration._1_0.UserDetails; import org.alfresco.www.ws.service.authentication._1_0.AuthenticationResult; import org.alfresco.www.ws.service.authentication._1_0.AuthenticationServiceLocator; import org.alfresco.www.ws.service.authentication._1_0.AuthenticationServiceSoapPort; import org.alfresco.www.ws.service.content._1_0.Content; import org.alfresco.www.ws.service.content._1_0.ContentServiceLocator; import org.alfresco.www.ws.service.content._1_0.ContentServiceSoapPort; import org.alfresco.www.ws.service.repository._1_0.QueryResult; import org.alfresco.www.ws.service.repository._1_0.RepositoryServiceLocator; import org.alfresco.www.ws.service.repository._1_0.RepositoryServiceSoapPort; import org.apache.axis.EngineConfiguration; import org.apache.axis.configuration.FileProvider; import org.oasis_open.docs.ns.cmis.ws._200908.NavigationServiceLocator; import org.oasis_open.docs.ns.cmis.ws._200908.NavigationServicePort; import org.oasis_open.docs.ns.cmis.ws._200908.ObjectServiceLocator; import org.oasis_open.docs.ns.cmis.ws._200908.ObjectServicePort; public class MainAuth { /** * @param args * @throws ServiceException * @throws MalformedURLException */ public static void main(String[] args) throws Exception { String alfresco_base = "http://mioserveralfresco/alfresco"; EngineConfiguration econfig = new FileProvider("client_deploy.wsdd"); AuthenticationServiceLocator authenticationServiceLocator = new AuthenticationServiceLocator(); AuthenticationServiceSoapPort auth = authenticationServiceLocator.getAuthenticationService(new URL(alfresco_base + "/api/AuthenticationService")); String password = "lamiapassword_che_ti_frega"; AuthenticationResult sess = auth.startSession("pippo", password); String ticket = sess.getTicket(); Staticone.setPass(ticket); AdministrationServiceLocator asl = new AdministrationServiceLocator(econfig); RepositoryServiceLocator repsl = new RepositoryServiceLocator(econfig); ContentServiceLocator contentSl = new ContentServiceLocator(econfig); ObjectServiceLocator osl = new ObjectServiceLocator(econfig); NavigationServiceLocator nsl = new NavigationServiceLocator(econfig); AdministrationServiceSoapPort adminService = asl.getAdministrationService(new URL ( alfresco_base + "/api/AdministrationService")); RepositoryServiceSoapPort repoService = repsl.getRepositoryService(new URL ( alfresco_base + "/api/RepositoryService")); ContentServiceSoapPort contentService = contentSl.getContentService(new URL ( alfresco_base + "/api/ContentService") ); ObjectServicePort objectService = osl.getObjectServicePort(new URL(alfresco_base + "/cmis/ObjectService")); NavigationServicePort navSerivce = nsl.getNavigationServicePort(new URL(alfresco_base + "/cmis/NavigationService")); UserDetails u = adminService.getUser("pippo"); System.out.println(u.getUserName());; System.out.println( u.toString()); Store[] stores = repoService.getStores(); for (Store s : stores) { System.out.println("STORE " + s.getScheme() + " " + s.getAddress() ); Predicate p = new Predicate(); p.setStore(s); Content[] contenuti = contentService.read(p, " "); for (Content contenuto : contenuti) { System.out.println(">> url " + contenuto.getUrl()); ContentFormat formato = contenuto.getFormat(); if (formato != null) { System.out.println(">>> " + formato.getMimetype()); System.out.println(">>> " + formato.getEncoding()); } Reference n = contenuto.getNode(); if (n != null) { System.out.println(">>> uuid " + n.getUuid()); System.out.println(">>> path " + n.getPath()); } QueryResult qc = repoService.queryChildren(n); if (qc != null){ ResultSet qrs = qc.getResultSet(); if (qrs.getTotalRowCount() > 0 ) { ResultSetRow[] qrows = qrs.getRows(); for (ResultSetRow qrow : qrows) { NamedValue[] qrcols = qrow.getColumns(); ResultSetRowNode qnode = qrow.getNode(); for (String sas : qnode.getAspects() ) { System.out.println(">>> Aspect " + sas); } for (NamedValue qnv : qrcols) { System.out.println(">>> > nome colonna" + qnv.getName()); if (qnv.getIsMultiValue()) { for (String qnvs : qnv.getValues()) { System.out.println(">>> > " + qnvs); } } else { System.out.println(">>> > " + qnv.getValue()); } } } } } } } auth.endSession(ticket); } }