Problema con categorías

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

Re: Problema con categorías

Al fin lo he podido solucionar, gracias a este post http://forums.alfresco.com/en/viewtopic.php?t=17144#p73578

El problema era que, al cambiar la categoría, el cm:name se modificaba, pero no el path de la categoría.
estaban de-sincronizados uno del otro.

He realizado un comportamiento (Behaviour) en JAVA, que lo que hace es esa sincronización, solo para las categorías.

os dejo el codigo bien puesto (el del post no me funcionaba si lo ponia tal cual) por si a alguien mas le ha pasado.

NameQNameSynchBehaviour.java
package com.behaviour;

import java.io.Serializable;
import java.util.Map;

import org.alfresco.model.ContentModel;
import org.alfresco.repo.node.NodeServicePolicies.OnMoveNodePolicy;
import org.alfresco.repo.node.NodeServicePolicies.OnUpdatePropertiesPolicy;
import org.alfresco.repo.policy.Behaviour;
import org.alfresco.repo.policy.Behaviour.NotificationFrequency;
import org.alfresco.repo.policy.JavaBehaviour;
import org.alfresco.repo.policy.PolicyComponent;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.service.namespace.QName;
import org.apache.log4j.Logger;

public class NameQNameSynchBehaviour implements OnUpdatePropertiesPolicy, OnMoveNodePolicy
{
   private Logger logger = Logger.getLogger(PolicyLogger.class);
   // Behaviours
   private Behaviour onUpdateProperties;
   private Behaviour onMoveNode;
   private NodeService nodeService;
   
   // Dependencies
   private PolicyComponent policyComponent;
   PocService pocService;

   void init()
   {
      pocService = new PocService();
      pocService.setNodeService(nodeService);
      if (logger.isDebugEnabled()) logger.debug("Initializing policy logger behaviour");
      // Create behaviours
      this.onUpdateProperties = new JavaBehaviour(this, "onUpdateProperties", NotificationFrequency.EVERY_EVENT);
      this.onMoveNode = new JavaBehaviour(this, "onMoveNode", NotificationFrequency.EVERY_EVENT);
      
//      // Bind behaviours to node policies
      this.policyComponent.bindClassBehaviour(QName.createQName(NamespaceService.ALFRESCO_URI, "onUpdateProperties"), ContentModel.TYPE_CATEGORY, this.onUpdateProperties);
      this.policyComponent.bindClassBehaviour(QName.createQName (NamespaceService.ALFRESCO_URI, "onMoveNode"), ContentModel.TYPE_CATEGORY, this.onMoveNode);
   }
   
   public void onUpdateProperties(NodeRef nodeRef, Map<QName, Serializable> before,Map<QName, Serializable> after)
   {
      logger.debug("onUpdateProperties: " + nodeRef);
      
       // name changes
       String  nameBefore  = (String) before.get(ContentModel.PROP_NAME);
       String  nameAfter   =  (String) after.get(ContentModel.PROP_NAME);
       boolean nameChanged = (nameBefore != null && nameBefore != nameAfter);
       if (nameChanged==true) {
         logger.debug("Poc name has changed – nameBefore: $nameBefore,  nameAfter: $nameAfter");
         ChildAssociationRef newChildRef = pocService.changePrimaryParent2ChildAssocQName(nodeRef, nameAfter);
         logger.debug("Poc qname has been synched: ${newChildRef.getQName()}");
       }
   }
   
   public void onMoveNode(ChildAssociationRef oldChildAssocRef, ChildAssociationRef newChildAssocRef)
   {
      logger.debug("onMoveNode - OLD: " + oldChildAssocRef + " - NEW: " + newChildAssocRef);
      // track qname changes (we can't do any more here)
      QName qnameBefore = oldChildAssocRef.getQName();
      QName qnameAfter  = newChildAssocRef.getQName();
      boolean qnameChanged = (!qnameBefore.equals(qnameAfter));
      if (qnameChanged==true) {
         logger.debug("Poc qname has changed – qnameBefore: $qnameBefore,  qnameAfter: $qnameAfter");
         // FIXME we can't backward-synch the cm:name, cause the qname may be a cutted version of a longer name
      }
   }
   
   public void setPolicyComponent(PolicyComponent policyComponent)
   {
      this.policyComponent = policyComponent;
   }
   
   public void setNodeService(NodeService nodeService)
   {
      this.nodeService = nodeService;
   }
}

PocService.java
package com.behaviour;

import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.namespace.QName;
import org.apache.log4j.Logger;

public class PocService {

  NodeService nodeService;
//   NodeService nodeService = serviceRegistry.getNodeService();
   private Logger logger = Logger.getLogger(PolicyLogger.class);

