Ejemplos de uso de servicos web

RECU-0041 (Recurso Ejemplo)

Descripción

Se van a mostrar ejemplos de uso de servicios web con JAVA, con Ruby, con PHP y con WSS/WSSE

Ejemplos

Ejemplos de uso de servicios web con Java.

Los siguientes ejemplos ilustran un conjunto de sencillos casos de uso de servicios web.

Iniciar sesion.

Antes de que se pueda establecer una comunicación con cualquier servicio web de Alfresco se debe autenticar el usuario actual para iniciar una sesion. Esto se puede hacer usando el metodo startSession que se encuentra en el Authentication Web Services.

Al metodo startSession se le pasa un usauario y un password y, si la autenticacion tiene exito, devolvera un ticket. Este ticket puede ser usado cuando se llamen otros metodos de los servicios web.

// Obtener la referencia de Authentication service
AuthenticationServiceSoapBindingStub authenticationService =
(AuthenticationServiceSoapBindingStub) new AuthenticationServiceLocator()
.getAuthenticationService();

// Iniciar la sesion
AuthenticationResult result = authenticationService
.startSession(userName, password);
String ticket = result.getTicket();

Una vez que todo el trabajo este hecho una llamada al metodo endSession invalidará el ticket.

// Finalizar la sesion
authenticationService.endSession(ticket);

Uso del Ticket

Las llamadas a todos los metodos de los servicios web deben tener la información de seguridad WS en la cabecera. Esto asegura el que solo los usuarios autenticados puedan acceder a la API de servicios web.

En los ejemplos la información de Seguridad de Servicios Web es proporcionado como un definción de despliegue XML:
<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'/>
<parameter name='user' value='ticket'/>
<parameter name='passwordCallbackClass'
value='org.alfresco.example.webservice.sample.WebServiceSample1'/>
<parameter name='passwordType' value='PasswordText'/>
</handler>
</requestFlow >
</globalConfiguration>
</deployment>

 

La passwordCallbackClass es entonces responsable de proporcionar el ticket cuando los metodos de los servicios web son llamados. Se debe implementa CallbackHandler el cual tiene un unico metodo handle.

/**
* Implementación de el password callback usado por el protocolo WS Security
*
* @ver 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];
// establecr el password como el ticket del usurario actual
pc.setPassword(currentTicket);
}
else
{
throw new UnsupportedCallbackException(callbacks[i],
"Unrecognized Callback");
}
}
}

Para que la información de despliegue y el callback handler sean usados cuando se realiza una llamada a un servicio web, se debe proporcionar a la clase cliente del servicio web esta información cuando es creada. El suguiente trozo de código muestra como crear una referencia la Repository Web Service teniendo esto en cuenta.

// Create the respository service, adding the WS security header information
EngineConfiguration config = new FileProvider(
new ByteArrayInputStream(
WebServiceSample1.WS_SECURITY_INFO.getBytes()
)
);
RepositoryServiceLocator repositoryServiceLocator =
new RepositoryServiceLocator(config);
RepositoryServiceSoapBindingStub repositoryService =
(RepositoryServiceSoapBindingStub)repositoryServiceLocator.getRepositoryService();

Ejemplo 1. Autenticacion y obtencion de Stores.

Este ejemplo muestra como autenticar un usuario, proporciona un ejemplo de CallbackHandler y muestra como obtener una lista de stores disponibles.

import org.alfresco.webservice.repository.RepositoryServiceSoapBindingStub;
import org.alfresco.webservice.types.Store;
import org.alfresco.webservice.util.AuthenticationUtils;
import org.alfresco.webservice.util.WebServiceFactory;
/**
* Ejemplo 1.
*
* Connectar al repositorio y obtener una lista de todos los stores disponibles en el repositorio.
*
* @author Roy Wetherall
*/
public class GetStores extends SamplesBase
{
/**
* Connect to the respository and print out the names of the available
*
* @param args
*/
public static void main(String[] args)
throws Exception
{
// Iniciar la sesion
AuthenticationUtils.startSession(USERNAME, PASSWORD);

try
{
// Optener respository service
RepositoryServiceSoapBindingStub repositoryService = WebServiceFactory.getRepositoryService();

// Obtener un array of stores disponibles en el repositorio
Store[] stores = repositoryService.getStores();
if (stores == null)
{
System.out.println("No hay stores disponibles en el repositorio.");
}
else
{
// Sacar los nombres de todos los stores disponibles en el repositorio
System.out.println("Los siguientes stores están disponibles en el repositorio:");
for (Store store : stores)
{
System.out.println(store.getScheme() + "://" + store.getAddress());
}
}
}
finally
{
// Finalizar la sesion
AuthenticationUtils.endSession();
}
}
}

Ejemplo 2. Busquedas simples

Este ejemplo muestra como ejecutar busquedas simples y navegar por los resultadosusando el Repository Web Service.

