Copias mediante CMIS

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

Copias mediante CMIS

Hola,

estoy realizando copias de documentos mediante cmis y aparentemente funciona todo bien, el documento copia se crea correctamente con sus aspectos y metadatos correspondientes.
Analizando los nodos copia he detectado 2 problemas:
* Para el nodo copia se genera un nuevo fichero binario en el contentstore. En cambio cuando se hace una copia desde Alfresco Share la copia comparte el mismo binario que el original.
* El nodo copia no tiene ninguna asociación con el original y este último tampoco tiene asociación con la copia. En cambio desde Alfresco Share si se mantienen asociaciones entre copia y original.

Alguien se ha encontrado con este mismo problema? el caso que más me interesa resolver es el de la duplicidad de los ficheros binarios ya que en mi aplicación utilizo mucho las copias de documentos y esto puede acarrear un crecimiento innecesario del contentstore.

Os adjunto el código de la función que estoy utilizando:


public CopyToFile copyDocuments(List<String> originNodeRefs, String targetNodeRef, VersioningState versioningState) {
       CopyToFile result = new CopyToFile();
       Map<String, Object> properties = new HashMap<>();
       List<String> listCopiesNodes = new ArrayList<String>();
       SimpleDateFormat sdf = new SimpleDateFormat(DateUtil.DDMMYYYYHHMMSS);
       String modified = "";
      
       Session session = getSession();
       ObjectId targetObj = session.createObjectId(targetNodeRef);
      
       Iterator<String> it = originNodeRefs.iterator();
      
       while (it.hasNext()) {
      String originNodeRef = (String) it.next();
      AlfrescoDocument originAlfDoc = (AlfrescoDocument) getObject(originNodeRef);

      properties.put(PropertyIds.NAME, originCmisDoc.getName());
      Iterator<ObjectType> aspects = originAlfDoc.getAspects().iterator();
      String aspectIds = "";
      while (aspects.hasNext()) {
              aspectIds += ',';
              aspectIds += aspects.next().getId();
      }
      properties.put(PropertyIds.OBJECT_TYPE_ID, originAlfDoc.getBaseTypeId().value() + aspectIds);

      
      Document targetDoc = originAlfDoc.copy(targetObj, properties, versioningState, null, null, null, session.createOperationContext());
      listCopiesNodes.add(targetDoc.getId());
      modified = sdf.format(targetDoc.getLastModificationDate().getTime());
       }
      
       result.setListCopiesNodes(listCopiesNodes);
       result.setModified(modified);
      
       return result;
}



Gracias,
RAUL
6 Replies
Highlighted
Alfresco Employee

Re: Copias mediante CMIS

Creo que desde CMIS no vas a poder resolverlo, por definición la operación <CODE>copy</CODE> crea una copia independiente en una carpeta diferente.

Lo único que se me ocurre es que implementes un behaviour sobre <CODE>org.alfresco.repo.copy.CopyServicePolicies</CODE> y realices allí las asociaciones necesarias para que no replique el binario.
Software Engineer in Alfresco Search Team.
Highlighted
Active Member II

Re: Copias mediante CMIS

Hola Angel,

he implentado un behaviour sobre org.alfresco.repo.copy.CopyServicePolicies pero curiosamente cuando se hace una copia por CMIS no se llama a ninguna de sus funciones (getCopyCallback, onCopyComplete, beforeCopy).
Mirando el codigo fuente he visto que CMIS cuando se utiliza atompub binding acaba ejecutando un createDocument, parece ser que no está soportada la copia, en este código lo puedes ver:

<java>
public String createDocumentFromSource(String repositoryId, String sourceId, Properties properties,
            String folderId, VersioningState versioningState, List<String> policies, Acl addACEs, Acl removeACEs,
            ExtensionsData extension) {
        throw new CmisNotSupportedException("createDocumentFromSource is not supported by the AtomPub binding!");
}
</java>

La excepción se captura y se llama a otra función que al final acaba realizando un createDocument.
He implementado un behavior org.alfresco.repo.node.NodeServicePolicies pero cuando la ejecución entra en la función onCreateNode() el binario ya está creado…
¿Alguien sabe donde se controla si ha de generarse un nuevo binario? y en función de que criterio?

Gracias
Highlighted
Alfresco Employee

Re: Copias mediante CMIS

Cuando lo realizas desde Alfresco, se invoca desde el webscript <CODE>copy-to.post.json.js</CODE>, que utiliza <CODE>org.alfresco.repo.jscript.ScriptNode.java</CODE> y a su vez <CODE>org.alfresco.repo.copy.CopyServiceImpl</CODE>. Este servicio es el que controla la asignación del aspecto de Copia y la replicación de los metadatos.

Entiendo que si quieres utilizar este comportamiento de copia en tu código de integración deberás realizar esta invocación a través de la API WebScript en vez de a través de la API CMIS.
Software Engineer in Alfresco Search Team.
Highlighted
Active Member II

Re: Copias mediante CMIS

Gracias Angel,

creo que desistiré de CMIS para la copia de documentos… he implementado behaviors de copia y creación de nodos pero no hay forma de indicarle a Alfresco que se trata de una copia en lugar de la creación de un nuevo documento.


Saludos,
RAUL
Highlighted
Alfresco Employee

Re: Copias mediante CMIS

Échale un vistazo a esto https://github.com/skomarica/alfresco-share-create-link

Puede ayudarte a entender cómo funciona el mecanismo de copia.
Software Engineer in Alfresco Search Team.
Active Member II

Re: Copias mediante CMIS

Gracias Angel,

muy interesante el add-on. Finalmente he encontrado la forma de solucionar el problema, la clave está en el multifilling (soportado tanto por Alfresco como por CMIS). Esta funcionalidad lo que permite es tener documentos con diferentes padres, por lo tanto, se puede acceder a un documento desde diferentes carpetas teniendo un único binario. Al final esto funcionalmente es como si fuera un link…

Para añadir un documento a una nueva carpeta se haría así:

cmisDocument.addToFolder(cmisTargetObj, false);


Para eliminar el documento de la carpeta se haría así:

cmisDocument.removeFromFolder(cmisTargetObj);


Para más detalles aquí os dejo algunos enlaces interesantes:
http://wiki.alfresco.com/wiki/CMIS#Multi-Filing_Services
http://docs.oasis-open.org/cmis/CMIS/v1.1/os/CMIS-v1.1-os.html#x1-3050005
https://forums.alfresco.com/forum/developer-discussions/alfresco-api/cmis-and-addobjecttofolder-1214...