Uso de servicios web para borrar contenido

cancel
Showing results for 
Search instead for 
Did you mean: 
fdelgado
Member II

Uso de servicios web para borrar contenido

Buenas,
estoy usando los servicios web para crear y borrar contenidos. Para crear, se crean bien, pero para borrar, si ha sido creado el contenido por el servicio web, se generan errores al intentar obtener una referencia, y no los borra.
Sin embargo, si el contenido lo he creado utilizando la interfaz web, o copiando y pegando un contenido con la interfaz web, el servicio web lo borra bien.

Estoy algo desesperado ya, ya que algo que en teoria deberia ser muy sencillo y de hecho en los ejemplos del SDK lo son.

Lo que hago para obtener la referencia del contenido es :



               Store STORE = new Store(Constants.WORKSPACE_STORE, "SpacesStore");

      this.FILEtoDELETE =
                new Reference(STORE, null,"/app:company_home/cm:MEDICAMENTO/cm:_x0030_100/cm:EXCIPIENTES/cm:_x0032_0090320_340086/cm:WebServiceSample_javi.txt");


   boolean dev = false;
          
          
          try
          {
              // Comprueba la existencia del directorio
              WebServiceFactory.getRepositoryService().get(new Predicate(new Reference[]{FILEtoDELETE }, STORE, null));
            
              dev=true;
          }
          catch (Exception exception)
          {
              // no existe el nodo.
             System.out.println("Excepcion ");
             dev=false;
          
          }


   



El error que se genera al intentar obtener una referencia es este:


java.lang.IllegalStateException: Failed to resolve to a single NodeRef with parameters (store=workspace:SpacesStore uuid=null path=/app:company_home/cm:MEDICAMENTO/cm:_x0030_100/cm:EXCIPIENTES/cm:_x0032_0090320_340086/cm:WebServiceSample_javi.txt), found 0 nodes.
En esta ruta, navegando por los espacios con el cliente web, si que existe el archivo WebServiceSample_javi.txt, y si lo copio y pego dentro del mismo espacio con el cliente web, ya si que puedo obtener una referencia.

Muchas gracias a quien pueda ayudarme,
4 Replies
pjcaracuel_2349
Active Member II

Re: Uso de servicios web para borrar contenido

Buenas,

A priori lo primero que miraria es si atraves del explorador de nodos, te encuentra el que quieres borrar.
"/app:company_home/cm:MEDICAMENTO/cm:_x0030_100/cm:EXCIPIENTES/cm:_x0032_0090320_340086/cm:WebServiceSample_javi.txt"

Yo tuve problemas por que no componia bien la condicion de busqueda y por tanto al ir a buscar el nodo, no lo encontraba.

TE pongo un consejo me dieron a mi en su dia por si te sirve como me sirvio a mi:

La recomendación cuando se trabaja con sentencias Lucene es, si se tiene acceso, realizar pruebas con las misma en el Node Browser de Alfresco así estas se facilitarán y encontraremos antes la sentencia que buscamos. Una vez encontrada antes de usarla desde una interfaz Java ya solo tendríamos que proteger los caracteres especiales (\ y ") al contruir la consulta.

Saludos
fdelgado
Member II

Re: Uso de servicios web para borrar contenido

He navegado por el explorador de nodos y he llegado hasta el espacio en donde tengo los distintos archivos.
1 archivo ha sido creado programaticamente con un servicio web.
1 archivo ha sido creado con el ejemplo del SDK
y un tercer contenido ha sido creado copiando y pegando con la interfaz web.

He visto que "child name" cambia según el archivo, pareciendo correcto en el caso del copiado/pegado via cliente web.
¿Puede ser esto la causa de que no lo pueda referenciar y por tanto, borrar? ¿Como le especifico en la creación esta propiedad de "child name"?


Children

Child Name   Child Node   Primary   Association Type   Index

//Este nodo es creado por servicio web y no se puede borrar/referenciar.
{}cm:p_340086.pdf   workspace://SpacesStore/9f4b6911-152b-11de-843c-e7b0ce71be28   true   {http://www.alfresco.org/model/content/1.0}contains   0

//Este nodo es una copia con la interfaz web de uno que no se podia borrar, y si se puede borrar
{http://www.alfresco.org/model/content/1.0}Copy of p_340086.pdf   workspace://SpacesStore/40a42cab-1533-11de-843c-e7b0ce71be28   true   {http://www.alfresco.org/model/content/1.0}contains   1

//Este nodo es creado por servicio web, de una manera similar a los ejemplos del SDK y tampoco se puede borrar/referenciar. El nombre que le puse fue WebServiceSample_javi.txt
{http://www.alfresco.org/model/content/1.0}contains   workspace://SpacesStore/1bd201ef-1548-11de-843c-e7b0ce71be28   true   {http://www.alfresco.org/model/content/1.0}contains   4

pjcaracuel_2349
Active Member II

Re: Uso de servicios web para borrar contenido

Buff, he encontrado una incidencia parecida a la tuya, chequeala y a ver que tal, a mi la solucion no me acaba de convencer perooooo

http://forums.alfresco.com/en/viewtopic.php?f=27&t=16579&p=54481

Saludos
fdelgado
Member II

Re: Uso de servicios web para borrar contenido

He resuelto el borrado del contenido mediante servicio web de la siguiente manera:

- obtengo los nodos hijos del nodo padre. el nodo padre era el espacio donde se encontraba el contenido que quieria borrar.
- recorro los hijos construyendo el objeto Reference a partir del Id del nodo.
- Compruebo que exista el nodo mediante web service.
- obtengo el nodo mediante servicio web y recorro sus propiedades, buscando la propiedad llamada "{http://www.alfresco.org/model/content/1.0}name" para comprobar que su valor coincida con el nombre del contenido que quiero borrar.
- Cuando lo encuentre, obtengo la referencia y para en otro método utilizarla de la forma convencional.

Esto es debido a que el nombre "interno" del contenido es distinto al que yo construía para posteriormente construir la referencia.
Para contenidos creados desde el cliente web de alfresco me bastaba con construir la referencia a partir de por ejemplo:
"/cm:espacio1/cm:espacio2/cmSmiley TonguearchivoAborrar.pdf"
pero para los contenidos que creo programaticamente, aunque el nombre en el cliente web sea "parchivoAborrar.pdf", el nombre "interno" era "/cm:espacio1/cm:espacio2/cm_x003a_parchivoAborrar.pdf", por ello no encontraba el contenido.

Por cierto yo ya utilizaba el metodo ISO9075.encode() para codificar el nombre y el path.

Perdonad si los conceptos/nombres no son exactos. Estoy aun muy fresco en alfresco.




Código:





String PROPIEDAD_CONTENIDO = "{http://www.alfresco.org/model/content/1.0}name";

private Reference obtenerReferenciaMetodoPadreHijos(Reference FOLDER,
         String nombreContenido) {

      Reference ref = FOLDER;
      Reference refNodeDevolucion = null;
   
      
      
      QueryResult queryResult = null;
      try {
         //Obtenemos los contenidos hijos del directorio padre
         queryResult = WebServiceFactory.getRepositoryService()
               .queryChildren(ref);

      } catch (Exception ex) {
         System.out.println("Exepcion obteniendo los hijos. "
               + ex.toString());
         return null;
      }
      

      ResultSet resultSet = queryResult.getResultSet();
      if (resultSet.getTotalRowCount() > 0) {
         ResultSetRow[] rows = resultSet.getRows();

         //Recorremos cada nodo hijo encontrado
         for (int x = 0; x < rows.length; x++) {
            ResultSetRow row = rows[x];
   
         
            //NamedValue[] columns = row.getColumns();

            // Obtenemos el nodo hijo
            ResultSetRowNode node = row.getNode();

            //System.out.println("ID nodo: " + node.getId());
            //System.out.println("Type = " + node.getType());
            
            //Creamos una referencia al nodo hijo
            Reference ref1 = new Reference(STORE, node.getId(), null);
            Query query = null;

            //Comprobamos que podemos ver que el nodo hijo existe y que el nombre coincida con el que estemos buscando.
            Node[] noderesult = null;
            try {
               noderesult = WebServiceFactory.getRepositoryService().get(
                     new Predicate(new Reference[] { ref1 }, STORE,
                           query));

               //Recorremos cada nodo-hijo devuelto, normalmente 1.
               for (int x1 = 0; x1 < noderesult.length; x1++) {

                  Node row1 = noderesult[x1];
                  
                  NamedValue[] columns1 = row1.getProperties();               
                  
                     
                  //buscamos la propiedad que contienen el nombre
                  int y1 = 0;
                  boolean enc = false;
                  
                  while(y1 < columns1.length && !enc)
                  {
                     if (row1.getProperties(y1).getName().equalsIgnoreCase(PROPIEDAD_CONTENIDO) &&
                           row1.getProperties(y1).getValue().equalsIgnoreCase(nombreContenido))
                     {
                        //Hemos encontrado el contenido buscado. Devolvemos la referencia                     
                        refNodeDevolucion = row1.getReference();
                        enc = true;
                           
                     }
                     y1++;
                  }         
                  
               }

            } catch (Exception ex1) {
               System.out
                     .println("Error al obntener la referencia al contenido ");
            }

         }

      } else {
         System.out.println("The query returned no results");

      }
      
      return refNodeDevolucion;
   }