import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;
import org.alfresco.webservice.repository.QueryResult;
import org.alfresco.webservice.repository.RepositoryFault;
import org.alfresco.webservice.repository.RepositoryServiceSoapBindingStub;
import org.alfresco.webservice.types.NamedValue;
import org.alfresco.webservice.types.Query;
import org.alfresco.webservice.types.Reference;
import org.alfresco.webservice.types.ResultSet;
import org.alfresco.webservice.types.ResultSetRow;
import org.alfresco.webservice.util.AuthenticationUtils;
import org.alfresco.webservice.util.Constants;
import org.alfresco.webservice.util.WebServiceFactory;
/**
* Ejemplo 2
* <p>
* Este ejemplo muestra como ejecutar una busqueda usando el repository web service y como
* buscar por los nodos padres.
*
* @author Roy Wetherall
*/
public class Query1 extends SamplesBase
{
/**
* Funcion principal
*/
public static void main(String[] args)
throws Exception
{
// Iniciar la sesion
AuthenticationUtils.startSession(USERNAME, PASSWORD);

try
{
// Asegurarse de que los datos de ejemplo se han creado
createSampleData();

// Ejecutar la busqueda de ejemplo
executeSearch();
}
finally
{
// Finalizar la sesion
AuthenticationUtils.endSession();
}
}
/**
* Ejecutar una busqueda de prueba y dar un ejemplo de uso de un consulta paterna.
*
* @return devuelve una referencia a la carpeta que es el padre de los resultados
* ( usado en los siguientes ejemplos)
* @throws ServiceException Service exception
* @throws RemoteException Remove exception
* @throws RepositoryFault Repository fault
*/
public static Reference executeSearch() throws ServiceException, RemoteException, RepositoryFault
{
Reference parentReference = null;

// Obtener la referencia al respository web service
RepositoryServiceSoapBindingStub repositoryService = WebServiceFactory.getRepositoryService();

// Crear un objeto query, que busque por todos los items con alfresco en el nombre del texto
Query query = new Query(Constants.QUERY_LANG_LUCENE, "TEXT:'alfresco development team'");

// Ejecutar la consulta
QueryResult queryResult = repositoryService.query(STORE, query, false);

// Mostrar los resultados
ResultSet resultSet = queryResult.getResultSet();
ResultSetRow[] rows = resultSet.getRows();
if (rows == null)
{
System.out.println("No se han encontrado resultados.");
}
else
{
System.out.println("Resultados de la consulta:");
outputResultSet(rows);

// Obtener el id del primer resultado
String firstResultId = rows[0].getNode().getId();
Reference reference = new Reference(STORE, firstResultId, null);

// Obtener el padre(s) del primer resultado
QueryResult parentQueryResult = repositoryService.queryParents(reference);

// Obtener el padre del primer resultado
ResultSet parentResultSet = parentQueryResult.getResultSet();
ResultSetRow[] parentRows = parentResultSet.getRows();
if (parentRows == null)
{
System.out.println("No se ha encontrado ningun resultado.");
}
else
{
System.out.println("Resultados de la consulta de los padres:");
outputResultSet(parentRows);

// devolver el primer padre
String firstParentId = parentRows[0].getNode().getId();
parentReference = new Reference(STORE, firstParentId, null);
}
}

return parentReference;
}
/**
* Metodo de ayuda para devolver las filas contenidas en un conjunto de resultados
*
* @param rows un array de filas
*/
public static void outputResultSet(ResultSetRow[] rows)
{
if (rows != null)
{
for (int x = 0; x < rows.length; x++)
{
ResultSetRow row = rows[x];

NamedValue[] columns = row.getColumns();
for (int y = 0; y < columns.length; y++)
{
System.out.println("row " + x + ": "
+ row.getColumns(y).getName() + " = "
+ row.getColumns(y).getValue());
}
}
}
}
}

Ejemplo 3. Manipular contenido

Este ejemplo muestra como crear contenido, leer y actualizar usando la Content Web Service.

