|
// -------------------------------------------------------------- |
|
// change these input values |
|
|
|
// path: what oak path to show |
|
def path = "/oak:index/nodetype/:index"; |
|
// depth: how deep the tree structure should be rendered |
|
def depth = 2; |
|
|
|
// -------------------------------------------------------------- |
|
|
|
import org.apache.sling.jcr.api.SlingRepository |
|
import org.apache.jackrabbit.oak.api.Type |
|
import org.apache.jackrabbit.oak.spi.state.NodeStateUtils |
|
|
|
showTree(sling, out, path, depth); |
|
|
|
static def showTree(sling, out, path, depth) { |
|
def p = new IndentPrinter(out) |
|
def repo = sling.getService(SlingRepository.class) |
|
def session = null |
|
try { |
|
session = repo.loginAdministrative(null); |
|
def cs = getOakContentSession(session); |
|
|
|
def rootNode = cs.latestRoot.getTree("/").nodeState; |
|
def node = NodeStateUtils.getNode(rootNode, path); |
|
if (node.exists()) { |
|
p.println(path); |
|
renderNode(node, p, depth); |
|
} else { |
|
p.println("Path not found: " + path) |
|
} |
|
} finally { |
|
session?.logout() |
|
} |
|
} |
|
|
|
static def renderNode(node, p, depth) { |
|
p.incrementIndent(); |
|
node.properties.each { prop -> |
|
p.printIndent() |
|
if (prop.isArray()) { |
|
p.print("- " + prop.name + " = ["); |
|
for (def i = 0; i < prop.count(); i++) { |
|
p.print(prop.getValue(Type.STRING, i) + ", "); |
|
} |
|
p.println("]") |
|
} else { |
|
p.println("- " + prop.name + " = " + prop.getValue(Type.STRING)) |
|
} |
|
} |
|
node.childNodeEntries.each { child -> |
|
p.printIndent() |
|
if (depth == 0) { |
|
p.println("+ " + child.name + " (...)") |
|
} else { |
|
p.println("+ " + child.name) |
|
renderNode(child.nodeState, p, depth - 1) |
|
} |
|
} |
|
p.decrementIndent(); |
|
} |
|
|
|
// get oak ContentSession via reflection |
|
static def getOakContentSession(session) { |
|
def obj1 = java.lang.reflect.Proxy.getInvocationHandler(session).delegatee; |
|
def field = obj1.class.superclass.getDeclaredField("sd"); |
|
field.setAccessible(true); |
|
def obj2 = field.get(obj1); |
|
field = obj2.class.superclass.getDeclaredField("contentSession"); |
|
field.setAccessible(true); |
|
return field.get(obj2); |
|
} |