Error en operaciones con objeto predicado

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

Error en operaciones con objeto predicado

Hola,

estoy trabajando en una integración con Alfresco desde una aplicación de escritorio con tecnología .net, en concreto c#

En general el desarrollo está marchando bien pero tengo un problema con operaciones en las que uso un predicado para el objeto cml. Monto todos los objetos, predicado, cml y al llamar a update me devuelve una excepción y no sé cómo atacarla.

Os pongo un ejemplo de un método que he preparado para cambiarle un nombre a una carpeta utilizando un ejemplo de está página

http://wiki.alfresco.com/wiki/IngresTutorial_Alfresco_Web_Service_API_for_Java#Move_a_space

Mi código sería:

ConvertirAPadre: crea un objeto ParentReference de la referencia destino (carpeta en la que queremos dejar el nuevo directorio)

private void MoverDirectorio(Reference directorio, Reference destino, string nombreNuevo, string nombreViejo)
        {
            ParentReference padreDestino = ConvertirAPadre(destino);
            padreDestino.childName = Constantes.crearQNameString(Constantes.NAMESPACE_CONTENT_MODEL, Constantes.normaliza(nombreNuevo));

            CMLMove cmlMover = new CMLMove();
            cmlMover.childName = Constantes.crearQNameString(Constantes.NAMESPACE_CONTENT_MODEL, nombreViejo);
            cmlMover.associationType = Constantes.ASSOC_CONTAINS;
            cmlMover.to = padreDestino;
            Predicate pred = new Predicate();
            pred.Items = new Reference[]{directorio};
            cmlMover.where = pred;
            //move.setWhere(new Predicate(new Reference[] {space},STORE,null));

            NamedValue nvalue = new NamedValue();
            nvalue.name = Constantes.PROP_NAME;
            nvalue.value = nombreNuevo;

            CMLUpdate cmlActualizar = new CMLUpdate();
            cmlActualizar.property = new NamedValue[] { nvalue };
            cmlActualizar.where = pred;
            //cmlActualizar.where_id = this.contenedorCarpetas.address;

            //update.setWhere(new Predicate(new Reference[]{space},STORE,null));

            CML cml  = new CML();
            cml.move = new CMLMove[]{cmlMover};
            cml.update = new CMLUpdate[]{cmlActualizar};
          
          //Execute the CML move and Update statement
            try
            {
             servicioRepository.update(cml);
            }
            catch (Exception e2)
            {   
             throw e2;
            }   
        }
En el ejemplo de la página construyen el objeto predicado pasándole un store general, pero el constructor del predicado no tiene parámetros, así que no sé cómo hacerlo.

Además, ¿hay algún sito de dónde pueda sacar código en c# de ejemplo?

Gracias por vuestra ayuda
6 Replies
venzia
Senior Member

Re: Error en operaciones con objeto predicado

Se que no es tu caso concreto, pero por si te vale, ahí te dejo un ejemplo de función que genera una subcarpeta con el año actual en el "pReference" que le pases :
        //crear la estructura por defecto para cada usuario nuevo
        private bool gfCrearSubcarpetaAnno(Alfresco.RepositoryWebService.Reference pReference, string NombreEmpleado)
        {
            if (pReference != null)//comprobamos que el parentreference no es nulo
            {
                Alfresco.RepositoryWebService.ParentReference parentReference = new Alfresco.RepositoryWebService.ParentReference();
                parentReference.store = shell.spacesStore;
            
                try
                {
                    parentReference.uuid = pReference.uuid;
                    //creamos la ruta codificada
                    parentReference.associationType = Constants.ASSOC_CONTAINS;
                    parentReference.childName = Constants.createQNameString(Constants.NAMESPACE_CONTENT_MODEL, DateTime.Now.Year.ToString());

                    Alfresco.RepositoryWebService.NamedValue[] properties = new Alfresco.RepositoryWebService.NamedValue[3];
                    // Creamos la lista de propiedades
                    Alfresco.RepositoryWebService.NamedValue nameProperty = new Alfresco.RepositoryWebService.NamedValue();
                    nameProperty.name = Constants.PROP_NAME;
                    nameProperty.value = DateTime.Now.Year.ToString();
                    nameProperty.isMultiValue = false;
                    properties[0] = nameProperty;

                    nameProperty = new Alfresco.RepositoryWebService.NamedValue();
                    nameProperty.name = Constants.PROP_TITLE;
                    nameProperty.value = DateTime.Now.Year.ToString();
                    nameProperty.isMultiValue = false;
                    properties[1] = nameProperty;

                    nameProperty = new Alfresco.RepositoryWebService.NamedValue();
                    nameProperty.name = Constants.PROP_DESCRIPTION;
                    nameProperty.value = "Documentos del año " + DateTime.Now.Year.ToString();
                    nameProperty.isMultiValue = false;
                    properties[2] = nameProperty;

                    // Creamos el objeto CMLCreate
                    CMLCreate create = new CMLCreate();
                    create.parent = parentReference;
                    create.id = "1";
                    create.type = Constants.TYPE_FOLDER;
                    create.property = properties;

                    // Creamos y ejecutamos la sentencia
                    CML cml = new CML();
                    cml.create = new CMLCreate[] { create };
                    UpdateResult[] updateResult = shell.repoService.update(cml);

                    return true;
                }
                //error al crear espacio
                catch (Exception ex)
                {
                    return false;
                }
            }
        }