import java.io.InputStream;
import org.alfresco.webservice.content.Content;
import org.alfresco.webservice.content.ContentServiceSoapBindingStub;
import org.alfresco.webservice.repository.UpdateResult;
import org.alfresco.webservice.types.CML;
import org.alfresco.webservice.types.CMLCreate;
import org.alfresco.webservice.types.ContentFormat;
import org.alfresco.webservice.types.NamedValue;
import org.alfresco.webservice.types.ParentReference;
import org.alfresco.webservice.types.Predicate;
import org.alfresco.webservice.types.Reference;
import org.alfresco.webservice.util.AuthenticationUtils;
import org.alfresco.webservice.util.Constants;
import org.alfresco.webservice.util.ContentUtils;
import org.alfresco.webservice.util.Utils;
import org.alfresco.webservice.util.WebServiceFactory;
/**
* Ejemplo 3
* <p>
* Est ejemplo de servicio web muestra como se puede añadir nuevo contenido al repositorio y como puede
* leido y actualizado mediante la API de web service.
*
* @author Roy Wetherall
*/
public class ContentReadAndWrite extends SamplesBase
{
/** cadenas de Contenido usado en el ejemplo */
private static final String INITIAL_CONTENT = "Esto es un trozo de nuevo contenido que añado al repositorio";
private static final String UPDATED_CONTENT = "Este es el contenido actualizado";
/** El tipo de asociación que estamos creando al nuevo contenido */
private static final String ASSOC_CONTAINS = "{http://www.alfresco.org/model/content/1.0}contains";

/**
* Funcion Principal
*/
public static void main(String[] args) throws Exception
{
// Iniciar sesion
AuthenticationUtils.startSession(USERNAME, PASSWORD);

try
{
// Asegurarse de que los datos de prueba estan creados
createSampleData();

// Obtener el content service
ContentServiceSoapBindingStub contentService = WebServiceFactory.getContentService();

// Crear el nuevo contenido en el respositorio
Reference newContentReference = createNewContent(contentService, "ejemploTresFicheroUno.txt", INITIAL_CONTENT);

// Leer el nuevo contenido del repositorio
Content[] readResult = contentService.read(
new Predicate(new Reference[]{newContentReference}, STORE, null),
Constants.PROP_CONTENT);
Content content = readResult[0];

// Ontener el contenido y mostrarlo
System.out.println("The nuevo contenido añadido es:");
System.out.println(ContentUtils.getContentAsString(content));

// Actualizar el contenido con algo nuevo
contentService.write(newContentReference, Constants.PROP_CONTENT, UPDATED_CONTENT.getBytes(), null);

// Ahora mostrar el contenido nuevo
Content[] readResult2 = contentService.read(
new Predicate(new Reference[]{newContentReference}, STORE, null),
Constants.PROP_CONTENT);
Content content2 = readResult2[0];
System.out.println("El contenido actualizado es:");
System.out.println(ContentUtils.getContentAsString(content2));

// Cargar el contenido binario en el repositorio
Reference reference = Query1.executeSearch();
ParentReference parentReference = new ParentReference(reference.getStore(), reference.getUuid(), null, ASSOC_CONTAINS, "{" + Constants.NAMESPACE_CONTENT_MODEL + "}test.jpg");

// Crear el contenido
NamedValue[] properties = new NamedValue[]{Utils.createNamedValue(Constants.PROP_NAME, "test.jpg")};
CMLCreate create = new CMLCreate("1", parentReference, null, null, null, Constants.TYPE_CONTENT, properties);
CML cml = new CML();
cml.setCreate(new CMLCreate[]{create});
UpdateResult[] result = WebServiceFactory.getRepositoryService().update(cml);

// Obtener el nodo creado y crear el formato
Reference newContentNode = result[0].getDestination();
ContentFormat format = new ContentFormat("image/jpeg", "UTF-8");

// Abrir el fichero y convertirlo en byte array
InputStream viewStream = newContentNode.getClass().getClassLoader().getResourceAsStream("org/alfresco/webservice/test/resources/test.jpg");
byte[] bytes = ContentUtils.convertToByteArray(viewStream);

// Escribir el contenido
WebServiceFactory.getContentService().write(newContentNode, Constants.PROP_CONTENT, bytes, format);

}
finally
{
// Finalizar la sesion
AuthenticationUtils.endSession();
}
}

/**
* Metodo de ayuda para crear nuevo contenido.
*
* @param contentService content web service
* @param content el contenido
* @return una referencia al nodo de contenido creado
* @throws Exception
*/
public static Reference createNewContent(ContentServiceSoapBindingStub contentService, String name, String contentString)
throws Exception
{
// Actualiza nombre
name = System.currentTimeMillis() + "_" + name;

// Crear una refernecia padre, contiene informacion sobre la asociacion que creamos al nuevo contenido y al
// padre del nuevo contenido (el espacio devuelto por la busqueda)
ParentReference parentReference = new ParentReference(STORE, null, "/app:company_home/cm:sample_folder", ASSOC_CONTAINS,
"{" + Constants.NAMESPACE_CONTENT_MODEL + "}" + name);

// Define el formatodel contenido para el contenido que estamos añadiendo
ContentFormat contentFormat = new ContentFormat("text/plain", "UTF-8");

NamedValue[] properties = new NamedValue[]{Utils.createNamedValue(Constants.PROP_NAME, name)};
CMLCreate create = new CMLCreate("1", parentReference, null, null, null, Constants.TYPE_CONTENT, properties);
CML cml = new CML();
cml.setCreate(new CMLCreate[]{create});
UpdateResult[] result = WebServiceFactory.getRepositoryService().update(cml);

Reference newContentNode = result[0].getDestination();
Content content = contentService.write(newContentNode, Constants.PROP_CONTENT, contentString.getBytes(), contentFormat);

// Obtener una referencia al nuevo contenido creado
return content.getNode();
}
}

Ejemplo 4. Actualizaciones CML

Este ejemplo muestra como construir y ejecutar consultas CML usando el Repository Web Service.

