You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@karaf.apache.org by "Jean-Baptiste Onofré (JIRA)" <ji...@apache.org> on 2018/05/17 08:52:00 UTC

[jira] [Commented] (KARAF-5757) Improve shell reflection capabilities

    [ https://issues.apache.org/jira/browse/KARAF-5757?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16478760#comment-16478760 ] 

Jean-Baptiste Onofré commented on KARAF-5757:
---------------------------------------------

Big +1, that's a great idea !

> 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)