Espero que te sirva .. y si tienes dudas pregunta sin miedo .. te echaré una mano en lo que pueda  :wink:.
(espero que no se haya colado ninguna errata  :mrgreenSmiley Happy
Saludos,
jclaveria
Member II

Re: Error en operaciones con objeto predicado

Hola,

gracias por el ejemplo, pero no es exactamente lo que busco.

Tengo una serie de objetos y métodos que me permiten crear directorios (de forma similar al código que has posteado), buscar directorios y/o ficheros, subir y bajar ficheros tirando contra los webservice Content y Repository. Con esto "integro" la gestión documental de Alfresco con la aplicación de escritorio. El caso es que necesito cambiar el nombre de la carpeta asociada a un expediente debido a acciones que realiza el usuario desde la aplicación de escritorio.

¿Cómo renombro el store? ¿Se puede hacer con un comando cml sin utlizar un objeto predicado? Y ya que estamos, como comenté en el anterior post, al utilizar un comado update con un objeto predicado me salta una excepción sin texto ¿cómo puedo saber qué me está fallando? Mi experencia trabajando con tomcat y similares es cero pelotero asi que lo de mirar logs de catalina y tal se me da bastante mal

Gracias por tu ayuda
venzia
Senior Member

Re: Error en operaciones con objeto predicado

Hola de nuevo, siento no tener tiempo ahora mismo para explicarte lo que comentas. Espero, al menos, que con el siguiente ejemplo de modificación de contenido (documento) tengas para resolver tu problema :
        public bool gfModificarRegistro(cRegistro registro)
        {
           
            Cursor.Current = Cursors.WaitCursor;
            MensajeBarraEstado("Actualizando los metadatos del Registro " + registro.nombre);
            try
            {
                Alfresco.RepositoryWebService.Reference reference = new Alfresco.RepositoryWebService.Reference();
                reference.store = spacesStore; //la definicion del store la explico mas abajo
                reference.uuid = registro.id;
                Alfresco.RepositoryWebService.Predicate predicate = new Alfresco.RepositoryWebService.Predicate();
                predicate.Items = new Object[]{reference};

                Alfresco.RepositoryWebService.NamedValue[] properties = new Alfresco.RepositoryWebService.NamedValue[6];

                // Create the properties list
                Alfresco.RepositoryWebService.NamedValue nameProperty = new Alfresco.RepositoryWebService.NamedValue();


                    nameProperty.name = Constants.PROP_ENT_REF1;
                    nameProperty.value = registro.ref1;//referencia 1
                    nameProperty.isMultiValue = false;
                    properties[0] = nameProperty;

                    nameProperty = new Alfresco.RepositoryWebService.NamedValue();
                    nameProperty.name = Constants.PROP_ENT_REF2;
                    nameProperty.value = registro.ref2;//referencia 2
                    nameProperty.isMultiValue = false;
                    properties[1] = nameProperty;

                    nameProperty = new Alfresco.RepositoryWebService.NamedValue();
                    nameProperty.name = Constants.PROP_ENT_REF3;
                    nameProperty.value = registro.ref3;//referencia 3
                    nameProperty.isMultiValue = false;
                    properties[2] = nameProperty;

                    nameProperty = new Alfresco.RepositoryWebService.NamedValue();
                    nameProperty.name = Constants.PROP_ENT_REF4;
                    nameProperty.value = registro.ref4;//referencia 4
                    nameProperty.isMultiValue = false;
                    properties[3] = nameProperty;

                    nameProperty = new Alfresco.RepositoryWebService.NamedValue();
                    nameProperty.name = Constants.PROP_ENT_FECHADOC;
                    nameProperty.value = formatFecha(Convert.ToDateTime(registro.fechadoc));//fecha de documento
                    nameProperty.isMultiValue = false;
                    properties[4] = nameProperty;

                    nameProperty = new Alfresco.RepositoryWebService.NamedValue();
                    nameProperty.name = Constants.PROP_ENT_FECHAREG;
                    nameProperty.value = formatFecha(Convert.ToDateTime(registro.fechareg));//fecha de registro
                    nameProperty.isMultiValue = false;
                    properties[5] = nameProperty;

             
                // Create the CML update object
                CMLUpdate update = new CMLUpdate();
                update.where = predicate;
                update.where_id = registro.id;
                update.property = properties;

                // Create and execute the cml statement
                CML cml = new CML();
                cml.update = new CMLUpdate[] { update };
                UpdateResult[] updateResult = this.repoService.update(cml);

                Cursor.Current = Cursors.Default;

                if (updateResult.Length > 0)
                {

                    MensajeBarraEstado("Registro " + registro.nombre + " actualizado correctamente…");
                    return true;

                }
                else//si no se obtienen datos de actualizacion
                {
                    MessageBox.Show("El registro " + registro.nombre + " no se ha podido actualizar …", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return false;
                }

            }
            catch (Exception ex)
            {

                MessageBox.Show("El registro " + registro.nombre + " no se ha podido actualizar …\r\n(" + ex.Message + ")", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;

            }
        }
La definición de spaceStore global es la siguiente :
                //inicializamos el Store sobre el que realizaremos operaciones
                this.spacesStore = new Alfresco.RepositoryWebService.Store();
                this.spacesStore.scheme = Alfresco.RepositoryWebService.StoreEnum.workspace;
                this.spacesStore.address = "SpacesStore";
En caso que no te funcione lo podemos ver.
Saludos y suerte!
jclaveria
Member II

Re: Error en operaciones con objeto predicado

Muchas gracias Javier,

gracias a tu código me he dado cuenta que no le establecía correctamente el uuid en la referencia que utilizaba como item del objeto predicado. Ya funciona correctamente
venzia
Senior Member

Re: Error en operaciones con objeto predicado

fboiero
Member II

Re: Error en operaciones con objeto predicado

Javier,
Muchas gracias por el ejemplo que subiste, lo encontré en el momento justo después de muchas horas y diferentes intentos por hacer algo parecido.
(Y) Smiley Very Happy  Smiley Very Happy  Smiley Very Happy  Smiley Very Happy  Smiley Very Happy
Saludos

Fernando.