import org.alfresco.webservice.repository.RepositoryServiceSoapBindingStub;
import org.alfresco.webservice.repository.UpdateResult;
import org.alfresco.webservice.types.CML;
import org.alfresco.webservice.types.CMLAddAspect;
import org.alfresco.webservice.types.CMLCreate;
import org.alfresco.webservice.types.NamedValue;
import org.alfresco.webservice.types.ParentReference;
import org.alfresco.webservice.types.Reference;
import org.alfresco.webservice.util.AuthenticationUtils;
import org.alfresco.webservice.util.Constants;
import org.alfresco.webservice.util.Utils;
import org.alfresco.webservice.util.WebServiceFactory;
/**
* Ejemplo 4
* <p>
* Este ejemplo muestra como construir y ejecutar consulatas CML usando el respository web service.
*
* @author Roy Wetherall
*/
public class CMLUpdates extends SamplesBase
{
/**
* Fuuncion principal
*/
public static void main(String[] args)
throws Exception
{
AuthenticationUtils.startSession(USERNAME, PASSWORD);
try
{
// Asegurar que los datos de ejemplo están creados
createSampleData();

// Obtener repository service
RepositoryServiceSoapBindingStub repositoryService = WebServiceFactory.getRepositoryService();

// Crear la estructura CML
// Cuando se ejecute esta consulta de actualizacion cml creara un nuevo nodo de contenido por debajo de la
// carpeta especificada y añadira el aspecto versionable al nuevo nodo
ParentReference parentReference = new ParentReference(STORE, null, "/app:company_home/cm:sample_folder", Constants.ASSOC_CONTAINS, Constants.ASSOC_CONTAINS);
NamedValue[] properties = new NamedValue[]{Utils.createNamedValue(Constants.PROP_NAME, System.currentTimeMillis() + "_WebServiceSample4.txt")};
CMLCreate create = new CMLCreate("id1", parentReference, null, null, null, Constants.TYPE_CONTENT, properties);
CMLAddAspect addAspect = new CMLAddAspect(Constants.ASPECT_VERSIONABLE, null, null, "id1");
CML cml = new CML();
cml.setCreate(new CMLCreate[]{create});
cml.setAddAspect(new CMLAddAspect[]{addAspect});

// Execute the update
UpdateResult[] updateResults = repositoryService.update(cml);

for (UpdateResult updateResult : updateResults)
{
String sourceId = "none";
Reference source = updateResult.getSource();
if (source != null)
{
sourceId = source.getUuid();
}

String destinationId = "none";
Reference destination = updateResult.getDestination();
if (destination != null)
{
destinationId = destination.getUuid();
}

System.out.println(
"Command = " + updateResult.getStatement() +
"; Source = " + sourceId +
"; Destination = " + destinationId);
}
}
finally
{
// Finalizar la sesion
AuthenticationUtils.endSession();
}
}
}

Ejemplo 5. Proteger y desproteger

Este ejemplo muestra como desproteger documentos, protegerlos y ver el historico de vesiones usando el Authoring Web Service.

