/*
* 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.parameter;
import com.google.common.base.Preconditions;
import org.ros.exception.ParameterClassCastException;
import org.ros.exception.ParameterNotFoundException;
import org.ros.internal.node.client.ParameterClient;
import org.ros.internal.node.response.Response;
import org.ros.internal.node.response.StatusCode;
import org.ros.internal.node.server.NodeIdentifier;
import org.ros.internal.node.server.ParameterServer;
import org.ros.namespace.GraphName;
import org.ros.namespace.NameResolver;
import org.ros.node.parameter.ParameterListener;
import org.ros.node.parameter.ParameterTree;
import java.net.URI;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* Provides access to the ROS {@link ParameterServer}.
*
* @author kwc@willowgarage.com (Ken Conley)
* @author damonkohler@google.com (Damon Kohler)
*/
public class DefaultParameterTree implements ParameterTree {
private final ParameterClient parameterClient;
private final ParameterManager parameterManager;
private final NameResolver resolver;
public static DefaultParameterTree newFromNodeIdentifier(NodeIdentifier nodeIdentifier,
URI masterUri, NameResolver resolver, ParameterManager parameterManager) {
ParameterClient client = new ParameterClient(nodeIdentifier, masterUri);
return new DefaultParameterTree(client, parameterManager, resolver);
}
private DefaultParameterTree(ParameterClient parameterClient, ParameterManager parameterManager,
NameResolver resolver) {
this.parameterClient = parameterClient;
this.parameterManager = parameterManager;
this.resolver = resolver;
}
@Override
public boolean has(GraphName name) {
GraphName resolvedName = resolver.resolve(name);
return parameterClient.hasParam(resolvedName).getResult();
}
@Override
public boolean has(String name) {
return has(GraphName.of(name));
}
@Override
public void delete(GraphName name) {
GraphName resolvedName = resolver.resolve(name);
parameterClient.deleteParam(resolvedName);
}
@Override
public void delete(String name) {
delete(GraphName.of(name));
}
@Override
public GraphName search(GraphName name) {
GraphName resolvedName = resolver.resolve(name);
Response<GraphName> response = parameterClient.searchParam(resolvedName);
if (response.getStatusCode() == StatusCode.SUCCESS) {
return response.getResult();
} else {
return null;
}
}
@Override
public GraphName search(String name) {
return search(GraphName.of(name));
}
@Override
public List<GraphName> getNames() {
return parameterClient.getParamNames().getResult();
}
@Override
public void addParameterListener(GraphName name, ParameterListener listener) {
parameterManager.addListener(name, listener);
parameterClient.subscribeParam(name);
}
@Override
public void addParameterListener(String name, ParameterListener listener) {
addParameterListener(GraphName.of(name), listener);
}
@Override
public void set(GraphName name, boolean value) {
GraphName resolvedName = resolver.resolve(name);
parameterClient.setParam(resolvedName, value);
}
@Override
public void set(String name, boolean value) {
set(GraphName.of(name), value);
}
@Override
public void set(GraphName name, int value) {
GraphName resolvedName = resolver.resolve(name);
parameterClient.setParam(resolvedName, value);
}
@Override
public void set(String name, int value) {
set(GraphName.of(name), value);
}
@Override
public void set(GraphName name, double value) {
GraphName resolvedName = resolver.resolve(name);
parameterClient.setParam(resolvedName, value);
}
@Override
public void set(String name, double value) {
set(GraphName.of(name), value);
}
@Override
public void set(GraphName name, String value) {
GraphName resolvedName = resolver.resolve(name);
parameterClient.setParam(resolvedName, value);
}
@Override
public void set(String name, String value) {
set(GraphName.of(name), value);
}
@Override
public void set(GraphName name, List<?> value) {
GraphName resolvedName = resolver.resolve(name);
parameterClient.setParam(resolvedName, value);
}
@Override
public void set(String name, List<?> value) {
set(GraphName.of(name), value);
}
@Override
public void set(GraphName name, Map<?, ?> value) {
GraphName resolvedName = resolver.resolve(name);
parameterClient.setParam(resolvedName, value);
}
@Override
public void set(String name, Map<?, ?> value) {
set(GraphName.of(name), value);
}
private <T> T get(GraphName name, Class<T> type) {
GraphName resolvedName = resolver.resolve(name);
Response<Object> response = parameterClient.getParam(resolvedName);
try {
if (response.getStatusCode() == StatusCode.SUCCESS) {
return type.cast(response.getResult());
}
} catch (ClassCastException e) {
throw new ParameterClassCastException("Cannot cast parameter to: " + type.getName(), e);
}
throw new ParameterNotFoundException("Parameter does not exist: " + name);
}
@SuppressWarnings("unchecked")
private <T> T get(GraphName name, T defaultValue) {
Preconditions.checkNotNull(defaultValue);
GraphName resolvedName = resolver.resolve(name);
Response<Object> response = parameterClient.getParam(resolvedName);
if (response.getStatusCode() == StatusCode.SUCCESS) {
try {
return (T) defaultValue.getClass().cast(response.getResult());
} catch (ClassCastException e) {
throw new ParameterClassCastException("Cannot cast parameter to: "
+ defaultValue.getClass().getName(), e);
}
} else {
return defaultValue;
}
}
@Override
public boolean getBoolean(GraphName name) {
return get(name, Boolean.class);
}
@Override
public boolean getBoolean(String name) {
return getBoolean(GraphName.of(name));
}
@Override
public boolean getBoolean(GraphName name, boolean defaultValue) {
return get(name, defaultValue);
}
@Override
public boolean getBoolean(String name, boolean defaultValue) {
return getBoolean(GraphName.of(name), defaultValue);
}
@Override
public int getInteger(GraphName name) {
return get(name, Integer.class);
}
@Override
public int getInteger(String name) {
return getInteger(GraphName.of(name));
}
@Override
public int getInteger(GraphName name, int defaultValue) {
return get(name, defaultValue);
}
@Override
public int getInteger(String name, int defaultValue) {
return getInteger(GraphName.of(name), defaultValue);
}
@Override
public double getDouble(GraphName name) {
return get(name, Double.class);
}
@Override
public double getDouble(String name) {
return getDouble(GraphName.of(name));
}
@Override
public double getDouble(GraphName name, double defaultValue) {
return get(name, defaultValue);
}
@Override
public double getDouble(String name, double defaultValue) {
return getDouble(GraphName.of(name), defaultValue);
}
@Override
public String getString(GraphName name) {
return get(name, String.class);
}
@Override
public String getString(String name) {
return get(GraphName.of(name), String.class);
}
@Override
public String getString(GraphName name, String defaultValue) {
return get(name, defaultValue);
}
@Override
public String getString(String name, String defaultValue) {
return getString(GraphName.of(name), defaultValue);
}
@Override
public List<?> getList(GraphName name) {
return Arrays.asList(get(name, Object[].class));
}
@Override
public List<?> getList(String name) {
return getList(GraphName.of(name));
}
@Override
public List<?> getList(GraphName name, List<?> defaultValue) {
return Arrays.asList(get(name, defaultValue.toArray()));
}
@Override
public List<?> getList(String name, List<?> defaultValue) {
return getList(GraphName.of(name), defaultValue);
}
@Override
public Map<?, ?> getMap(GraphName name) {
return get(name, Map.class);
}
@Override
public Map<?, ?> getMap(String name) {
return getMap(GraphName.of(name));
}
@Override
public Map<?, ?> getMap(GraphName name, Map<?, ?> defaultValue) {
return get(name, defaultValue);
}
@Override
public Map<?, ?> getMap(String name, Map<?, ?> defaultValue) {
return getMap(GraphName.of(name), defaultValue);
}
}