Skip to content

Instantly share code, notes, and snippets.

@chetanmeh
Last active August 29, 2015 13:59
Show Gist options
  • Save chetanmeh/10971530 to your computer and use it in GitHub Desktop.
Save chetanmeh/10971530 to your computer and use it in GitHub Desktop.
Extracts the exported package info from a running OSGi system for list of given bundle name
import groovy.text.SimpleTemplateEngine
import org.osgi.framework.Bundle
import org.osgi.framework.wiring.BundleRevision
import org.osgi.framework.wiring.BundleWire
import org.osgi.framework.wiring.BundleWiring
import org.osgi.service.packageadmin.ExportedPackage
import org.osgi.service.packageadmin.PackageAdmin
PackageAdmin pkgAdmin = osgi.getService(org.osgi.service.packageadmin.PackageAdmin.class)
def oakBundlePrefixes = ['org.apache.jackrabbit.oak-']
def oakBundles = bundleContext.getBundles().findAll{Bundle b ->
oakBundlePrefixes.any {b.symbolicName.startsWith(it)}
}
def result = [:]
oakBundles.each{Bundle b ->
BundleWiring bw = b.adapt(BundleWiring.class)
List<BundleWire> wires = bw.getProvidedWires(BundleRevision.PACKAGE_NAMESPACE)
ExportedPackage[] eps = pkgAdmin.getExportedPackages(b)
def bundleName = "$b.symbolicName ($b.version)"
int count = 0
result[bundleName] = eps.collect {ep ->
def users = wires.collect {w ->
def pkgName = w.capability.attributes['osgi.wiring.package']
return pkgName == ep.name
}
[name:ep.name, version: ep.version.toString(), index: ++count, used : !users.isEmpty()]
}
}
result.each {bundleName, pkgInfo ->
println bundleName
def ttf = new TemplateFactory()
ttf.columns = [
[name: 'index', size: 4, displayName : 'Seq'],
[name: 'name', size: 75, displayName : 'Package Names'],
[name: 'version', size: 15, displayName : 'Version'],
[name: 'used', size: 5, displayName : 'Used'],
]
println new SimpleTemplateEngine().createTemplate(ttf.template).make([rows:pkgInfo]).toString()
}
class TemplateFactory {
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()}
<% } %>"""
}
}
class ConfluenceTemplateFactory {
def columns = []
def getTemplate() { """
||${columns.collect{ " <%print \"$it.displayName\"%> " }.join("||")}||
<% rows.each {%>${"|"+columns.collect{ " \${it.${it.name}.toString()} " }.join("|")+"|"}
<% } %>"""
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment