No asigna valores a las propiedades personalizadas

cancel
Showing results for 
Search instead for 
Did you mean: 
adyp
Active Member

No asigna valores a las propiedades personalizadas

Jump to solution

Buenas Tardes,
Utilizo alfresco 5.2
Cmis 1.1
Requiero asignar propiedades personalizadas, tales como: (intTipoDocumento , strTipoDocumento , etc),
para ello que creado un aspecto y propiedades para ese aspecto utilizando alfresco share
Para asginar el aspecto al documento he seguido estos pasos :
https://docs.alfresco.com/5.2/pra/1/concepts/opencmis-ext-creating-aspects.html
Cuando veo el documento por cmis workbench observo el aspecto que esta dentro de "Secondary objetType lds" como uno de sus valores y
a las propiedades personalizadas fuera del "Secondary objetType lds" pero sin valores asignados .
Mi codifo es este :
lProperties.put(PropertyIds.NAME, name);
lProperties.put(PropertyIds.OBJECT_TYPE_ID, "cmis:document,PSmiley Very HappyocServ:AspectDocServicio");
lProperties.put(PropertyIds.DESCRIPTION , objDocumentoServicio.getStrObservacion());
lProperties.put("DocServ:intTipodocId", intTipoDocumento);
lProperties.put("DocServ:strTipoDoc", strTipoDocumento);

El aspecto y la definicion de las propiedades ya estan credas , pero la asignacion del aspecto y delas propiedades se harian al subir el documento a alfresco via cmis.
Que estoy haciendo mal ?

1 Solution

Accepted Solutions
angelborroy
Alfresco Employee

Re: No asigna valores a las propiedades personalizadas

Jump to solution

Lo he probado y definitivamente esto funciona. Lo único que veo es que no has definido un Layout con el Gestor de Modelos para que muestre los campos en la aplicación web Share, por lo que he utilizado el Navegador de Nodos para verificar los resultados.

Te pongo debajo el código fuente que he utilizado por si te sirve de ayuda.

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.chemistry.opencmis.client.api.Document;
import org.apache.chemistry.opencmis.client.api.Folder;
import org.apache.chemistry.opencmis.client.api.Repository;
import org.apache.chemistry.opencmis.client.api.Session;
import org.apache.chemistry.opencmis.client.api.SessionFactory;
import org.apache.chemistry.opencmis.client.runtime.SessionFactoryImpl;
import org.apache.chemistry.opencmis.commons.PropertyIds;
import org.apache.chemistry.opencmis.commons.SessionParameter;
import org.apache.chemistry.opencmis.commons.data.ContentStream;
import org.apache.chemistry.opencmis.commons.enums.BindingType;
import org.apache.chemistry.opencmis.commons.enums.VersioningState;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.ContentStreamImpl;

public class App {
     