import org.alfresco.webservice.authoring.AuthoringServiceSoapBindingStub;
import org.alfresco.webservice.authoring.CheckoutResult;
import org.alfresco.webservice.content.Content;
import org.alfresco.webservice.content.ContentServiceSoapBindingStub;
import org.alfresco.webservice.repository.RepositoryServiceSoapBindingStub;
import org.alfresco.webservice.types.CML;
import org.alfresco.webservice.types.CMLAddAspect;
import org.alfresco.webservice.types.ContentFormat;
import org.alfresco.webservice.types.NamedValue;
import org.alfresco.webservice.types.Predicate;
import org.alfresco.webservice.types.Reference;
import org.alfresco.webservice.types.Store;
import org.alfresco.webservice.types.Version;
import org.alfresco.webservice.types.VersionHistory;
import org.alfresco.webservice.util.AuthenticationUtils;
import org.alfresco.webservice.util.Constants;
import org.alfresco.webservice.util.ContentUtils;
import org.alfresco.webservice.util.Utils;
import org.alfresco.webservice.util.WebServiceFactory;
/**
* Web service sample 5
* <p>
* Este ejemplo muestra como desproteger y proteger documentos y como ver el
* historial de versiones.
*
* @author Roy Wetherall
*/
public class CheckOutCheckIn extends SamplesBase
{
private final static String INITIAL_CONTENT = "Este es el contenido anterior a la desproteccion";
private final static String UPDATED_CONTENT = "Este es el contenido actualizado";

/**
* Funcion principal
*/
public static void main(String[] args)
throws Exception
{
AuthenticationUtils.startSession(USERNAME, PASSWORD);
try
{
// Asegurar que los datos de ejemplo están creados
createSampleData();

// Obtener el content service y authoring service
RepositoryServiceSoapBindingStub repositoryService = WebServiceFactory.getRepositoryService();
ContentServiceSoapBindingStub contentService = WebServiceFactory.getContentService();
AuthoringServiceSoapBindingStub authoringService = WebServiceFactory.getAuthoringService();

// Obtener una referencia al nuevo contenido creado
Reference contentReference = ContentReadAndWrite.createNewContent(contentService, "SampleFiveFileOne.txt", INITIAL_CONTENT);

// Añadir el aspecto versionable al contenido creado. Esto permitirá que el vontenido sea versionado
makeVersionable(repositoryService, contentReference);

// Desproteger el contenido, situando el documento de trabajo en la misma carpeta
Predicate itemsToCheckOut = new Predicate(new Reference[]{contentReference}, null, null);
CheckoutResult checkOutResult = authoringService.checkout(itemsToCheckOut, null);

// Obtener una referencia a la copia de trabajo
Reference workingCopyReference = checkOutResult.getWorkingCopies()[0];

// Actualizar el contenido de la copia de trabajo
ContentFormat format = new ContentFormat(Constants.MIMETYPE_TEXT_PLAIN, "UTF-8");
contentService.write(workingCopyReference, Constants.PROP_CONTENT, UPDATED_CONTENT.getBytes(), format);

// Proteger la copia de trabajo añadiendole una descripción del cambio que se guardará en el
// historico de versiones
Predicate predicate = new Predicate(new Reference[]{workingCopyReference}, null, null);
NamedValue[] comments = new NamedValue[]{Utils.createNamedValue("description", "El contenido ha sido actualizado")};
authoringService.checkin(predicate, comments, false);

// Mostrar el contenido actualizado
Store store = new Store(Constants.WORKSPACE_STORE, "SpacesStore");
Content[] readResult = contentService.read(
new Predicate(new Reference[]{contentReference}, store, null),
Constants.PROP_CONTENT);
Content content = readResult[0];
System.out.println("Este es el contenido protegido:");
System.out.println(ContentUtils.getContentAsString(content));

// Obtener el historico de versiones
System.out.println("El historico de versiones:");
VersionHistory versionHistory = authoringService.getVersionHistory(contentReference);
for (Version version : versionHistory.getVersions())
{
// Mostrar los detalles
outputVersion(version);
}
}
finally
{
// Finalizar sesion
AuthenticationUtils.endSession();
}
}

/**
* Metodo de ayuda para realizar la aplicacion de aspectoversionable a una referencia dada
* <p>
*
*
* @param respositoryService el respository service
* @param reference la referencia
* @throws Exception
*/
public static void makeVersionable(RepositoryServiceSoapBindingStub respositoryService, Reference reference)
throws Exception
{
// Crear el objeto consulta para añadir el aspecto Predicate predicate = new Predicate(new Reference[]{reference}, null, null);
CMLAddAspect addAspect = new CMLAddAspect(Constants.ASPECT_VERSIONABLE, null, predicate, null);

// Crear la consulta CML
CML cml = new CML();
cml.setAddAspect(new CMLAddAspect[]{addAspect});

// Ejecutar la query
respositoryService.update(cml);
}

/**
* Metodo de ayuda para mostrar los detalles de version
*
* @param version la version
*/
private static void outputVersion(Version version)
{
String description = "none";
for (NamedValue namedValue : version.getCommentaries())
{
if (namedValue.getName().equals("description") == true)
{
description = namedValue.getValue();
}
}
System.out.println("Etiqueta de Version = " + version.getLabel() + "; Descripcion de Version = " + description);
}
}

Ejemplo 6. Categorias

Este ejemplo muestra como el contenido puede ser mediante sus categorias usando el Classification Web Service.

