params = thumbnailRegistry.getThumbnailRenditionConvertor().convert(transformationOptions, assocDetails);
        // Add the other parameters given in this method signature.
        params.put(AbstractRenderingEngine.PARAM_SOURCE_CONTENT_PROPERTY, contentProperty);
        params.put(AbstractRenderingEngine.PARAM_MIME_TYPE, mimetype);
        // Set the parameters on the rendition definition.
        definition.addParameterValues(params);
        return definition;
    }
    private NodeRef createThumbnailNode(final NodeRef node, final QName contentProperty,
                final String mimetype, final TransformationOptions transformationOptions, final String thumbnailName,
                final ThumbnailParentAssociationDetails assocDetails)
    {
        // Get the name of the thumbnail and add to properties map
        QName thumbnailQName = getThumbnailQName(thumbnailName);
        RenditionDefinition definition = createRenditionDefinition(contentProperty, mimetype,
                    transformationOptions, thumbnailQName, assocDetails);
        try
        {
            ChildAssociationRef thumbnailAssoc = renditionService.render(node, definition);
            NodeRef thumbnail = getThumbnailNode(thumbnailAssoc);
            setThumbnailNameProperty(thumbnail, thumbnailName);
            return thumbnail;
        } catch (RenditionServiceException rsx)
        {
            throw new ThumbnailException(rsx.getMessage(), rsx);
        }
    }
    /**
     * Sets the thumbnail name if the rendition is of type cm:thumbnail.
     * @param thumbnail NodeRef
     * @param thumbnailName String
     */
    private void setThumbnailNameProperty(NodeRef thumbnail, String thumbnailName)
    {
        if (thumbnailName != null && thumbnailName.length() > 0)
        {
            if (ContentModel.TYPE_THUMBNAIL.equals(nodeService.getType(thumbnail)))
            {
                nodeService.setProperty(thumbnail, ContentModel.PROP_THUMBNAIL_NAME, thumbnailName);
            }
        }
    }
    
    /**
     * Updates the parent of the supplied {@link NodeRef} to ensure that it has the "cm:thumbnailModification" aspect
     * and sets the last modification data for it.
     * @param nodeRef A {@link NodeRef} representing a thumbnail to provide last modification data for.
     */
    @SuppressWarnings("unchecked")
    public void addThumbnailModificationData(NodeRef nodeRef, String thumbnailName)
    {
        if (nodeService.exists(nodeRef))
        {
           if (thumbnailName != null && !nodeRef.toString().endsWith(thumbnailName))
           {
               Date modified = (Date)nodeService.getProperty(nodeRef, ContentModel.PROP_MODIFIED);
               if (modified != null)
               {
                   // Get the last modified value as a timestamp...
                   Long timestamp = modified.getTime();
                   
                   // Create the value we want to set...
                   String lastModifiedValue = thumbnailName + ":" + timestamp;
                   
                   // Get the parent node (there should be only one) and apply the aspect and
                   // set the property to indicate which thumbnail the checksum refers to...
                   for (ChildAssociationRef parent: nodeService.getParentAssocs(nodeRef))
                   {
                      List thumbnailMods = null;
                       
                      NodeRef parentNode = parent.getParentRef();
                      if (nodeService.hasAspect(parentNode, ContentModel.ASPECT_THUMBNAIL_MODIFICATION))
                      {
                          // The node already has the aspect, check to see if the current thumbnail modification exists...
                          thumbnailMods = (List) nodeService.getProperty(parentNode, ContentModel.PROP_LAST_THUMBNAIL_MODIFICATION_DATA);
                          
                          // If we have previously set last modified thumbnail data then it will exist as part of the multi-value
                          // property. The value will consist of the "cm:thumbnailName" value delimited with a ":" and then the
                          // timestamp. We need to find the appropriate entry in the multivalue property and then update it
                          String target = null;
                          for (String currThumbnailMod: thumbnailMods)
                          {
                              if (currThumbnailMod.startsWith(thumbnailName))
                              {
                                  target = currThumbnailMod;
                              }
                          }
                          
                          // Remove the previous value
                          if (target != null)
                          {
                              thumbnailMods.remove(target);
                          }
                          
                          // Add the timestamp...
                          thumbnailMods.add(lastModifiedValue);
                          
                          // Set the property...
                          
                          ruleService.disableRuleType(RuleType.UPDATE);
                          try
                          {
                              nodeService.setProperty(parentNode, ContentModel.PROP_LAST_THUMBNAIL_MODIFICATION_DATA, (Serializable) thumbnailMods);
                          }
                          finally
                          {
                              ruleService.enableRuleType(RuleType.UPDATE);
                          }
                      }
                      else
                      {
                          // If the aspect has not previously been added then we'll need to set it now...
                          thumbnailMods = new ArrayList();
                          thumbnailMods.add(lastModifiedValue);
                          
                          // Add the aspect with the new property...
                          Map properties = new HashMap();
                          properties.put(ContentModel.PROP_LAST_THUMBNAIL_MODIFICATION_DATA, (Serializable) thumbnailMods);
                          
                          ruleService.disableRuleType(RuleType.UPDATE);
                          try
                          {
                              nodeService.addAspect(parentNode, ContentModel.ASPECT_THUMBNAIL_MODIFICATION, properties);
                          }
                          finally
                          {
                              ruleService.enableRuleType(RuleType.UPDATE);
                          }
                      }
                   }
               }
           }
        }
    }
}