     public static void main(String... args) throws Exception {
          
          SessionFactory sessionFactory = SessionFactoryImpl.newInstance();

          Map<String, String> parameters = new HashMap<String, String>();

          // Se utilizan las credenciales admin/admin
          parameters.put(SessionParameter.USER, "admin");
          parameters.put(SessionParameter.PASSWORD, "admin");

          // Se utiliza protocolo BROWSER en el servidor alfresco "localhost:8080"
          // Aunque también podría utilizarse ATOM
          parameters.put(SessionParameter.BROWSER_URL,
           "http://localhost:8080/alfresco/api/" +
           "-default-/public/cmis/versions/1.1/browser");
          parameters.put(SessionParameter.BINDING_TYPE, BindingType.BROWSER.value());

          // Se ajustan estos parámetros para un mejor rendimiento
          parameters.put(SessionParameter.COMPRESSION, "true");
          parameters.put(SessionParameter.CACHE_TTL_OBJECTS, "0");

          // Se obtiene el repositorio de Alfresco (por defecto solo hay 1, así que se coge el primero)
          Repository repository = sessionFactory.getRepositories(parameters).get(0);

          // Se obtiene una sesión
          Session session = repository.createSession();
          
          // Se crean las propiedades básicas del tipo
          Map<String, Object> properties = new HashMap<String, Object>();
          properties.put(PropertyIds.OBJECT_TYPE_ID, "cmis:document");
          properties.put(PropertyIds.NAME, "myNewDocument.txt");

          // Se asigna la lista de aspectos y sus propiedades
          // Los aspectos son almacenados en una lista!
          List<Object> aspects = new ArrayList<Object>();
          aspects.add("P:ds:aspectoDocumentoServicio");
          properties.put(PropertyIds.SECONDARY_OBJECT_TYPE_IDS, aspects);
          properties.put("ds:strTipoDocumento", "strTipoDocumento");
          properties.put("ds:intServicioId", 1);
          properties.put("ds:strNombreCliente", "strNombreCliente");
          properties.put("ds:strNombreServicio", "strNombreServicio");
          properties.put("ds:intTipoDocumentoId", 1);

          // Se crea el fichero contenido
          byte[] content = "Hello World!".getBytes();
          InputStream stream = new ByteArrayInputStream(content);
          ContentStream contentStream =
           new ContentStreamImpl("myNewDocument.txt", BigInteger.valueOf(content.length), "text/plain", stream);

          // Se crea el documento
          Folder parent = (Folder) session.getObjectByPath("/Shared");
          Document doc = parent.createDocument(properties, contentStream, VersioningState.MAJOR);
          
     }

}
Hyland Developer Evangelist

View solution in original post

11 Replies
angelborroy
Alfresco Employee

Re: No asigna valores a las propiedades personalizadas

Jump to solution

Cuando se utiliza CMIS 1.1, solo es necesario añadir la siguiente dependencia en el fichero pom.xml

<dependency>
<groupId>org.apache.chemistry.opencmis</groupId>
<artifactId>chemistry-opencmis-client-impl
</artifactId>
<version>1.1.0</version>
</dependency>

Para obtener una sesión de conexión, puedes realizar un código parecido al siguiente en tu clase Java

SessionFactory sessionFactory = SessionFactoryImpl.newInstance();

Map<String, String> parameters = new HashMap<String, String>();

// Se utilizan las credenciales admin/admin
parameters.put(SessionParameter.USER, "admin");
parameters.put(SessionParameter.PASSWORD, "admin");

// Se utiliza protocolo BROWSER en el servidor alfresco "localhost:8080"
// Aunque también podría utilizarse ATOM
parameters.put(SessionParameter.BROWSER_URL,
"http://localhost:8080/alfresco/api/" +
"-default-/public/cmis/versions/1.1/browser");
parameters.put(SessionParameter.BINDING_TYPE, BindingType.BROWSER.value());

// Se ajustan estos parámetros para un mejor rendimiento
parameters.put(SessionParameter.COMPRESSION, "true");
parameters.put(SessionParameter.CACHE_TTL_OBJECTS, "0");

// Se obtiene el repositorio de Alfresco (por defecto solo hay 1, así que se coge el primero)
Repository repository = sessionFactory.getRepositories(parameters).get(0);

// Se obtiene una sesión
Session session = repository.createSession();‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

Una vez que has obtenido la sesión, puedes crear un nuevo documento y asociarle las propiedades de tipo (cmis:document en el ejemplo) y aspecto (cm:titled en el ejemplo).

// Se crean las propiedades básicas del tipo
Map<String, Object> properties = new HashMap<String, Object>();
properties.put(PropertyIds.OBJECT_TYPE_ID, "cmis:document");
properties.put(PropertyIds.NAME, "myNewDocument.txt");

// Se asigna la lista de aspectos y sus propiedades
// Los aspectos son almacenados en una lista!
List<Object> aspects = new ArrayList<Object>();
aspects.add("P:cm:titled");
properties.put(PropertyIds.SECONDARY_OBJECT_TYPE_IDS, aspects);
properties.put("cm:description", "My description");
properties.put("cm:title", "My title");

// Se crea el fichero contenido
byte[] content = "Hello World!".getBytes();
InputStream stream = new ByteArrayInputStream(content);
ContentStream contentStream =
new ContentStreamImpl(name, BigInteger.valueOf(content.length),
"text/plain", stream);