import org.alfresco.webservice.classification.ClassificationServiceSoapBindingStub;
import org.alfresco.webservice.repository.QueryResult;
import org.alfresco.webservice.repository.RepositoryServiceSoapBindingStub;
import org.alfresco.webservice.types.Category;
import org.alfresco.webservice.types.Classification;
import org.alfresco.webservice.types.Query;
import org.alfresco.webservice.util.AuthenticationUtils;
import org.alfresco.webservice.util.Constants;
import org.alfresco.webservice.util.ISO9075;
import org.alfresco.webservice.util.WebServiceFactory;
/**
* Ejemplo 6
* <p>
* Este ejemplo muestra como el contenido puede ser consultado usando categorias
*
* @author Roy Wetherall
*/
public class Categories extends SamplesBase
{
/**
* Función principal
*/
public static void main(String[] args)
throws Exception
{
AuthenticationUtils.startSession(USERNAME, PASSWORD);
try
{
// Asegurar que los datos de ejemplo han sido creados
createSampleData();

// Obtener los servicios
RepositoryServiceSoapBindingStub repositoryService = WebServiceFactory.getRepositoryService();
ClassificationServiceSoapBindingStub classificationService = WebServiceFactory.getClassificationService();

// Obtener todas las clasificaciones
Classification[] classifications = classificationService.getClassifications(STORE);

// Mostrar algunos detalles
System.out.println("Todas las clasificaciones:");
for (Classification classification : classifications)
{
System.out.println(classification.getClassification());
System.out.println("Clasificacion = " + classification.getTitle() + "; Categoria raiz = " + classification.getRootCategory().getTitle());
}

// Obtener la definicion de clase para la clasificación en la que estamos interesados.
Classification classification = classifications[0];

// Obtener las categorias hijas
Category[] categories = null;
if (classifications.length > 0)
{
categories = classificationService.getChildCategories(classifications[0].getRootCategory().getId());
if (categories != null)
{
// Mostrar algunos detalles
System.out.println("Las categorias hijas de la clasificación '" + classifications[0].getTitle() + "':");
for (Category category : categories)
{
System.out.println("Titulo = " + category.getTitle());
}
}
else
{
System.out.println("Categorias hijas no encontradas.");
}
}

// Construir una consulta
StringBuilder pathQuery = new StringBuilder(128);

//pathQuery.append("PATH:\"cm:generalclassifiable/cm:MyTestCategory/cm:One/member\"");

// Codificar el nombre de la categoría raiz
String encodedRoot = ISO9075.encode(classification.getRootCategory().getTitle());

// Construir la ruta de busqueda
if (categories != null && categories.length != 0)
{
for (int i=0; i<categories.length; i++)
{
if (pathQuery.length() != 0)
{
pathQuery.append("OR");
}

String encoded = ISO9075.encode(categories[i].getTitle());
pathQuery.append(" PATH:\"cm:generalclassifiable/cm:" + encodedRoot + "/cm:" + encoded + "/member\" ");
}
}

System.out.println("Query path: " + pathQuery.toString());

// Llamar al repository service para hacer la busqueda basada en categorias
Query query = new Query(Constants.QUERY_LANG_LUCENE, pathQuery.toString());

// Ejecutar la consulta
QueryResult queryResult = repositoryService.query(STORE, query, true);

System.out.println("Resultados de la consulta de busqueda:");
Query1.outputResultSet(queryResult.getResultSet().getRows());
}
finally
{
AuthenticationUtils.endSession();
}
}
}

Ejemplo de uso de servicios web con Ruby

La forma mas simple de acceder a Alfresco desde una applicacion ruby usando servicios web es usar Sop4r. La actual implememtación no offrece los estandar WS-Security directamente así que para los ejemplos se ha usado Wss4r que añade esta seguridad.

Iniciar una sesion

require 'soap/wsdlDriver'
require "wss4r/rpc/wssdriver"
...
wsdl_url = "file://" + <path-a-su-directorio-wsdl> + "/authentication-service.wsdl"
soapDriver = SOAP::WSDLDriverFactory.new(wsdl_url).create_rpc_driver()
authentication_result = soapDriver.startSession {:username => '<username>', :password => '<password>'}
ticket = authentication_result.ticket
...

Como se puede ver, una vez que se tiene configurado el entorno y un wsdl valido unas pocas lineas hacen el resto. El resultado de la uatenticación es un ticket que se tendrá que reusar cada vez que se haga una consulta.

Enviar una consulta

require 'soap/wsdlDriver'
require "wss4r/rpc/wssdriver"
require "wss4r/tokenresolver/authenticateuserresolver"
...
wsdl_url = "file://" + <path-a-su-directorio-wsdl> + "/repository-service.wsdl"
soapDriver = SOAP::WSDLDriverFactory.new(wsdl_url).create_rpc_driver()
# añadir la informacion de autenticacion
resolver = AuthenticateUserResolver.new()
soapDriver.security().add_security_resolver(resolver)
soapDriver.security().add_security_token(UsernameToken.new(user, ticket))
# la consulta
query_result = soapDriver.query({:store => {:scheme => 'workspace', :address => 'SpacesStore'},
:query => {:language => 'lucene', :statement => 'TEXT:"<some text to seach>"'},
:includeMetaData => false})
...

Hacer una consulta requiere un poco mas de esfuerzo al necesitar que se incluya el ticket que se generó anteriormente.

Leer the resultados

Obtener el numero de filas devueltas:

number_of_results = query_result.queryReturn.resultSet.totalRowCount

Ejemplo de uso de servicios web con PHP

<?php

require_once "Alfresco/Service/Repository.php";
require_once "Alfresco/Service/Session.php";
require_once "Alfresco/Service/SpacesStore.php";
require_once "Alfresco/Service/Node.php";
require_once "Alfresco/config.php";
require_once('include/database/PearDatabase.php'); //conexion a bbdd
function UpdateDMSContent(){
global $repositoryUrl;
global $userName;
global $password;
global $adb;
$repository = new Repository($repositoryUrl);
$repository = new Repository($repositoryUrl);
$ticket = null;
if (isset($_SESSION["ticket"]) == false)
{
$ticket = $repository->authenticate($userName, $password);
$_SESSION["ticket"] = $ticket;
}
else
{
$ticket = $_SESSION["ticket"];
}
try{
$session = $repository->createSession($ticket);
$store = new SpacesStore($session);
$currentNode = $store->companyHome;
$path = 'Company Home';
$listOfContents = array();
$listOfContentIds = '';
foreach ($currentNode->Children as $child){
if($child->child->type == '{http://www.alfresco.org/model/content/1.0}content'){
$listOfContents[] = array('Content Name' => $child->child->cm_name, 'Content ID' => $child->child->id, 'Content Path' => getURL($child->child) );
$listOfContentIds .= "'{$child->child->id}', ";
$sql = "select count(*) from vtiger_icswidgets where sourceid = '{$child->child->id}'";
if($row = $adb->fetch_array($adb->query($sql))){
if($row[0] == 0){
$sql = "insert into vtiger_icswidgets(id, widgetname, source, sourceid, visibletoagent, deleted) values (null, '{$child->child->cm_name}', 'DMS', '{$child->child->id}', 1, 1)";
$adb->query($sql);
}
}

}
}
}catch (Exception $e) {
var_dump($e);
echo '<div align="center"><font color="red">Alfresco DMS se enfrenta a un error en la sincronizacion de los contenidos. Por favor vuelva a logarse para evitar el problema.</font></div>.';
echo '<div align="center">Exception: '.$e->getMessage().'</div>';
}
$listOfContentIds = substr($listOfContentIds, 0, -2);
$adb->query("delete from vtiger_icswidgets where sourceid not in ($listOfContentIds)");
unset($_SESSION["ticket"]);
return $listOfContents;
}
function getURL($node){
global $path;
$result = null;
if ($node->type == "{http://www.alfresco.org/model/content/1.0}content")
{
$contentData = $node->cm_content;
if ($contentData != null)
{
$result = $contentData->getUrl();
}
}
else
{
$result = "index.php?".
"&uuid=".$node->id.
"&name=".$node->cm_name.
"&path=".$path;
}
return $result;
}
function pullDMSContent($uuid, $contentName, $cleanHTML = 'No'){
global $repositoryUrl;
global $userName;
global $password;
$file = '';
global $adb;
$cool = $cleanHTML;
//if($row = $adb->fetch_array($adb->query("select * from vtiger_icsadminpreferences"))) $cool = $row['cleanhtml'];
if (isset($_SESSION) == false) session_start();

$repository = new Repository($repositoryUrl);
$ticket = null;
if (isset($_SESSION["ticket"]) == false){
$ticket = $repository->authenticate($userName, $password);
$_SESSION["ticket"] = $ticket;
}else{
$ticket = $_SESSION["ticket"];
}
$session = $repository->createSession($ticket);

$store = new SpacesStore($session);
$currentNode = null;
try {
$currentNode = $session->getNode($store, $uuid);
$contentData = $currentNode->cm_content;
$file = $contentData->getUrl();
} catch (Exception $e) {
sendAlert(4, "Contenido con nombre - $contentName ha desaparecido");
return '';
}
$fp = fopen($file, 'r');
$DMSContent = stream_get_contents($fp);
fclose($fp);
if($cool == 'Yes') $DMSContent = strip_tags($DMSContent,'<p><b><i><u><strong><br><span><center><h1><h2><h3><h4><h5><h6>');
return $DMSContent;
}

Ejemplo de uso de servicios web con WSS/WSSE

Construccion de una cabeceras WSSE

<process name="alfresco
...
xmlns:ns4="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:ns5="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<variables>
<variable name="wsseHeader" element="ns4:Security"/>
<variable name="wstimestamp" element="ns5:Timestamp"/>
</variables>
<sequence name="main">
<assign name="makeWSSEHeaders">
<copy>
<from expression="xp20:current-dateTime()"/>
<to variable="wstimestamp" query="/ns5:Timestamp/ns5:Created"/>
</copy>
<copy>
<from expression="xp20:current-dateTime()"/>
<to variable="wstimestamp" query="/ns5:Timestamp/ns5:Expires"/>
</copy>
<bpelx:append>
<bpelx:from variable="wstimestamp" query="/ns5:Timestamp"/>
<bpelx:to variable="wsseHeader" query="/ns4:Security"/>
</bpelx:append>
<bpelx:append>
<bpelx:from>
<wsse:UsernameToken xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:Username>admin</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"/>
</wsse:UsernameToken>
</bpelx:from>
<bpelx:to variable="wsseHeader" query="/ns4:Security"/>
</bpelx:append>
<bpelx:append>
<bpelx:from expression="ora:getNodeValue(bpws:getVariableData('startSession_Output','parameters','/ns1:startSessionResponse/ns1:startSessionReturn/ns1:ticket'))"/>
<bpelx:to variable="wsseHeader" query="/ns4:Security/ns4:UsernameToken/ns4:Password"/>
</bpelx:append>
</assign>
<invoke name="repo" partnerLink="repository-service" portType="ns6:RepositoryServiceSoapPort" operation="query" inputVariable="repo_query_InputVariable"
outputVariable="repo_query_OutputVariable" bpelx:inputHeaderVariable="wsseHeader"/>
</sequence>
</process>

