From 347cc48424dbc9366f254728c62d018522f7c9fc Mon Sep 17 00:00:00 2001 From: Julian Cerruti <jcerruti@creativa77.com> Date: Mon, 22 May 2017 15:47:14 -0300 Subject: [PATCH] Implement parameter server's searchParam --- .../internal/node/server/ParameterServer.java | 16 +++++++++-- .../node/xmlrpc/MasterXmlRpcEndpointImpl.java | 10 ++++++- .../node/server/ParameterServerTest.java | 28 +++++++++++++++++++ .../ParameterTreeIntegrationTest.java | 7 +++++ 4 files changed, 58 insertions(+), 3 deletions(-) diff --git a/rosjava/src/main/java/org/ros/internal/node/server/ParameterServer.java b/rosjava/src/main/java/org/ros/internal/node/server/ParameterServer.java index dd57c121..4b470f10 100644 --- a/rosjava/src/main/java/org/ros/internal/node/server/ParameterServer.java +++ b/rosjava/src/main/java/org/ros/internal/node/server/ParameterServer.java @@ -187,8 +187,20 @@ public class ParameterServer { } } - public Object search(GraphName name) { - throw new UnsupportedOperationException(); + public Object search(GraphName namespace, GraphName name) { + GraphName search = namespace; + GraphName result = search.join(name.toRelative()); + if (has(result)) { + return result; + } + while (!search.isRoot()) { + search = search.getParent(); + result = search.join(name.toRelative()); + if (has(result)) { + return result; + } + } + return null; } @SuppressWarnings("unchecked") diff --git a/rosjava/src/main/java/org/ros/internal/node/xmlrpc/MasterXmlRpcEndpointImpl.java b/rosjava/src/main/java/org/ros/internal/node/xmlrpc/MasterXmlRpcEndpointImpl.java index b04e1490..62b63b46 100644 --- a/rosjava/src/main/java/org/ros/internal/node/xmlrpc/MasterXmlRpcEndpointImpl.java +++ b/rosjava/src/main/java/org/ros/internal/node/xmlrpc/MasterXmlRpcEndpointImpl.java @@ -214,7 +214,15 @@ public class MasterXmlRpcEndpointImpl implements MasterXmlRpcEndpoint, @Override public List<Object> searchParam(String callerId, String key) { - throw new UnsupportedOperationException(); + GraphName ns = GraphName.of(callerId); + GraphName searchKey = GraphName.of(key); + Object value = parameterServer.search(ns, searchKey); + if (value != null) { + return Response.newSuccess("Success", value.toString()).toList(); + } else { + return Response.newError("Parameter \"" + key + "\" in namespace \"" + ns.toString() + + "\" not found in parameter server", null).toList(); + } } @Override diff --git a/rosjava/src/test/java/org/ros/internal/node/server/ParameterServerTest.java b/rosjava/src/test/java/org/ros/internal/node/server/ParameterServerTest.java index a5a88cf3..c8708eaf 100644 --- a/rosjava/src/test/java/org/ros/internal/node/server/ParameterServerTest.java +++ b/rosjava/src/test/java/org/ros/internal/node/server/ParameterServerTest.java @@ -17,6 +17,7 @@ package org.ros.internal.node.server; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import java.util.Collection; @@ -128,4 +129,31 @@ public class ParameterServerTest { assertTrue(names.contains(name2)); } + @Test + public void testSearchParam() { + GraphName ns = GraphName.of("/a/b/c/d/e/f"); + GraphName name1 = GraphName.of("s_1"); + + GraphName name2 = GraphName.of("/s_1"); + server.set(name2, 1); + Object result = server.search(ns, name1); + assertEquals(name2, result); + server.delete(name2); + + name2 = GraphName.of("/a/b/s_1"); + server.set(name2, 1); + result = server.search(ns, name1); + assertEquals(name2, result); + server.delete(name2); + + name2 = GraphName.of("/a/b/c/d/e/f/s_1"); + server.set(name2, 1); + result = server.search(ns, name1); + assertEquals(name2, result); + server.delete(name2); + + name1 = GraphName.of("s_j"); + result = server.search(ns, name1); + assertEquals(null, result); + } } diff --git a/rosjava/src/test/java/org/ros/node/parameter/ParameterTreeIntegrationTest.java b/rosjava/src/test/java/org/ros/node/parameter/ParameterTreeIntegrationTest.java index 5d98f90c..53057e02 100644 --- a/rosjava/src/test/java/org/ros/node/parameter/ParameterTreeIntegrationTest.java +++ b/rosjava/src/test/java/org/ros/node/parameter/ParameterTreeIntegrationTest.java @@ -85,6 +85,13 @@ public class ParameterTreeIntegrationTest extends RosTest { } } + @Test + public void testSearchParameter() { + parameters.set("/node_name/p_i", "value"); + GraphName res = parameters.search("p_i"); + assertEquals("/node_name/p_i", res.toString()); + } + @Test public void testGetParameterWithDefault() { assertTrue(parameters.getBoolean("bloop", true)); -- GitLab