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 dd57c1216f7ed4e5001c30798b6575d228142507..4b470f10e98ecfdaf7619d0bfb1a79028a320d8c 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 b04e1490ef0355c8c1b211cd415731c31164c221..62b63b4672150f6392b9e57b4ebdacc73c3a3ce8 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 a5a88cf3a186a83a9ac8367c98753a5dcee9500b..c8708eaf9fa723c7f0927739b5738a836ad97915 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 5d98f90c01c10f5214dc1d6d18e171f301dab99e..53057e027f949f0dd50e40272705b834e8bb95b5 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));