Fork me on GitHub

Mapping Examples

This library can be used in any environment where JCR and Hippo Repository API are available. However, just for simiplicty, the following examples are assumed to run in Hippo Updater Editor (a.k.a Groovy Updater).

WARNING: If you run the following demo scripts in production or in system having too many content, then it might cause a critical system overhead or problems. So, run the following demo scripts in a local test environment or change the XPath query to narrow the search result to a resonably small amount.

Mapping Documents

The following example groovy script iterates all the hippostd:publishable documents, maps each document to ContentNode, and finally marshal ContentNode object to JSON string to log in the logging pane.

Name: Export All Published Documents to JSON
Description: For demonstration purpose, this example groovy script (a) maps each live document variant node to ContentNode, (b) replace UUIDs of compound mirror link nodes by paths as an advanced example, and (c) logs a serialized string from the ContentNode.
XPath query: /jcr:root/content/documents//element(*,hippostd:publishable)[@hippostd:state='published']
Parameters:
Script >>>
package org.hippoecm.frontend.plugins.cms.admin.updater

import org.onehippo.repository.update.BaseNodeUpdateVisitor
import java.util.*
import javax.jcr.query.*
import org.apache.commons.lang.*
import org.onehippo.forge.content.pojo.common.jcr.*
import org.onehippo.forge.content.pojo.common.util.*
import org.onehippo.forge.content.pojo.mapper.*
import org.onehippo.forge.content.pojo.mapper.jcr.*
import org.onehippo.forge.content.pojo.mapper.jcr.hippo.*
import org.onehippo.forge.content.pojo.model.*
import com.fasterxml.jackson.databind.*

class UpdaterTemplate extends BaseNodeUpdateVisitor {

    def jcrSession
    def contentNodeMapper
    def mappingFilter
    def objectMapper

    void initialize(Session jcrSession) {
        this.jcrSession = jcrSession

        contentNodeMapper = new DefaultJcrContentNodeMapper();

        mappingFilter = new DefaultHippoJcrItemMappingFilter()
        mappingFilter.addPropertyPathExclude("hippostdpubwf:*")
        mappingFilter.addPropertyPathExclude("hippo:availability")
        mappingFilter.addPropertyPathExclude("hippo:paths")
        mappingFilter.addPropertyPathExclude("hippo:related")
        mappingFilter.addPropertyPathExclude("hippostd:holder")
        mappingFilter.addPropertyPathExclude("hippostd:state")
        mappingFilter.addPropertyPathExclude("hippostd:stateSummary")

        objectMapper = new ObjectMapper();
    }

    boolean doUpdate(Node node) {
        log.debug "Visiting node ${node.path}"
        def handleNode = node.getParent()

        // Mapping the document node to ContentNode
        def contentNode = contentNodeMapper.map(node, mappingFilter)
        def docbase

        // Just as an advanced example, let's find all the mirror link node and replace the UUIDs by paths.
        List<ContentNode> mirrors = contentNode.queryNodesByXPath("//nodes[properties[@itemName='hippo:docbase']]")
        for (ContentNode mirror : mirrors) {
            docbase = mirror.getProperty("hippo:docbase").getValue();

            try {
              mirror.setProperty("hippo:docbase", jcrSession.getNodeByIdentifier(docbase).getPath())
            } catch (e) {
            }
        }

        // Let's print out (serialize) the content node by simply using Jackson ObjectMapper for debugging purpose.
        StringWriter writer = new StringWriter(2048)
        objectMapper.writerWithDefaultPrettyPrinter().writeValue(writer, contentNode)
        log.debug "\n" + writer.toString() + "\n"

        return false
    }

    boolean undoUpdate(Node node) {
        throw new UnsupportedOperationException('Updater does not implement undoUpdate method')
    }

}
              

The script shown above will log JSON for each document like the following example (in case of Hippo Resource Bundle document):

{
  "name" : "examplemessages",
  "primaryType" : "resourcebundle:resourcebundle",
  "mixinTypes" : [ "mix:referenceable" ],
  "properties" : [ {
    "name" : "resourcebundle:descriptions",
    "type" : "STRING",
    "multiple" : true,
    "values" : [ "Example resource bundle document" ]
  }, {
    "name" : "resourcebundle:id",
    "type" : "STRING",
    "multiple" : false,
    "values" : [ "org.example.messages" ]
  }, {
    "name" : "hippotranslation:locale",
    "type" : "STRING",
    "multiple" : false,
    "values" : [ "document-type-locale" ]
  }, {
    "name" : "resourcebundle:messages",
    "type" : "STRING",
    "multiple" : true,
    "values" : [ "Example Header Message", "Example Footer Message" ]
  }, {
    "name" : "resourcebundle:keys",
    "type" : "STRING",
    "multiple" : true,
    "values" : [ "header.text", "footer.text" ]
  }, {
    "name" : "hippotranslation:id",
    "type" : "STRING",
    "multiple" : false,
    "values" : [ "e9703ff4-d522-4238-bf3b-6016f959e88c" ]
  } ],
  "nodes" : [ ]
}
        

Mapping Binary Content