  public QName createNewChildAssocQName(ChildAssociationRef childAssoc, String newNameWithExt) {
    String localName = QName.createValidLocalName(newNameWithExt); // name will be croped to a maximum of 100 chars
    return QName.createQName(childAssoc.getQName().getNamespaceURI(), localName);
  }
 
  public ChildAssociationRef changePrimaryParent2ChildAssocQName(NodeRef node, String newNameWithExt) {
    return changeChildAssocQName(
          nodeService.getPrimaryParent(
                node),
          newNameWithExt);
  }
 
  public ChildAssociationRef changeChildAssocQName(ChildAssociationRef childAssoc, String newNameWithExt) {
    QName newAssocQName = createNewChildAssocQName(childAssoc, newNameWithExt);
    if (newAssocQName.equals(childAssoc.getQName())) {
      return childAssoc; // qname has not changed!
    }
    return nodeService.moveNode(
          childAssoc.getChildRef(), childAssoc.getParentRef(),
            childAssoc.getTypeQName(), newAssocQName);
  }
 
  public void setNodeService(NodeService nodeService) {
   this.nodeService = nodeService;
  }
}

behavior-context.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>
<beans>
   <bean id="nameQNameSynchBehaviour" class="com.behaviour.NameQNameSynchBehaviour" init-method="init">
      <property name="policyComponent">
         <ref bean="policyComponent" />
      </property>
      <property name="nodeService">
         <ref bean="nodeService" />
      </property>
   </bean>
</beans>
Highlighted
Intermediate

Re: Problema con categorías

Ostras de arte. Si es que el hecho de que no ocurriera en la 3.4 escamaba aún más.

Muchas gracias por poner la solución.

¡Un saludo!
Highlighted
Member II

Re: Problema con categorías

Creo que este error solo ocurre en versiones anteriores a la 3.4 y viene de ya hace tiempo, porque buscando cual era el problema y posibles soluciones encontré posts desde el 2007… así que este problema llevaba algo de tiempo por ahí.

Por suerte encontré el otro post, y entre el post y un libro de alfresco que explica los Behavoiur conseguí hacerlo funcionar.

Además esto me ha servido para adentrarme en programar en Java para alfresco, porque hasta ahora, todos los webscripts, reglas y demás las había echo en javascript porque no sabia ni por donde empezar con el java.

He matado 2 pájaros de 1 tiro Smiley Happy
Highlighted
Intermediate

Re: Problema con categorías

¿Libro para empezar con Java? Pues si crees que está bien comparte el titulo! Fijo que a más de uno le viene de perlas saberlo Smiley Very Happy
Highlighted
Member II

Re: Problema con categorías

El libro se llama Alfresco Developer Guide, de Jeff Pots.

Explican un poco de todo, desde cosas básicas, hasta cosas algo mas complicadas, lo explican tanto para java como javascript, crear modelos, reglas, …
La verdad, a mi me esta ayudando muchísimo, sobretodo para empezar a programar en alfresco.

Todo con ejemplos, y te pone el código que tienes que poner para que te funcione.
La única pega que le pongo es que a veces, para depende que cosas, las explica dando por echo de que sabrás donde o como tienes que poner las cosas, y no lo explica, tienes que buscarte la vida para saber donde ponerlas (por ejemplo donde has de poner los .class de java), aunque tampoco es que sea muy difícil de encontrar.

los capítulos del libro:

Capitulo 1: The Alfresco Platform
Capitulo 2: Getting Started with Alfresco
Capitulo 3: Working with Content Models
Capitulo 4: Handling Content Automatically with Actions, Behaviors, Transformers, and Extractors
Capitulo 5: Customizing the Web Client User Interface
Capitulo 6: Exposing Content through a RESTful API with Web Scripts
Capitulo 7: Advanced Workflow
Capitulo 8: Web Content Management
Capitulo 9: Security

el libro tiene algo mas de 500 paginas
Highlighted
Intermediate

Re: Problema con categorías

Ah! Sí que lo conozco, de hecho lo compré por amazon a bastante buen precio de segunda mano (por si a alguien le interesa). Pensaba que estabas siguiendo algún tutorial o algo así que ha hecho alguien "por amor al arte" (tu sabes que hay personas que tienen un don especial para transmitir cosas en guías o tutoriales hechos por ellos mismos  :mrgreen: ).

La verdad es que el guide tiene cosas muy muy buenas y otras que como no tengas unos conocimientos mínimos puede hacerse un poco costoso el entenderlo. A parte que no está actualizado para el Share :/ Pero bueno, poco a poco con un poco de allí de por aquí y por allá se van sacando cosillas Smiley Very Happy Smiley Very Happy

Muchas gracias por compartir esta info Smiley Wink

¡¡Un saludo!!