@@ -191,18 +191,8 @@ public NodeImpl(final long handle, final NodeOptions nodeOptions) {
191191 this .wall_clock = new Clock (ClockType .STEADY_TIME );
192192 this .timeSource = new TimeSource (this );
193193 this .timeSource .attachClock (this .clock );
194- try {
195- this .parameterService = nodeOptions .getStartParameterServices () ?
196- new ParameterServiceImpl (this ) : null ;
197- // TODO(ivanpauno): Modify createService, createClient so they don't declare
198- // NoSuchFieldException and IllegalAccessException checked exceptions.
199- // That only happens if the user passed the wrong Class object, and the exception should
200- // be rethrown as an unchecked IllegalArgumentException.
201- } catch (NoSuchFieldException ex ) {
202- throw new IllegalArgumentException (ex .getMessage ());
203- } catch (IllegalAccessException ex ) {
204- throw new IllegalArgumentException (ex .getMessage ());
205- }
194+ this .parameterService = nodeOptions .getStartParameterServices () ?
195+ new ParameterServiceImpl (this ) : null ;
206196 }
207197
208198 /**
@@ -340,30 +330,39 @@ private static native <T extends ServiceDefinition> long nativeCreateServiceHand
340330 long handle , Class <T > cls , String serviceName , long qosProfileHandle );
341331
342332 public final <T extends ServiceDefinition > Service <T > createService (final Class <T > serviceType ,
343- final String serviceName ,
344- final TriConsumer <RMWRequestId , ? extends MessageDefinition , ? extends MessageDefinition >
345- callback ,
346- final QoSProfile qosProfile ) throws NoSuchFieldException , IllegalAccessException {
347- Class <MessageDefinition > requestType = (Class ) serviceType .getField ("RequestType" ).get (null );
348-
349- Class <MessageDefinition > responseType = (Class ) serviceType .getField ("ResponseType" ).get (null );
350-
333+ final String serviceName ,
334+ final TriConsumer <RMWRequestId , ? extends MessageDefinition , ? extends MessageDefinition >
335+ callback ,
336+ final QoSProfile qosProfile )
337+ {
338+ T serviceDefinition ;
339+ try {
340+ serviceDefinition = serviceType .getDeclaredConstructor ().newInstance ();
341+ } catch (ReflectiveOperationException e ) {
342+ throw new IllegalStateException ("Failed to instantiate service definition" );
343+ }
351344 long qosProfileHandle = RCLJava .convertQoSProfileToHandle (qosProfile );
352345 long serviceHandle =
353346 nativeCreateServiceHandle (this .handle , serviceType , serviceName , qosProfileHandle );
354347 RCLJava .disposeQoSProfile (qosProfileHandle );
355348
356- Service <T > service = new ServiceImpl <T >(new WeakReference <Node >(this ), serviceHandle ,
357- serviceName , callback , requestType , responseType );
349+ Service <T > service = new ServiceImpl <T >(
350+ serviceDefinition ,
351+ new WeakReference <Node >(this ),
352+ serviceHandle ,
353+ serviceName ,
354+ callback );
358355 this .services .add (service );
359356
360357 return service ;
361358 }
362359
363- public <T extends ServiceDefinition > Service <T > createService (final Class <T > serviceType ,
364- final String serviceName ,
365- final TriConsumer <RMWRequestId , ? extends MessageDefinition , ? extends MessageDefinition >
366- callback ) throws NoSuchFieldException , IllegalAccessException {
360+ public <T extends ServiceDefinition > Service <T > createService (
361+ final Class <T > serviceType ,
362+ final String serviceName ,
363+ final TriConsumer <RMWRequestId , ? extends MessageDefinition , ? extends MessageDefinition >
364+ callback )
365+ {
367366 return this .<T >createService (serviceType , serviceName , callback , QoSProfile .SERVICES_DEFAULT );
368367 }
369368
@@ -375,26 +374,29 @@ public final Collection<Service> getServices() {
375374 }
376375
377376 public final <T extends ServiceDefinition > Client <T > createClient (
378- final Class <T > serviceType , final String serviceName , final QoSProfile qosProfile )
379- throws NoSuchFieldException , IllegalAccessException {
380- Class <MessageDefinition > requestType = (Class ) serviceType .getField ("RequestType" ).get (null );
381-
382- Class <MessageDefinition > responseType = (Class ) serviceType .getField ("ResponseType" ).get (null );
383-
377+ final Class <T > serviceType , final String serviceName , final QoSProfile qosProfile )
378+ {
384379 long qosProfileHandle = RCLJava .convertQoSProfileToHandle (qosProfile );
385380 long clientHandle =
386381 nativeCreateClientHandle (this .handle , serviceType , serviceName , qosProfileHandle );
387382 RCLJava .disposeQoSProfile (qosProfileHandle );
388383
384+ T serviceDefinition ;
385+ try {
386+ serviceDefinition = serviceType .getDeclaredConstructor ().newInstance ();
387+ } catch (ReflectiveOperationException e ) {
388+ throw new IllegalStateException ("Failed to instantiate service definition" );
389+ }
390+
389391 Client <T > client = new ClientImpl <T >(
390- new WeakReference <Node >(this ), clientHandle , serviceName , requestType , responseType );
392+ serviceDefinition , new WeakReference <Node >(this ), clientHandle , serviceName );
391393 this .clients .add (client );
392394
393395 return client ;
394396 }
395397
396398 public <T extends ServiceDefinition > Client <T > createClient (final Class <T > serviceType ,
397- final String serviceName ) throws NoSuchFieldException , IllegalAccessException {
399+ final String serviceName ) {
398400 return this .<T >createClient (serviceType , serviceName , QoSProfile .SERVICES_DEFAULT );
399401 }
400402
0 commit comments