// Se crea el documento
Document doc =
parent.createDocument(properties, contentStream, VersioningState.MAJOR);

Aunque el tipo y aspecto empleado en el código de arriba es proporcionado por Alfresco por defecto, funciona igual con tipos y aspectos propios.

Hyland Developer Evangelist
adyp
Active Member

Re: No asigna valores a las propiedades personalizadas

Jump to solution

Al modificar mi código queda de esta manera : 

Map<String, Object> lProperties = new HashMap<String, Object>();

Integer intTipoDocumento = objDocumentoServicio.getIntTipoDocumento();
String strTipoDocumento = objDocumentoServicio.getStrTipoDocumento() ;

//ASIGNACION DE PROPIEDADES
lProperties.put(PropertyIds.NAME, name);

List<Object> aspects = new ArrayList<Object>();
aspects.add("PSmiley Very HappyocServ:AspectDocServicio");
lProperties.put(PropertyIds.OBJECT_TYPE_ID, "cmis:document");

lProperties.put(PropertyIds.SECONDARY_OBJECT_TYPE_IDS, aspects);
lProperties.put(PropertyIds.DESCRIPTION , objDocumentoServicio.getStrObservacion());
lProperties.put("DocServ:intTipodocId", intTipoDocumento);
lProperties.put("DocServ:strTipoDoc", strTipoDocumento);

Donde, estos son mis servicios en share

alfresco share

Y me devuelve el siguiente error :

java.lang.IllegalArgumentException:  Property 'DocServ:intTipodocId' is neither an object type property nor an aspect property!

Si elimino las siguientes lineas :

lProperties.put("DocServ:intTipodocId", intTipoDocumento);
lProperties.put("DocServ:strTipoDoc", strTipoDocumento);

sube el archivo pero desde workbench veo que no se agrega el apecto

