AnsweredAssumed Answered

Custom Behavior isn't triggering

Question asked by fergusonna on Nov 11, 2015
Latest reply on Nov 13, 2015 by fergusonna
Hi, I'm trying to create a behavior that triggers everytime a piece of content enters in a custom folder type I've made. The Folder type simply extends the existing folder type and adds a property called expenseSum. I have a second content type defining an expenseReport, including a cost value. When a piece of content enters the folder, if the folder is of my custom type, it recalculates the expenseSum by getting all children of the folder, checking if they are expensereports, pulling the cost value, summing the value from all children, and then putting the calculated sum onto the folder properties.

I figured the best way to bind this behavior was to bind it to the onCreateChildAssociation and onDeleteChildAssociation policies, but nothing seems to activate the behavior. I have log statements that announce when each method starts, but the only one that is ever in the logs is that the init() method starts.

I've included the majority of the code, excluding setter methods and import/package information. If there is anything else needed, please just ask.


public class SumExpense implements OnCreateChildAssociationPolicy, OnDeleteChildAssociationPolicy{

   
   private NodeService nodeService;
   private PolicyComponent policyComponent;
   
   // Behaviours
    private Behaviour onCreateChildAssociation;
    private Behaviour onDeleteChildAssociation;
   
   private Logger logger = Logger.getLogger(SumExpense.class);
   
   public void init() {
      if (logger.isDebugEnabled()){
         logger.debug("Initializing SumExpense behavior");
      }
      
      //Create behaviours
      this.onCreateChildAssociation = new JavaBehaviour(this, "onCreateChildAssociation" , Behaviour.NotificationFrequency.TRANSACTION_COMMIT);
      this.onDeleteChildAssociation = new JavaBehaviour(this, "onDeleteChildAssociation" , Behaviour.NotificationFrequency.TRANSACTION_COMMIT);
      
      //Bind behaviours to node policies
      this.policyComponent.bindAssociationBehaviour(QName.createQName(NamespaceService.ALFRESCO_URI, "onCreateChildAssociation"),
            ContentModel.TYPE_CONTENT,
            this.onCreateChildAssociation);
      this.policyComponent.bindAssociationBehaviour(QName.createQName(NamespaceService.ALFRESCO_URI, "onDeleteChildAssociation"),
            ContentModel.TYPE_CONTENT,
            this.onDeleteChildAssociation);
   }
   
   @Override
   public void onCreateChildAssociation(ChildAssociationRef childAssocRef, boolean arg1) {
      if (logger.isDebugEnabled()){
         logger.debug("Inside onCreateChildAssociation");
      }
      computeSum(childAssocRef);
   }
   
   @Override
   public void onDeleteChildAssociation(ChildAssociationRef childAssocRef) {
      if (logger.isDebugEnabled()){
         logger.debug("Inside onDeleteChildAssociation");
      }
      computeSum(childAssocRef);
   }
            
   public void computeSum(ChildAssociationRef childAssocRef){
      if (logger.isDebugEnabled()){
         logger.debug("Inside computeSum");
      }
      
      //get the parent node
      NodeRef parentRef = childAssocRef.getParentRef();
      QName parentType = nodeService.getType(parentRef);
      
      QName expenseFolder = QName.createQName(MyCoBehaviorModel.NAMESPACE_MYCO_BEHAVIOR_MODEL, MyCoBehaviorModel.TYPE_MYB_EXPENSE_FOLDER);
      QName expenseReport = QName.createQName(MyCoModel.NAMESPACE_MYCO_CONTENT_MODEL, MyCoModel.TYPE_MY_EXPENSE_REPORT); 
      QName totalAmount = QName.createQName(MyCoModel.NAMESPACE_MYCO_CONTENT_MODEL, MyCoModel.PROP_MY_TOTAL_AMOUNT);
      QName expenseSum = QName.createQName(MyCoBehaviorModel.NAMESPACE_MYCO_BEHAVIOR_MODEL, MyCoBehaviorModel.PROP_MYB_EXPENSE_SUM);
      
      if (parentType.isMatch(parentType)){
         if (logger.isDebugEnabled()){
            logger.debug("Parent is an expense folder");
         }
         
         logger.debug("getting parent's children");
         
         List<ChildAssociationRef> children = nodeService.getChildAssocs(parentRef);
         
         Double expenseTotal = 0.0;
         logger.debug("expense sum: should be 0.0: " + expenseSum);
         
         if (children.size() == 0){
            if (logger.isDebugEnabled()){
               logger.debug("No children found.");
            }
         } else {
            if (logger.isDebugEnabled()){
               logger.debug("Children found.");
            }
            for (ChildAssociationRef child : children){
               logger.debug("In children loop");
               
               NodeRef childRef = child.getChildRef();
               QName childType = nodeService.getType(childRef);
               
               if (childType.isMatch(expenseReport)){
                  logger.debug("child is expense report");
                  Double expenseVal = (Double) nodeService.getProperty(childRef, totalAmount);
                  expenseTotal += expenseVal;
                  logger.debug("ExpenseSum: " + expenseTotal + " ExpenseVal: " + expenseVal);
               }
            }
            
            Map<QName, Serializable> parentProps = nodeService.getProperties(parentRef);
            parentProps.put(expenseSum, expenseTotal);
            
            nodeService.setProperties(parentRef, parentProps);
            
         }
         
         
      }
      
      return;
   }
      

Outcomes