Impossibile cancellare Documenti con Associazioni

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

Impossibile cancellare Documenti con Associazioni

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 (statusSmiley Frustratedtatus[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 (statusSmiley Frustratedtatus[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.
4 Replies
openpj
Moderator
Moderator

Re: Impossibile cancellare Documenti con Associazioni

Tipicamente nell'utilizzo delle peer association non c'è alcun vincolo nella cancellazione.

Di solito questi problemi si palesano con le child-association dove avviene invece la rimozione in cascata.

Vedo però che sullo stesso type hai diversi aspect cosa altro hai dichiarato?
Quali altri behavior hai implementato?

A mira di naso mi sembra più un problema dovuto alle eventuali operazioni implementate a livello di behavior.
vizziello
Member II

Re: Impossibile cancellare Documenti con Associazioni

Grazie mille per la tua risposta!

I vari aspect sono utilizzati per lo più per aggiungere delle properties al tipo di base.

Gli unici due particolari sono "rassleg:arg_corr" e "rassleg:doc_corr". Il primo mi serve per agganciare l'aspect cm:taggable ed il secondo per gestire le associazioni:

      <aspect name="rassleg:arg_corr">
         <title>Argomenti correlati</title>
         <mandatory-aspects>
         <aspect>cm:taggable</aspect>
      </mandatory-aspects>
      </aspect>
      
      <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>


Per quanto riguarda i behavior, ne ho implementati solo due legati alla gestione delle associazioni bi-direzionali.
Il mio intento è infatti quello di collegare i documenti in modo bi-direzionale, per cui alla creazione di un associazione creo anche quella inversa.

Questo è il codice completo della classe ( Ho rimosso il metodo beforeDeleteNode e la relativa registrazione visto che non funzionavano ):





public class RuleTriggerBidirectionalAssoc extends RuleTriggerAbstractBase
      implements NodeServicePolicies.OnDeleteAssociationPolicy,
      NodeServicePolicies.OnCreateAssociationPolicy {
   
    Log log = LogFactory.getLog(RuleTriggerBidirectionalAssoc.class);

   public void onDeleteAssociation(AssociationRef nodeAssocRef) {
      log.info("Called onDeleteAssociation");
      nodeService.removeAssociation(nodeAssocRef.getTargetRef(),
            nodeAssocRef.getSourceRef(),
            nodeAssocRef.getTypeQName());
   }

   public void onCreateAssociation(AssociationRef nodeAssocRef) {
      log.info("Called onCreateAssociation");
      nodeService.createAssociation(nodeAssocRef.getTargetRef(),
            nodeAssocRef.getSourceRef(),
            nodeAssocRef.getTypeQName());
   }

   public void registerRuleTrigger() {
      log.info("Called registerRuleTrigger");
      this.policyComponent.bindAssociationBehaviour(QName.createQName(
            NamespaceService.ALFRESCO_URI, "onCreateAssociation"), this,
            new JavaBehaviour(this, "onCreateAssociation"));

      this.policyComponent.bindAssociationBehaviour(QName.createQName(
            NamespaceService.ALFRESCO_URI, "onDeleteAssociation"), this,
            new JavaBehaviour(this, "onDeleteAssociation"));

   }

}


La creazione delle associazioni funziona senza problemi, cosi come la cancellazione.
I problemi nascono nel momento in cui devo cancellare un documento a cui erano agganciate delle associazioni. Come dicevo, sono costretto a cancellare manualmente le associazioni per poter successivamente cancellare il documento.

Ringrazio in anticipo chiunque possa darmi una mano!
Giuseppe.
openpj
Moderator
Moderator

Re: Impossibile cancellare Documenti con Associazioni

<blockquote>Per quanto riguarda i behavior, ne ho implementati solo due legati alla gestione delle associazioni bi-direzionali.
Il mio intento è infatti quello di collegare i documenti in modo bi-direzionale, per cui alla creazione di un associazione creo anche quella inversa.</blockquote>
Forse ho capito male, ma considera che le associazioni sono tutte bidirezionali non serve fare questo.

Sia le associazioni peer che quelle child sono navigabili da entrambe le direzioni.
Siano esse da padre a figlio, figlio a padre (child), oppure associante verso associato oppure associato verso associante (peer).
vizziello
Member II

Re: Impossibile cancellare Documenti con Associazioni

In realtà ho dovuto implementare quel discorso per far si che all'interno della pagina di dettaglio del documento, mi venga mostrata l'associazione anche nel documento "child".
Diversamente, visualizzo l'associazione solo nella pagina di dettaglio del documento "padre".

Se collego "A" con "B", voglio visualizzare l'associazione anche quando visualizzo il documento "B".

Chiramente utilizzo Alfresco Share come front-end.

Questo è il blocco di codice che ho inserito nel file share-config.xml per visualizzare e modificare le associazioni:


       <config evaluator="aspect" condition="rassleg:doc_corr">
       <forms>
           <form>
               <field-visibility>
                   <show id="rassleg:relatedDocuments" />
               </field-visibility>
               <appearance>                   
               <field id="rassleg:relatedDocuments" label-id="label.avvproj-rassleg-relatedDocuments">
                  <control template="/com/avvproj/components/form/controls/association.ftl">
                     <control-param name="displayMode">items</control-param>
                     <control-param name="showTargetLink">true</control-param>
                     <control-param name="allowNavigationToContentChildren">false</control-param>
                     <control-param name="startLocation">{doclib}</control-param>
                  </control>
               </field>
               </appearance>
           </form>
       </forms>
   </config>