Oak related scripts to be executed with Felix Script Console. To get up and running quickly install following bundles in Felix WebConsole
Then go to http://localhost:4502/system/console/sc
Oak related scripts to be executed with Felix Script Console. To get up and running quickly install following bundles in Felix WebConsole
Then go to http://localhost:4502/system/console/sc
import groovy.text.SimpleTemplateEngine | |
import org.apache.jackrabbit.commons.visitor.FilteringItemVisitor | |
import org.apache.jackrabbit.oak.commons.IOUtils | |
import org.apache.sling.jcr.api.SlingRepository | |
import org.slf4j.LoggerFactory | |
import javax.jcr.Session | |
import javax.jcr.Node | |
import javax.jcr.* | |
import static org.apache.jackrabbit.oak.commons.IOUtils.humanReadableByteCount | |
SlingRepository repo = osgi.getService(SlingRepository.class) | |
Session s = null | |
logger = LoggerFactory.getLogger("script-console") | |
def root = '/content/dam' | |
try { | |
s = repo.loginAdministrative(null) | |
def typeStatsMap = [:].withDefault {key -> [count:0, name:key, size:0L]} | |
collectBinaryStats(s.getNode(root), typeStatsMap) | |
def totalSize = typeStatsMap.values().inject(0) {sum, stat -> sum + stat.size} | |
logp("MimeType Stats - Total size ${humanReadableByteCount(totalSize)}") | |
dumpStats(typeStatsMap) | |
} finally { | |
s?.logout() | |
} | |
def collectBinaryStats(Node root, def typeStatsMap){ | |
def nodes = [] | |
long count = 0 | |
FilteringItemVisitor v = new FilteringItemVisitor(){ | |
protected void entering(Property property, int i){ } | |
protected void leaving(Property property, int i){ } | |
protected void leaving(Node node, int i){ } | |
protected void entering(Node node, int i){ | |
count++ | |
if(node.primaryNodeType.name == 'nt:file'){ | |
if(node.hasProperty('jcr:content/jcr:mimeType')){ | |
def mimeType = node.getProperty('jcr:content/jcr:mimeType').getString() | |
def stats = typeStatsMap[mimeType] | |
Binary b = node.getProperty('jcr:content/jcr:data').getBinary() | |
try{ | |
stats.size += b.size | |
}finally{ | |
b.dispose() | |
} | |
stats.count++ | |
} | |
} | |
if (count % 10000L == 0L){ | |
logp ("Traversed $count nodes so far") | |
} | |
if (count % 1000000L == 0L){ | |
dumpStats(typeStatsMap) | |
} | |
} | |
} | |
root.accept(v) | |
return nodes | |
} | |
def dumpStats(def typeStatsMap){ | |
def stats = new ArrayList(typeStatsMap.values()) | |
stats.each {stat -> stat.sizeString = humanReadableByteCount(stat.size)} | |
stats.sort {-it.size} | |
def columns = [ | |
[name:"name",displayName:"Name",size:40], | |
[name:"count",displayName:"Count",size:10], | |
[name:"sizeString",displayName:"Size",size:10], | |
[name:"size",displayName:"Size",size:10], | |
] | |
def ttf = new TemplateFactory2() | |
ttf.columns = columns | |
def table = new SimpleTemplateEngine().createTemplate(ttf.template).make([rows:stats]).toString() | |
logp(table) | |
} | |
def logp(def msg){ | |
println msg | |
logger.info(msg.toString()) | |
} | |
class TemplateFactory2 { | |
def columns = [] | |
def getTemplate() { """ | |
${columns.collect{ " <%print \"$it.displayName\".center($it.size)%> " }.join()} | |
${columns.collect{ " <%print \"_\"*$it.size %> " }.join()} | |
<% rows.each {%>${columns.collect{ " \${it.${it.name}.toString().padRight($it.size).substring(0,$it.size)} " }.join()} | |
<% } %>""" | |
} | |
} | |
import com.google.common.base.Stopwatch | |
import com.google.common.collect.Iterators | |
import org.apache.sling.jcr.api.SlingRepository | |
import javax.jcr.Session | |
import javax.jcr.query.QueryResult | |
import javax.jcr.query.Row | |
def queryStr = '''select [jcr:path], [jcr:score], * | |
from [nt:unstructured] as a | |
where contains(.,'login') | |
''' | |
SlingRepository repo = osgi.getService(SlingRepository.class) | |
Stopwatch watch = Stopwatch.createStarted() | |
Session s = null | |
try { | |
s = repo.loginAdministrative(null) | |
def qm = s.workspace.queryManager | |
def query = qm.createQuery(queryStr,'sql') | |
QueryResult result = query.execute() | |
//Dump upto 20 paths | |
Iterators.limit(result.rows, 20).each {Row r -> println r.path} | |
} finally { | |
s?.logout() | |
} | |
println "Time taken to execute query " + watch |