cancel
Showing results for 
Search instead for 
Did you mean: 

Assign aspect using custom rule

tophermiller
Champ in-the-making
Champ in-the-making
Hi,

I'm new to Alfresco.  My experience consists of 1-2 weeks plus the Boston Summit.   I've written some Apache Chemistry code to put my documents into Alfresco and it worked well.   Now I'm looking for some pointers on my next step.

What I want to do is implement a rule that essentially "reads" content whenever it is changed in a certain folder subtree, and then adds aspects and populates aspect properties based on what it sees inside the file.  The files are XML, so I'll use some Java DOM-based parser, and I'll be pulling attributes and elements out into the aspect properties so I can more easily search on them.

I'm quite sure this has been done by someone somewhere.   Any sample code or documentation out there to get me started?

Thanks in advance.
1 REPLY 1

kaynezhang
World-Class Innovator
World-Class Innovator
<code>

import java.io.Serializable;
import java.util.List;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.action.ParameterDefinitionImpl;
import org.alfresco.repo.action.executer.ActionExecuterAbstractBase;
import org.alfresco.service.cmr.action.Action;
import org.alfresco.service.cmr.action.ParameterDefinition;
import org.alfresco.service.cmr.dictionary.DataTypeDefinition;
import org.alfresco.service.cmr.repository.ContentReader;
import org.alfresco.service.cmr.repository.ContentService;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.namespace.QName;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class AddAspectActionExecuter extends ActionExecuterAbstractBase {
   private static Log logger = LogFactory
         .getLog(AddAspectActionExecuter.class);
   private NodeService nodeService;
    private ContentService contentService;
   public NodeService getNodeService() {
      return nodeService;
   }

   public void setNodeService(NodeService nodeService) {
      this.nodeService = nodeService;
   }

   public ContentService getContentService() {
      return contentService;
   }

   public void setContentService(ContentService contentService) {
      this.contentService = contentService;
   }

   public static final String NAME = "add-aspect-action";
   public static final String PARAM_CONTENT_PROPERTY = "content-property";

   @Override
   protected void executeImpl(Action action, NodeRef actionedUponNodeRef) {
      if (this.nodeService.exists(actionedUponNodeRef) == true) {
         // Get the content property
         QName contentProperty = (QName) action.getParameterValue(PARAM_CONTENT_PROPERTY);
         if (contentProperty == null) {
            contentProperty = ContentModel.PROP_CONTENT;
         }
         Serializable contentProp = nodeService.getProperty(actionedUponNodeRef, contentProperty);
         if (contentProp == null) {
            logger.info("null content");
            return;
         }

         ContentReader reader = contentService.getReader(actionedUponNodeRef, contentProperty);
         if (reader == null || reader.getMimetype() == null) {
            if (logger.isDebugEnabled()) {
               logger.debug("no content or mimetype - do nothing");
            }
            return;
         }
         //parse xml file and generate aspectProperties
         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
           dbf.setNamespaceAware(true);
           dbf.setValidating(false);
           DocumentBuilder db = dbf.newDocumentBuilder();
           Document document = db.parse(reader.getContentInputStream());
          
           Map<QName, Serializable> aspectProperties  = new HashMap<QName, Serializable>();
           //add aspect
           this.nodeService.addAspect(actionedUponNodeRef, aspectTypeQName, aspectProperties);
      }
   }

   @Override
   protected void addParameterDefinitions(List<ParameterDefinition> paramList) {
      paramList.add(new ParameterDefinitionImpl(PARAM_CONTENT_PROPERTY,
            DataTypeDefinition.QNAME, false,
            getParamDisplayLabel(PARAM_CONTENT_PROPERTY)));
   }
}
<code>