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