/*
* Copyright (C) 2011 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.ros.internal.node.xmlrpc;
import com.google.common.collect.Lists;
import org.ros.exception.RosRuntimeException;
import org.ros.internal.node.response.Response;
import org.ros.internal.node.server.NodeIdentifier;
import org.ros.internal.node.server.ParameterServer;
import org.ros.internal.node.server.master.MasterServer;
import org.ros.namespace.GraphName;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* A combined XML-RPC endpoint for the master and parameter servers.
*
* @author damonkohler@google.com (Damon Kohler)
*/
public class MasterXmlRpcEndpointImpl implements MasterXmlRpcEndpoint,
ParameterServerXmlRpcEndpoint {
private final MasterServer master;
private final ParameterServer parameterServer;
public MasterXmlRpcEndpointImpl(MasterServer master) {
this.master = master;
parameterServer = new ParameterServer();
}
@Override
public List<Object> getPid(String callerId) {
return Response.newSuccess("server pid", master.getPid()).toList();
}
@Override
public List<Object> getPublishedTopics(String callerId, String subgraph) {
return Response.newSuccess("current topics",
master.getPublishedTopics(GraphName.of(callerId), GraphName.of(subgraph))).toList();
}
@Override
public List<Object> getTopicTypes(String callerId) {
return Response.newSuccess("topic types", master.getTopicTypes(GraphName.of(callerId)))
.toList();
}
@Override
public List<Object> getSystemState(String callerId) {
return Response.newSuccess("current system state", master.getSystemState()).toList();
}
@Override
public List<Object> getUri(String callerId) {
return Response.newSuccess("Success", master.getUri().toString()).toList();
}
@Override
public List<Object> lookupNode(String callerId, String nodeName) {
URI nodeSlaveUri = master.lookupNode(GraphName.of(nodeName));
if (nodeSlaveUri != null) {
return Response.newSuccess("Success", nodeSlaveUri.toString()).toList();
} else {
return Response.newError("No such node", null).toList();
}
}
@Override
public List<Object> registerPublisher(String callerId, String topicName, String topicMessageType,
String callerSlaveUri) {
try {
List<URI> subscribers =
master.registerPublisher(GraphName.of(callerId), new URI(callerSlaveUri),
GraphName.of(topicName), topicMessageType);
List<String> urls = Lists.newArrayList();
for (URI uri : subscribers) {
urls.add(uri.toString());
}
return Response.newSuccess("Success", urls).toList();
} catch (URISyntaxException e) {
throw new RosRuntimeException(String.format("Improperly formatted URI %s for publisher",
callerSlaveUri), e);
}
}
@Override
public List<Object> unregisterPublisher(String callerId, String topicName, String callerSlaveUri) {
boolean result = master.unregisterPublisher(GraphName.of(callerId), GraphName.of(topicName));
return Response.newSuccess("Success", result ? 1 : 0).toList();
}
@Override
public List<Object> registerSubscriber(String callerId, String topicName,
String topicMessageType, String callerSlaveUri) {
try {
List<URI> publishers =
master.registerSubscriber(GraphName.of(callerId), new URI(callerSlaveUri),
GraphName.of(topicName), topicMessageType);
List<String> urls = Lists.newArrayList();
for (URI uri : publishers) {
urls.add(uri.toString());
}
return Response.newSuccess("Success", urls).toList();
} catch (URISyntaxException e) {
throw new RosRuntimeException(String.format("Improperly formatted URI %s for subscriber",
callerSlaveUri), e);
}
}
@Override
public List<Object>
unregisterSubscriber(String callerId, String topicName, String callerSlaveUri) {
boolean result = master.unregisterSubscriber(GraphName.of(callerId), GraphName.of(topicName));
return Response.newSuccess("Success", result ? 1 : 0).toList();
}
@Override
public List<Object> lookupService(String callerId, String serviceName) {
URI slaveUri = master.lookupService(GraphName.of(serviceName));
if (slaveUri != null) {
return Response.newSuccess("Success", slaveUri.toString()).toList();
}
return Response.newError("No such service.", null).toList();
}
@Override
public List<Object> registerService(String callerId, String serviceName, String serviceUri,
String callerSlaveUri) {
try {
master.registerService(GraphName.of(callerId), new URI(callerSlaveUri),
GraphName.of(serviceName), new URI(serviceUri));
return Response.newSuccess("Success", 0).toList();
} catch (URISyntaxException e) {
throw new RosRuntimeException(e);
}
}
@Override
public List<Object> unregisterService(String callerId, String serviceName, String serviceUri) {
try {
boolean result =
master.unregisterService(GraphName.of(callerId), GraphName.of(serviceName), new URI(
serviceUri));
return Response.newSuccess("Success", result ? 1 : 0).toList();
} catch (URISyntaxException e) {
throw new RosRuntimeException(e);
}
}
@Override
public List<Object> setParam(String callerId, String key, Boolean value) {
parameterServer.set(GraphName.of(key), value);
return Response.newSuccess("Success", null).toList();
}
@Override
public List<Object> setParam(String callerId, String key, Integer value) {
parameterServer.set(GraphName.of(key), value);
return Response.newSuccess("Success", null).toList();
}
@Override
public List<Object> setParam(String callerId, String key, Double value) {
parameterServer.set(GraphName.of(key), value);
return Response.newSuccess("Success", null).toList();
}
@Override
public List<Object> setParam(String callerId, String key, String value) {
parameterServer.set(GraphName.of(key), value);
return Response.newSuccess("Success", null).toList();
}
@Override
public List<Object> setParam(String callerId, String key, List<?> value) {
parameterServer.set(GraphName.of(key), value);
return Response.newSuccess("Success", null).toList();
}
@Override
public List<Object> setParam(String callerId, String key, Map<?, ?> value) {
parameterServer.set(GraphName.of(key), value);
return Response.newSuccess("Success", null).toList();
}
@Override
public List<Object> getParam(String callerId, String key) {
Object value = parameterServer.get(GraphName.of(key));
if (value == null) {
return Response.newError("Parameter \"" + key + "\" is not set.", null).toList();
}
return Response.newSuccess("Success", value).toList();
}
@Override
public List<Object> searchParam(String callerId, String key) {
throw new UnsupportedOperationException();
}
@Override
public List<Object> subscribeParam(String callerId, String callerSlaveUri, String key) {
parameterServer.subscribe(GraphName.of(key),
NodeIdentifier.forNameAndUri(callerId, callerSlaveUri));
Object value = parameterServer.get(GraphName.of(key));
if (value == null) {
// Must return an empty map as the value of an unset parameter.
value = new HashMap<String, Object>();
}
return Response.newSuccess("Success", value).toList();
}
@Override
public List<Object> unsubscribeParam(String callerId, String callerSlaveUri, String key) {
throw new UnsupportedOperationException();
}
@Override
public List<Object> deleteParam(String callerId, String key) {
parameterServer.delete(GraphName.of(key));
return Response.newSuccess("Success", null).toList();
}
@Override
public List<Object> hasParam(String callerId, String key) {
return Response.newSuccess("Success", parameterServer.has(GraphName.of(key))).toList();
}
@Override
public List<Object> getParamNames(String callerId) {
Collection<GraphName> names = parameterServer.getNames();
List<String> stringNames = Lists.newArrayList();
for (GraphName name : names) {
stringNames.add(name.toString());
}
return Response.newSuccess("Success", stringNames).toList();
}
}