Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions rcljava/src/main/java/org/ros2/rcljava/client/Client.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,7 @@
import org.ros2.rcljava.service.RMWRequestId;

public interface Client<T extends ServiceDefinition> extends Disposable {
<U extends MessageDefinition> Class<U> getRequestType();

<U extends MessageDefinition> Class<U> getResponseType();
ServiceDefinition getServiceDefinition();

<U extends MessageDefinition> void handleResponse(RMWRequestId header, U response);

Expand Down
29 changes: 13 additions & 16 deletions rcljava/src/main/java/org/ros2/rcljava/client/ClientImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -55,20 +55,25 @@ public class ClientImpl<T extends ServiceDefinition> implements Client<T> {
private final String serviceName;
private Map<Long, Map.Entry<Consumer, RCLFuture>> pendingRequests;

private final Class<MessageDefinition> requestType;
private final Class<MessageDefinition> responseType;

public ClientImpl(final WeakReference<Node> nodeReference, final long handle,
final String serviceName, final Class<MessageDefinition> requestType,
final Class<MessageDefinition> responseType) {
private final ServiceDefinition serviceDefinition;

public ClientImpl(
final ServiceDefinition serviceDefinition,
final WeakReference<Node> nodeReference,
final long handle,
final String serviceName)
{
this.nodeReference = nodeReference;
this.handle = handle;
this.serviceName = serviceName;
this.requestType = requestType;
this.responseType = responseType;
this.serviceDefinition = serviceDefinition;
this.pendingRequests = new HashMap<Long, Map.Entry<Consumer, RCLFuture>>();
}

public ServiceDefinition getServiceDefinition() {
return this.serviceDefinition;
}

public final <U extends MessageDefinition, V extends MessageDefinition> Future<V>
asyncSendRequest(final U request) {
return asyncSendRequest(request, new Consumer<Future<V>>() {
Expand Down Expand Up @@ -112,14 +117,6 @@ private static native long nativeSendClientRequest(
long handle, long requestFromJavaConverterHandle, long requestDestructorHandle,
MessageDefinition requestMessage);

public final Class<MessageDefinition> getRequestType() {
return this.requestType;
}

public final Class<MessageDefinition> getResponseType() {
return this.responseType;
}

/**
* Destroy a ROS2 client (rcl_client_t).
*
Expand Down
36 changes: 10 additions & 26 deletions rcljava/src/main/java/org/ros2/rcljava/executors/BaseExecutor.java
Original file line number Diff line number Diff line change
Expand Up @@ -118,18 +118,9 @@ protected void executeAnyExecutable(AnyExecutable anyExecutable) {
}

if (anyExecutable.service != null) {
Class<? extends MessageDefinition> requestType = anyExecutable.service.getRequestType();
Class<? extends MessageDefinition> responseType = anyExecutable.service.getResponseType();

MessageDefinition requestMessage = null;
MessageDefinition responseMessage = null;

try {
requestMessage = requestType.getDeclaredConstructor().newInstance();
responseMessage = responseType.getDeclaredConstructor().newInstance();
} catch (ReflectiveOperationException e) {
throw new IllegalStateException("Failed to instantiate service request/response");
}
ServiceDefinition serviceDefinition = anyExecutable.service.getServiceDefinition();
MessageDefinition requestMessage = serviceDefinition.newRequestInstance();
MessageDefinition responseMessage = serviceDefinition.newResponseInstance();

if (requestMessage != null && responseMessage != null) {
long requestFromJavaConverterHandle = requestMessage.getFromJavaConverterInstance();
Expand All @@ -140,28 +131,21 @@ protected void executeAnyExecutable(AnyExecutable anyExecutable) {
long responseDestructorHandle = responseMessage.getDestructorInstance();

RMWRequestId rmwRequestId =
nativeTakeRequest(anyExecutable.service.getHandle(), requestFromJavaConverterHandle,
requestToJavaConverterHandle, requestDestructorHandle, requestMessage);
nativeTakeRequest(anyExecutable.service.getHandle(), requestFromJavaConverterHandle,
requestToJavaConverterHandle, requestDestructorHandle, requestMessage);
if (rmwRequestId != null) {
anyExecutable.service.executeCallback(rmwRequestId, requestMessage, responseMessage);
nativeSendServiceResponse(anyExecutable.service.getHandle(), rmwRequestId,
responseFromJavaConverterHandle, responseDestructorHandle, responseMessage);
nativeSendServiceResponse(
anyExecutable.service.getHandle(), rmwRequestId,
responseFromJavaConverterHandle, responseDestructorHandle, responseMessage);
}
}
serviceHandles.remove(anyExecutable.service.getHandle());
}

if (anyExecutable.client != null) {
Class<? extends MessageDefinition> requestType = anyExecutable.client.getRequestType();
Class<? extends MessageDefinition> responseType = anyExecutable.client.getResponseType();

MessageDefinition responseMessage = null;

try {
responseMessage = responseType.getDeclaredConstructor().newInstance();
} catch (ReflectiveOperationException ie) {
throw new IllegalStateException("Failed to instantiate service response");
}
ServiceDefinition serviceDefinition = anyExecutable.client.getServiceDefinition();
MessageDefinition responseMessage = serviceDefinition.newResponseInstance();

if (responseMessage != null) {
long responseFromJavaConverterHandle = responseMessage.getFromJavaConverterInstance();
Expand Down
17 changes: 9 additions & 8 deletions rcljava/src/main/java/org/ros2/rcljava/node/Node.java
Original file line number Diff line number Diff line change
Expand Up @@ -126,23 +126,24 @@ <T extends MessageDefinition> Publisher<T> createPublisher(
<T extends MessageDefinition> Publisher<T> createPublisher(
final Class<T> messageType, final String topic);

<T extends ServiceDefinition> Service<T> createService(final Class<T> serviceType,
<T extends ServiceDefinition> Service<T> createService(
final Class<T> serviceType,
final String serviceName,
final TriConsumer<RMWRequestId, ? extends MessageDefinition, ? extends MessageDefinition>
callback,
final QoSProfile qosProfile) throws NoSuchFieldException, IllegalAccessException;
final QoSProfile qosProfile);

<T extends ServiceDefinition> Service<T> createService(final Class<T> serviceType,
<T extends ServiceDefinition> Service<T> createService(
final Class<T> serviceType,
final String serviceName,
final TriConsumer<RMWRequestId, ? extends MessageDefinition, ? extends MessageDefinition>
callback) throws NoSuchFieldException, IllegalAccessException;
callback);

<T extends ServiceDefinition> Client<T> createClient(
final Class<T> serviceType, final String serviceName, final QoSProfile qosProfile)
throws NoSuchFieldException, IllegalAccessException;
final Class<T> serviceType, final String serviceName, final QoSProfile qosProfile);

<T extends ServiceDefinition> Client<T> createClient(final Class<T> serviceType,
final String serviceName) throws NoSuchFieldException, IllegalAccessException;
<T extends ServiceDefinition> Client<T> createClient(
final Class<T> serviceType, final String serviceName);

/**
* Create an ActionServer&lt;T&gt;.
Expand Down
70 changes: 36 additions & 34 deletions rcljava/src/main/java/org/ros2/rcljava/node/NodeImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -191,18 +191,8 @@ public NodeImpl(final long handle, final NodeOptions nodeOptions) {
this.wall_clock = new Clock(ClockType.STEADY_TIME);
this.timeSource = new TimeSource(this);
this.timeSource.attachClock(this.clock);
try {
this.parameterService = nodeOptions.getStartParameterServices() ?
new ParameterServiceImpl(this) : null;
// TODO(ivanpauno): Modify createService, createClient so they don't declare
// NoSuchFieldException and IllegalAccessException checked exceptions.
// That only happens if the user passed the wrong Class object, and the exception should
// be rethrown as an unchecked IllegalArgumentException.
} catch (NoSuchFieldException ex) {
throw new IllegalArgumentException(ex.getMessage());
} catch (IllegalAccessException ex) {
throw new IllegalArgumentException(ex.getMessage());
}
this.parameterService = nodeOptions.getStartParameterServices() ?
new ParameterServiceImpl(this) : null;
}

/**
Expand Down Expand Up @@ -340,30 +330,39 @@ private static native <T extends ServiceDefinition> long nativeCreateServiceHand
long handle, Class<T> cls, String serviceName, long qosProfileHandle);

public final <T extends ServiceDefinition> Service<T> createService(final Class<T> serviceType,
final String serviceName,
final TriConsumer<RMWRequestId, ? extends MessageDefinition, ? extends MessageDefinition>
callback,
final QoSProfile qosProfile) throws NoSuchFieldException, IllegalAccessException {
Class<MessageDefinition> requestType = (Class) serviceType.getField("RequestType").get(null);

Class<MessageDefinition> responseType = (Class) serviceType.getField("ResponseType").get(null);

final String serviceName,
final TriConsumer<RMWRequestId, ? extends MessageDefinition, ? extends MessageDefinition>
callback,
final QoSProfile qosProfile)
{
T serviceDefinition;
try {
serviceDefinition = serviceType.getDeclaredConstructor().newInstance();
} catch (ReflectiveOperationException e) {
throw new IllegalStateException("Failed to instantiate service definition");
}
long qosProfileHandle = RCLJava.convertQoSProfileToHandle(qosProfile);
long serviceHandle =
nativeCreateServiceHandle(this.handle, serviceType, serviceName, qosProfileHandle);
RCLJava.disposeQoSProfile(qosProfileHandle);

Service<T> service = new ServiceImpl<T>(new WeakReference<Node>(this), serviceHandle,
serviceName, callback, requestType, responseType);
Service<T> service = new ServiceImpl<T>(
serviceDefinition,
new WeakReference<Node>(this),
serviceHandle,
serviceName,
callback);
this.services.add(service);

return service;
}

public <T extends ServiceDefinition> Service<T> createService(final Class<T> serviceType,
final String serviceName,
final TriConsumer<RMWRequestId, ? extends MessageDefinition, ? extends MessageDefinition>
callback) throws NoSuchFieldException, IllegalAccessException {
public <T extends ServiceDefinition> Service<T> createService(
final Class<T> serviceType,
final String serviceName,
final TriConsumer<RMWRequestId, ? extends MessageDefinition, ? extends MessageDefinition>
callback)
{
return this.<T>createService(serviceType, serviceName, callback, QoSProfile.SERVICES_DEFAULT);
}

Expand All @@ -375,26 +374,29 @@ public final Collection<Service> getServices() {
}

public final <T extends ServiceDefinition> Client<T> createClient(
final Class<T> serviceType, final String serviceName, final QoSProfile qosProfile)
throws NoSuchFieldException, IllegalAccessException {
Class<MessageDefinition> requestType = (Class) serviceType.getField("RequestType").get(null);

Class<MessageDefinition> responseType = (Class) serviceType.getField("ResponseType").get(null);

final Class<T> serviceType, final String serviceName, final QoSProfile qosProfile)
{
long qosProfileHandle = RCLJava.convertQoSProfileToHandle(qosProfile);
long clientHandle =
nativeCreateClientHandle(this.handle, serviceType, serviceName, qosProfileHandle);
RCLJava.disposeQoSProfile(qosProfileHandle);

T serviceDefinition;
try {
serviceDefinition = serviceType.getDeclaredConstructor().newInstance();
} catch (ReflectiveOperationException e) {
throw new IllegalStateException("Failed to instantiate service definition");
}

Client<T> client = new ClientImpl<T>(
new WeakReference<Node>(this), clientHandle, serviceName, requestType, responseType);
serviceDefinition, new WeakReference<Node>(this), clientHandle, serviceName);
this.clients.add(client);

return client;
}

public <T extends ServiceDefinition> Client<T> createClient(final Class<T> serviceType,
final String serviceName) throws NoSuchFieldException, IllegalAccessException {
final String serviceName) {
return this.<T>createClient(serviceType, serviceName, QoSProfile.SERVICES_DEFAULT);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ public class AsyncParametersClientImpl implements AsyncParametersClient {
private final Client<rcl_interfaces.srv.DescribeParameters> describeParametersClient;

public AsyncParametersClientImpl(final Node node, final String remoteName,
final QoSProfile qosProfile) throws NoSuchFieldException, IllegalAccessException {
final QoSProfile qosProfile) {
this.node = node;
if (remoteName != "") {
this.remoteName = remoteName;
Expand Down Expand Up @@ -84,17 +84,17 @@ public AsyncParametersClientImpl(final Node node, final String remoteName,
}

public AsyncParametersClientImpl(final Node node, final QoSProfile qosProfile)
throws NoSuchFieldException, IllegalAccessException {
{
this(node, "", qosProfile);
}

public AsyncParametersClientImpl(final Node node, final String remoteName)
throws NoSuchFieldException, IllegalAccessException {
{
this(node, remoteName, QoSProfile.PARAMETERS);
}

public AsyncParametersClientImpl(final Node node)
throws NoSuchFieldException, IllegalAccessException {
{
this(node, "", QoSProfile.PARAMETERS);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,44 +55,55 @@ public ConsumerHelper(RCLFuture<T> resultFuture) {

public AsyncParametersClient asyncParametersClient;

public SyncParametersClientImpl(final Node node, final String remoteName,
final QoSProfile qosProfile) throws NoSuchFieldException, IllegalAccessException {
public SyncParametersClientImpl(
final Node node,
final String remoteName,
final QoSProfile qosProfile)
{
this.asyncParametersClient = new AsyncParametersClientImpl(node, remoteName, qosProfile);
}

public SyncParametersClientImpl(final Node node, final QoSProfile qosProfile)
throws NoSuchFieldException, IllegalAccessException {
{
this(node, "", qosProfile);
}

public SyncParametersClientImpl(final Node node, final String remoteName)
throws NoSuchFieldException, IllegalAccessException {
{
this(node, remoteName, QoSProfile.PARAMETERS);
}

public SyncParametersClientImpl(final Node node)
throws NoSuchFieldException, IllegalAccessException {
{
this(node, "", QoSProfile.PARAMETERS);
}

public SyncParametersClientImpl(final Executor executor, final Node node, final String remoteName,
final QoSProfile qosProfile) throws NoSuchFieldException, IllegalAccessException {
public SyncParametersClientImpl(
final Executor executor,
final Node node,
final String remoteName,
final QoSProfile qosProfile)
{
this.executor = executor;
this.asyncParametersClient = new AsyncParametersClientImpl(node, remoteName, qosProfile);
}

public SyncParametersClientImpl(final Executor executor, final Node node,
final QoSProfile qosProfile) throws NoSuchFieldException, IllegalAccessException {
public SyncParametersClientImpl(
final Executor executor,
final Node node,
final QoSProfile qosProfile)
{
this(executor, node, "", qosProfile);
}

public SyncParametersClientImpl(final Executor executor, final Node node, final String remoteName)
throws NoSuchFieldException, IllegalAccessException {
public SyncParametersClientImpl(
final Executor executor, final Node node, final String remoteName)
{
this(executor, node, remoteName, QoSProfile.PARAMETERS);
}

public SyncParametersClientImpl(final Executor executor, final Node node)
throws NoSuchFieldException, IllegalAccessException {
{
this(executor, node, "", QoSProfile.PARAMETERS);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public class ParameterServiceImpl implements ParameterService {
Service<rcl_interfaces.srv.ListParameters> listParametersService;

public ParameterServiceImpl(final Node node, final QoSProfile qosProfile)
throws NoSuchFieldException, IllegalAccessException {
{
this.node = node;
this.getParametersService = node.<rcl_interfaces.srv.GetParameters>createService(
rcl_interfaces.srv.GetParameters.class,
Expand Down Expand Up @@ -146,7 +146,7 @@ public void accept(RMWRequestId rmwRequestId,
qosProfile);
}

public ParameterServiceImpl(final Node node) throws NoSuchFieldException, IllegalAccessException {
public ParameterServiceImpl(final Node node) {
this(node, QoSProfile.PARAMETERS);
}
}
4 changes: 1 addition & 3 deletions rcljava/src/main/java/org/ros2/rcljava/service/Service.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,7 @@
import org.ros2.rcljava.interfaces.ServiceDefinition;

public interface Service<T extends ServiceDefinition> extends Disposable {
<U extends MessageDefinition> Class<U> getRequestType();

<U extends MessageDefinition> Class<U> getResponseType();
ServiceDefinition getServiceDefinition();

void executeCallback(RMWRequestId rmwRequestId, MessageDefinition request, MessageDefinition response);

Expand Down
Loading