Iniciar una sesion

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<env:Body>
<startSession xmlns="http://www.alfresco.org/ws/service/authentication/1.0">
<username>admin</username>
<password>admin</password>
</startSession>
</env:Body>
</env:Envelope>

Llamada al RepositoryService usando las cabeceras WSSE

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<env:Header>
<Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<Timestamp xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" ans1:Id="" xmlns:ans1="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:ns1="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<ans1:Created>2007-08-01T12:13:37+01:00</ans1:Created>
<ans1:Expires>2007-08-01T12:13:37+01:00</ans1:Expires>
</Timestamp>
<UsernameToken xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<Username>admin</Username>
<Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">TICKET_de9b08df-4017-11dc-8ec5-41f7efb0a5f7</Password>
</UsernameToken>
</Security>
</env:Header>
<env:Body>
<query xmlns="http://www.alfresco.org/ws/service/repository/1.0" xmlns:ns3="http://www.alfresco.org/ws/model/content/1.0">
<store>
<ns1:scheme xmlns:ns1="http://www.alfresco.org/ws/model/content/1.0">workspace</ns1:scheme>
<ns2:address xmlns:ns2="http://www.alfresco.org/ws/model/content/1.0">SpacesStore</ns2:address>
</store>
<query>
<ns3:language xmlns:ns3="http://www.alfresco.org/ws/model/content/1.0">lucene</ns3:language>
<ns4:statement xmlns:ns4="http://www.alfresco.org/ws/model/content/1.0">@cm\:name:"Alfresco-Tutorial.pdf"</ns4:statement>
</query>
<includeMetaData>true</includeMetaData>
</query>
</env:Body>
</env:Envelope>

Usar el ContentService con una Consulta Lucene con cabeceras WSSE

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<env:Header>
<Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<Timestamp xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" ans1:Id="" xmlns:ans1="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:ns1="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<ans1:Created>2007-08-01T12:13:37+01:00</ans1:Created>
<ans1:Expires>2007-08-01T12:20:37+01:00</ans1:Expires>
</Timestamp>
<UsernameToken xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<Username>admin</Username>
<Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">TICKET_de9b08df-4017-11dc-8ec5-41f7efb0a5f7</Password>
</UsernameToken>
</Security>
</env:Header>
<env:Body>
<read xmlns="http://www.alfresco.org/ws/service/content/1.0">
<items>
<store xmlns="http://www.alfresco.org/ws/model/content/1.0">
<scheme>workspace</scheme>
<address>SpacesStore</address>
</store>
<query xmlns="http://www.alfresco.org/ws/model/content/1.0">
<language>lucene</language>
<statement>@cm\:name:"Alfresco-Tutorial.pdf"</statement>
</query>
</items>
<property>{http://www.alfresco.org/model/content/1.0}content</property>
</read>
</env:Body>
</env:Envelope>

Usar ContentService con uuid con cabeceras WSSE

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<env:Header>
<Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<Timestamp xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" ans1:Id="" xmlns:ans1="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:ns1="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<ans1:Created>2007-08-01T12:00:28+01:00</ans1:Created>
<ans1:Expires>2007-08-01T12:05:28+01:00</ans1:Expires>
</Timestamp>
<UsernameToken xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<Username>admin</Username>
<Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">TICKET_088d539c-4016-11dc-8ec5-41f7efb0a5f7</Password>
</UsernameToken>
</Security>
</env:Header>
<env:Body>
<read xmlns="http://www.alfresco.org/ws/service/content/1.0">
<items>
<nodes xmlns="http://www.alfresco.org/ws/model/content/1.0">
<store>
<scheme>workspace</scheme>
<address>SpacesStore</address>
</store>
<uuid>635c49e6-0af5-11dc-9bc5-2ddbdefb608b</uuid>
</nodes>
</items>
<property>{http://www.alfresco.org/model/content/1.0}content</property>
</read>
</env:Body>
</env:Envelope>

Usar el ContentService con path con cabeceras WSSE

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<env:Header>
<Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<Timestamp xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" ans1:Id="" xmlns:ans1="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:ns1="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<ans1:Created>2007-08-01T12:00:28+01:00</ans1:Created>
<ans1:Expires>2007-08-01T12:05:28+01:00</ans1:Expires>
</Timestamp>
<UsernameToken xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<Username>admin</Username>
<Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">TICKET_088d539c-4016-11dc-8ec5-41f7efb0a5f7</Password>
</UsernameToken>
</Security>
</env:Header>
<env:Body>
<read xmlns="http://www.alfresco.org/ws/service/content/1.0">
<items>
<nodes xmlns="http://www.alfresco.org/ws/model/content/1.0">
<store>
<scheme>workspace</scheme>
<address>SpacesStore</address>
</store>
<path>/app:company_home/app:guest_home/cm:Alfresco-Tutorial.pdf</path>
</nodes>
</items>
<property>{http://www.alfresco.org/model/content/1.0}content</property>
</read>
</env:Body>
</env:Envelope>


Enlaces externos