The following example groovy script iterates all the hippogallery:imageset documents, maps each document to ContentNode, and finally marshal ContentNode object to JSON string to log in the logging pane.

Name: Export All Live Images to JSON
Description: For demonstration purpose, this example groovy script (a) maps each live gallery imageset node to ContentNode, and (b) logs a serialized string from the ContentNode.
XPath query: /jcr:root/content/gallery//element(*,hippogallery:imageset)[@hippo:availability='live']
Parameters:
Script >>>
package org.hippoecm.frontend.plugins.cms.admin.updater

import org.onehippo.repository.update.BaseNodeUpdateVisitor
import java.util.*
import javax.jcr.query.*
import org.apache.commons.lang.*
import org.onehippo.forge.content.pojo.common.jcr.*
import org.onehippo.forge.content.pojo.common.util.*
import org.onehippo.forge.content.pojo.mapper.*
import org.onehippo.forge.content.pojo.mapper.jcr.*
import org.onehippo.forge.content.pojo.mapper.jcr.hippo.*
import org.onehippo.forge.content.pojo.model.*
import com.fasterxml.jackson.databind.*

class UpdaterTemplate extends BaseNodeUpdateVisitor {

    def jcrSession
    def contentNodeMapper
    def mappingFilter
    def objectMapper

    void initialize(Session jcrSession) {
        this.jcrSession = jcrSession

        contentNodeMapper = new DefaultJcrContentNodeMapper();

        mappingFilter = new DefaultHippoJcrItemMappingFilter();
        mappingFilter.addPropertyPathExclude("hippo:availability");
        mappingFilter.addPropertyPathExclude("hippo:paths");
        mappingFilter.addPropertyPathExclude("hippo:text");

        objectMapper = new ObjectMapper();
    }

    boolean doUpdate(Node node) {
        log.debug "Visiting node ${node.path}"
        def handleNode = node.getParent()

        // Mapping the gallery imageset node to ContentNode
        def contentNode = contentNodeMapper.map(node, mappingFilter)

        // Let's print out (serialize) the content node by simply using Jackson ObjectMapper for debugging purpose.
        StringWriter writer = new StringWriter(2048)
        objectMapper.writerWithDefaultPrettyPrinter().writeValue(writer, contentNode)
        log.debug "\n" + writer.toString() + "\n"

        return false
    }

    boolean undoUpdate(Node node) {
        throw new UnsupportedOperationException('Updater does not implement undoUpdate method')
    }

}
              

The script shown above will log JSON for each Image Set node like the following example:

{
  "name" : "viognier-grapes-188185_640.jpg",
  "primaryType" : "hippogallery:imageset",
  "mixinTypes" : [ "mix:referenceable" ],
  "properties" : [ {
    "name" : "hippogallery:description",
    "type" : "STRING",
    "multiple" : false,
    "values" : [ "Description for viognier-grapes-188185_640.jpg" ]
  }, {
    "name" : "hippogallery:filename",
    "type" : "STRING",
    "multiple" : false,
    "values" : [ "viognier-grapes-188185_640.jpg" ]
  } ],
  "nodes" : [ {
    "name" : "hippogallery:thumbnail",
    "primaryType" : "hippogallery:image",
    "mixinTypes" : [ ],
    "properties" : [ {
      "name" : "jcr:data",
      "type" : "BINARY",
      "multiple" : false,
      "values" : [ "data:;base64,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" ]
    }, {
      "name" : "jcr:lastModified",
      "type" : "DATE",
      "multiple" : false,
      "values" : [ "2013-11-12T12:15:00.000+01:00" ]
    }, {
      "name" : "hippogallery:height",
      "type" : "LONG",
      "multiple" : false,
      "values" : [ "60" ]
    }, {
      "name" : "jcr:mimeType",
      "type" : "STRING",
      "multiple" : false,
      "values" : [ "image/jpeg" ]
    }, {
      "name" : "hippogallery:width",
      "type" : "LONG",
      "multiple" : false,
      "values" : [ "58" ]
    } ],
    "nodes" : [ ]
  }, {
    "name" : "hippogallery:original",
    "primaryType" : "hippogallery:image",
    "mixinTypes" : [ ],
    "properties" : [ {
      "name" : "jcr:data",
      "type" : "BINARY",
      "multiple" : false,
      "values" : [ "file:///Users/john.doe/myhippoproject/target/tomcat8x/temp/DefaultJcrContentValueConverter_4982037632181885063" ]
    }, {
      "name" : "jcr:lastModified",
      "type" : "DATE",
      "multiple" : false,
      "values" : [ "2013-11-12T12:15:00.000+01:00" ]
    }, {
      "name" : "hippogallery:height",
      "type" : "LONG",
      "multiple" : false,
      "values" : [ "640" ]
    }, {
      "name" : "jcr:mimeType",
      "type" : "STRING",
      "multiple" : false,
      "values" : [ "image/jpeg" ]
    }, {
      "name" : "hippogallery:width",
      "type" : "LONG",
      "multiple" : false,
      "values" : [ "625" ]
    } ],
    "nodes" : [ ]
  } ]
}