[ https://issues.apache.org/jira/browse/KARAF-5757?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16479261#comment-16479261 ]
Guillaume Nodet commented on KARAF-5757: ---------------------------------------- The 3 gogo fixes lead to the following now, it's a bit easier to read, though not awesome. Not sure what to improve. {code} create-tracker = { trackingContext = $1 ; trackedClass = $2 ; serviceAdded = $3 ; serviceRemoved = $4 handler = { proxy = $1 ; method = $2 ; arguments = $3 name = ($method name) # echo "Invoking $name" if { $name equals "addingService" } \ then { ref = ${arguments[0]} svc = ($.context getService $ref) $serviceAdded execute $.commandSession [ $svc ] $svc } elif { $name equals "removedService" } \ then { ref = ${arguments[0]} ; svc = ${arguments[1]} $serviceRemoved execute $.commandSession [ $svc ] $.context ungetService $ref } } # create handler shellClassLoader = ($.commandSession classLoader) customizerClass = ($shellClassLoader loadClass org.osgi.util.tracker.ServiceTrackerCustomizer) proxyClass = ($shellClassLoader loadClass java.lang.reflect.Proxy) customizer = ($proxyClass newProxyInstance $shellClassLoader [ $customizerClass ] $handler) # create tracker if { "java.lang.Class" equals ($trackedClass class) } \ then { trackedClass = ($trackedClass name) } tracker = (new org.osgi.util.tracker.ServiceTracker $trackingContext $trackedClass $customizer) $tracker } tracker = (create-tracker $.context "org.osgi.service.cm.ManagedService" { s = (($1 class) toString); echo "service-added $s" } { s = (($1 class) toString); echo "service-removed $s" }) $tracker open true {code} > Improve shell reflection capabilities > ------------------------------------- > > Key: KARAF-5757 > URL: https://issues.apache.org/jira/browse/KARAF-5757 > Project: Karaf > Issue Type: New Feature > Reporter: Guillaume Nodet > Priority: Major > Fix For: 4.3.0 > > > Writing karaf scripts can be very tedious when dealing with reflection and > classes. > It needs to be simplified a lot. > Below is a script definining a command to create a service tracker: > {code:java} > create-tracker = { > trackingContext = $1 > trackedClass = $2 > serviceAdded = $3 > serviceRemoved = $4 > shellClassLoader = (($.session class) getClassLoader) > arrayClass = ($shellClassLoader loadClass java.lang.reflect.Array) > handler = { > proxy = $1 > method = $2 > arguments = $3 > name = ($method name) > # echo "Invoking $name" > if { $name equals "addingService" } \ > then { > ref = ($arrayClass get $arguments 0) > svc = ($.context getService $ref) > $serviceAdded execute $.commandSession [ $svc ] > $svc > } elif { $name equals "removedService" } \ > then { > ref = ($arrayClass get $arguments 0) > svc = ($arrayClass get $arguments 1) > $serviceRemoved execute $.commandSession [ $svc ] > $.context ungetService $ref > } > } > # create handler > customizerClass = ($shellClassLoader loadClass > org.osgi.util.tracker.ServiceTrackerCustomizer) > array = ([ $customizerClass ] toArray ($arrayClass newInstance > "java.lang.Class" 1)) > proxyClass = ($shellClassLoader loadClass java.lang.reflect.Proxy) > customizer = ($proxyClass newProxyInstance $shellClassLoader $array > $handler) > # create tracker > trackerClass = ($shellClassLoader loadClass > org.osgi.util.tracker.ServiceTracker) > constructor = ($trackerClass constructor > org.osgi.framework.BundleContext java.lang.String > org.osgi.util.tracker.ServiceTrackerCustomizer) > if { "java.lang.Class" equals ($trackedClass class) } \ > then { > trackedClass = ($trackedClass name) > } > tracker = ($constructor newInstance $trackingContext $trackedClass > $customizer) > $tracker > } > tracker = (create-tracker $.context "org.osgi.service.cm.ManagedService" { s > = (($1 class) toString); echo "service-added $s" } { s = (($1 class) > toString); echo "service-removed $s" }) > $tracker open true > {code} > Also, the Gogo Runtime expander does not support subscripts in java arrays. > It has to be a {{List}}. This should be fixed, see > [https://github.com/apache/felix/blob/trunk/gogo/runtime/src/main/java/org/apache/felix/gogo/runtime/Expander.java#L1483]. > Conversion from list to array would be needed too. > In order to be more user-friendly, we need helper methods to define a context > class loader, load classes (the String -> Class conversion needs to leverage > it). -- This message was sent by Atlassian JIRA (v7.6.3#76005)