AnsweredAssumed Answered

Impossibile cancellare Documenti con Associazioni

Question asked by vizziello on Mar 4, 2016
Latest reply on Mar 21, 2016 by vizziello
Salve,

sono diversi giorni che sto cercando di venire a capo di un problema legato alla presenza di associazioni tra documenti.

In sostanza ho definito un tipo custom nel mio model:
<blockcode>
        <type name="rassleg:base_type">
            <title>Rassegna Legale</title>
            <parent>cm:content</parent>
            <mandatory-aspects>
      <aspect>cm:generalclassifiable</aspect>
      <aspect>rassleg:asp_base</aspect>
      <aspect>cm:countable</aspect>
      <aspect>rassleg:arg_corr</aspect>
      <aspect>rassleg:doc_corr</aspect>
       </mandatory-aspects>
        </type>
</blockcode>

A cui ho aggiunto una serie di aspect, tra cui uno utile per gestire le associazioni tra documenti:
<blockcode>
     <aspect name="rassleg:doc_corr">
         <title>Documenti correlati</title>
         <associations>
             <association name="rassleg:relatedDocuments">
                 <title>Documenti correlati</title>
                 <source>
                     <mandatory>false</mandatory>
                     <many>true</many>
                 </source>
                 <target>
                     <class>rassleg:base_type</class>
                     <mandatory>false</mandatory>
                     <many>true</many>
                 </target>
             </association>
         </associations>
      </aspect>
</blockcode>

Il problema nasce nel momento in cui tento di cancellare un documento su cui erano definite delle associazioni.
Per poter riuscire a cancellare il documento, devo prima cancellare manualmente le associazioni, altrimenti risulta impossibile cancellare il documento.

Nel log viene visualizzato il seguente messaggio d'errore:
<blockcode>
….
2016-03-04 16:24:12,696 ERROR [org.springframework.extensions.webscripts.AbstractRuntime] [http-bio-8080-exec-4] Exception from executeScript - redirecting to status template error: Node does not exist: workspace://SpacesStore/c7d27db7-c2a2-46eb-8df7-52c882ee7a44 (status:Status[id=1497changeTxnId=dd320ecf-a3f3-482d-a46c-aa91d34f3505, dbTxnId=425, deleted=true])
org.alfresco.service.cmr.repository.InvalidNodeRefException: Node does not exist: workspace://SpacesStore/c7d27db7-c2a2-46eb-8df7-52c882ee7a44 (status:Status[id=1497changeTxnId=dd320ecf-a3f3-482d-a46c-aa91d34f3505, dbTxnId=425, deleted=true])
   at org.alfresco.repo.node.db.DbNodeServiceImpl.getNodePairNotNull(DbNodeServiceImpl.java:182)
   at org.alfresco.repo.node.db.DbNodeServiceImpl.getType(DbNodeServiceImpl.java:706)
   at sun.reflect.GeneratedMethodAccessor239.invoke(Unknown Source)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
   at java.lang.reflect.Method.invoke(Method.java:483)
        ….
</blockcode>

Chiaramente il nodo c7d27db7-c2a2-46eb-8df7-52c882ee7a44 esiste, in quanto si tratta del documento che sto cercando di eliminare.

Per cercare di aggirare il problema, ho anche tantato di definire un behaviour sulla cancellazione dei nodi, per cercare di forzare la cancellazione delle associazioni:
<blockcode>
public class RuleTriggerBidirectionalAssoc extends RuleTriggerAbstractBase
      implements NodeServicePolicies.BeforeDeleteNodePolicy{
   
    Log log = LogFactory.getLog(RuleTriggerBidirectionalAssoc.class);

    …..
   
    @Override
    public void beforeDeleteNode(NodeRef node) {

   try {
      
      QName assocName = QName.createQName(RassegnaLegaleModel.NAMESPACE_RASSEGNA_LEGALE,
               RassegnaLegaleModel.ASSOC_RELATED_DOC);
      
      List<AssociationRef> relatedDoc = nodeService.getTargetAssocs(node, assocName);
         
      for (AssociationRef associationRef : relatedDoc) {
      NodeRef target = associationRef.getTargetRef();
      nodeService.removeAssociation(node, target, assocName);
      }
            
   } catch(Exception e) {
      e.printStackTrace();
   }

    }

    public void registerRuleTrigger() {
   log.info("Called registerRuleTrigger");
      
        …..
 
   this.policyComponent.bindClassBehaviour(
         QName.createQName(NamespaceService.ALFRESCO_URI,"beforeDeleteNode"),
         ContentModel.TYPE_CONTENT,
         new JavaBehaviour(this,"beforeDeleteNode",NotificationFrequency.FIRST_EVENT)
      );
      
    }

}
</blockcode>

L'operazione anche in questo caso non va a buon fine, in quanto la chiamata al metodo removeAssociation va in eccezione con il seguente messaggio:

java.lang.IllegalStateException: Operation not allowed against node pending deletion.  Check the node for aspect {http://www.alfresco.org/model/system/1.0}pendingDelete


Qualcuno può darmi una mano con questo problema?

Grazie di cuore a tutti,
Giuseppe.

Outcomes