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,PocServ: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 ?
Solved! Go 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);
}
}
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.
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("PocServ: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
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
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?
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 .
¿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.
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.
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.
Muchas gracias, he borrado los aspectos y el modelo y he creado otro nuevamente , es este
el resultado es el mismo. agrega las propiedades al documento pero no setea los valores.
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);
}
}
Discussions about Alfresco Content Services and Alfresco Process Services in Spanish
Related:
By using this site, you are agreeing to allow us to collect and use cookies as outlined in Alfresco’s Cookie Statement and Terms of Use (and you have a legitimate interest in Alfresco and our products, authorizing us to contact you in such methods). If you are not ok with these terms, please do not use this website.