Al inicio de esta pregunta este era mi workbench (si agregaba el aspecto y las propiedades pero no seteaba las propiedades

angelborroy
Alfresco Employee

Re: No asigna valores a las propiedades personalizadas

Jump to solution

Entiendo que lo que dice el mensaje no es cierto, ¿no?

AspectDocServicio es un aspecto y no un tipo, ¿verdad?

¿Puedes subir el ZIP que genera el Gestor de Modelos para ese modelo?

Hyland Developer Evangelist
adyp
Active Member

Re: No asigna valores a las propiedades personalizadas

Jump to solution

El mensaje es lo que java arroja al crear un documento luego de modificar  el código.

AspectDocServicio  es un aspecto.

Le adjunto mi   zip Gestor de Modelos.

Muchas gracias .

angelborroy
Alfresco Employee

Re: No asigna valores a las propiedades personalizadas

Jump to solution

¿Cómo has podido definir este modelo con el Gestor de Modelos?

La dependencia con el espacio de nombres de Google Docs (gd2) no puede ser especificada desde el interfaz web...

Yo diría que no es un problema de CMIS, sino de que tienes algún otro modelo desplegado en el repositorio que está colisionando con éste que has subido.

Hyland Developer Evangelist
adyp
Active Member

Re: No asigna valores a las propiedades personalizadas

Jump to solution

Cree el aspecto de acuerdo a este link https://docs.alfresco.com/5.2/tasks/admintools-custom-type-create.html 

y la parte de Google Docs (gd2)  la agregue por aca, 

solo tengo un aspecto y un tipo (que no uso y no tiene propiedades).

He creado un nuevo  aspecto eligiendo ninguno en la opcion de "Aspecto padre" de la imagen de arriba pero los  resultados son los mismos, seguiré buscando el problema, muchas gracias.

angelborroy
Alfresco Employee

Re: No asigna valores a las propiedades personalizadas

Jump to solution

Debe ser algo sencillo, aunque ahora no lo veo.

He creado muchos tipos y aspectos personalizados y los he gestionado sin problemas con CMIS.

Si después tengo un rato, importo el ZIP y lo pruebo a ver si encuentro algo.

Hyland Developer Evangelist
adyp
Active Member

Re: No asigna valores a las propiedades personalizadas

Jump to solution

Muchas gracias, he borrado los aspectos y el modelo y he creado otro nuevamente , es este

MODELO ZIP , 

el resultado es el mismo. agrega las propiedades al documento pero no setea los valores.

angelborroy
Alfresco Employee

Re: No asigna valores a las propiedades personalizadas

Jump to solution

Lo he probado y definitivamente esto funciona. Lo único que veo es que no has definido un Layout con el Gestor de Modelos para que muestre los campos en la aplicación web Share, por lo que he utilizado el Navegador de Nodos para verificar los resultados.

Te pongo debajo el código fuente que he utilizado por si te sirve de ayuda.

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.chemistry.opencmis.client.api.Document;
import org.apache.chemistry.opencmis.client.api.Folder;
import org.apache.chemistry.opencmis.client.api.Repository;
import org.apache.chemistry.opencmis.client.api.Session;
import org.apache.chemistry.opencmis.client.api.SessionFactory;
import org.apache.chemistry.opencmis.client.runtime.SessionFactoryImpl;
import org.apache.chemistry.opencmis.commons.PropertyIds;
import org.apache.chemistry.opencmis.commons.SessionParameter;
import org.apache.chemistry.opencmis.commons.data.ContentStream;
import org.apache.chemistry.opencmis.commons.enums.BindingType;
import org.apache.chemistry.opencmis.commons.enums.VersioningState;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.ContentStreamImpl;

public class App {
     
     public static void main(String... args) throws Exception {
          
          SessionFactory sessionFactory = SessionFactoryImpl.newInstance();

          Map<String, String> parameters = new HashMap<String, String>();

          // Se utilizan las credenciales admin/admin
          parameters.put(SessionParameter.USER, "admin");
          parameters.put(SessionParameter.PASSWORD, "admin");

          // Se utiliza protocolo BROWSER en el servidor alfresco "localhost:8080"
          // Aunque también podría utilizarse ATOM
          parameters.put(SessionParameter.BROWSER_URL,
           "http://localhost:8080/alfresco/api/" +
           "-default-/public/cmis/versions/1.1/browser");
          parameters.put(SessionParameter.BINDING_TYPE, BindingType.BROWSER.value());

          // Se ajustan estos parámetros para un mejor rendimiento
          parameters.put(SessionParameter.COMPRESSION, "true");
          parameters.put(SessionParameter.CACHE_TTL_OBJECTS, "0");

          // Se obtiene el repositorio de Alfresco (por defecto solo hay 1, así que se coge el primero)
          Repository repository = sessionFactory.getRepositories(parameters).get(0);

          // Se obtiene una sesión
          Session session = repository.createSession();
          
          // Se crean las propiedades básicas del tipo
          Map<String, Object> properties = new HashMap<String, Object>();
          properties.put(PropertyIds.OBJECT_TYPE_ID, "cmis:document");
          properties.put(PropertyIds.NAME, "myNewDocument.txt");

          // Se asigna la lista de aspectos y sus propiedades
          // Los aspectos son almacenados en una lista!
          List<Object> aspects = new ArrayList<Object>();
          aspects.add("P:ds:aspectoDocumentoServicio");
          properties.put(PropertyIds.SECONDARY_OBJECT_TYPE_IDS, aspects);
          properties.put("ds:strTipoDocumento", "strTipoDocumento");
          properties.put("ds:intServicioId", 1);
          properties.put("ds:strNombreCliente", "strNombreCliente");
          properties.put("ds:strNombreServicio", "strNombreServicio");
          properties.put("ds:intTipoDocumentoId", 1);

          // Se crea el fichero contenido
          byte[] content = "Hello World!".getBytes();
          InputStream stream = new ByteArrayInputStream(content);
          ContentStream contentStream =
           new ContentStreamImpl("myNewDocument.txt", BigInteger.valueOf(content.length), "text/plain", stream);

          // Se crea el documento
          Folder parent = (Folder) session.getObjectByPath("/Shared");
          Document doc = parent.createDocument(properties, contentStream, VersioningState.MAJOR);
          
     }

}
Hyland Developer Evangelist