diff --git a/rosjava_helpers/src/main/java/org/ros/helpers/ParameterLoaderNode.java b/rosjava_helpers/src/main/java/org/ros/helpers/ParameterLoaderNode.java index 25fcdd647e4573ddb8936f08975a80c5e296329c..3e8f8a4bf819da68fd8b343757fb9d249fc48639 100644 --- a/rosjava_helpers/src/main/java/org/ros/helpers/ParameterLoaderNode.java +++ b/rosjava_helpers/src/main/java/org/ros/helpers/ParameterLoaderNode.java @@ -16,6 +16,8 @@ package org.ros.helpers; +import com.google.common.base.Preconditions; + import org.apache.commons.logging.Log; import org.ros.namespace.GraphName; import org.ros.node.AbstractNodeMain; @@ -47,36 +49,39 @@ public class ParameterLoaderNode extends AbstractNodeMain { * Default constructor * @param resources Array of resources with their respective namespace to load. */ - public ParameterLoaderNode(ArrayList<Resource> resources) { + public ParameterLoaderNode(List<Resource> resources) { + Preconditions.checkNotNull(resources); for (Resource r : resources) { + Preconditions.checkNotNull(r.inputStream); addSingleYmlInput(r.inputStream, r.namespace == null ? "" : r.namespace); } } private void addSingleYmlInput(InputStream ymlInputStream, String namespace) { - this.params.add(new LoadedResource((new Yaml()).load(ymlInputStream), namespace)); + Object loadedYaml = new Yaml().load(ymlInputStream); + if (loadedYaml != null && loadedYaml instanceof Map<?, ?>) { + this.params.add(new LoadedResource(Map.class.cast(loadedYaml), namespace)); + } } - @SuppressWarnings("unchecked") - private void addParams(ParameterTree parameterTree, String namespace, Map<String, Object> params) { - for (Map.Entry<String, Object> e : params.entrySet()) { - String fullKeyName = namespace + "/" + e.getKey(); + private void addParams(ParameterTree parameterTree, String namespace, Map<?, ?> params) { + for (Map.Entry<?, ?> e : params.entrySet()) { + String fullKeyName = namespace + "/" + e.getKey().toString(); if (log != null) { - log.info("Loading parameter " + fullKeyName + " \nValue = " + e.getValue()); + log.debug("Loading parameter " + fullKeyName + " \nValue = " + e.getValue()); } - if (e.getValue() instanceof String) { - parameterTree.set(fullKeyName, (String)e.getValue()); + parameterTree.set(fullKeyName, String.class.cast(e.getValue())); } else if (e.getValue() instanceof Integer) { - parameterTree.set(fullKeyName, (Integer)e.getValue()); + parameterTree.set(fullKeyName, Integer.class.cast(e.getValue())); } else if (e.getValue() instanceof Double) { - parameterTree.set(fullKeyName, (Double)e.getValue()); + parameterTree.set(fullKeyName, Double.class.cast(e.getValue())); } else if (e.getValue() instanceof Map) { - parameterTree.set(fullKeyName, (Map)e.getValue()); + parameterTree.set(fullKeyName, Map.class.cast(e.getValue())); } else if (e.getValue() instanceof Boolean) { - parameterTree.set(fullKeyName, (Boolean)e.getValue()); + parameterTree.set(fullKeyName, Boolean.class.cast(e.getValue())); } else if (e.getValue() instanceof List) { - parameterTree.set(fullKeyName, (List)e.getValue()); + parameterTree.set(fullKeyName, List.class.cast(e.getValue())); } else if (log != null) { log.debug("I don't know what type parameter " + fullKeyName + " is. Value = " + e.getValue()); log.debug("Class name is: " + e.getValue().getClass().getName()); @@ -95,18 +100,16 @@ public class ParameterLoaderNode extends AbstractNodeMain { @Override public void onStart(ConnectedNode connectedNode) { - if (params != null) { - ParameterTree parameterTree = connectedNode.getParameterTree(); - log = connectedNode.getLog(); - - // TODO: For some reason, setting the / param when using a rosjava master doesn't work - // It does work fine with an external master, and also setting other params of any type - for (LoadedResource r : params) { - addParams(parameterTree, r.namespace, r.resource); - } + ParameterTree parameterTree = connectedNode.getParameterTree(); + log = connectedNode.getLog(); - connectedNode.shutdown(); + // TODO: For some reason, setting the / param when using a rosjava master doesn't work + // It does work fine with an external master, and also setting other params of any type + for (LoadedResource r : params) { + addParams(parameterTree, r.namespace, r.resource); } + + connectedNode.shutdown(); } /** @@ -128,11 +131,11 @@ public class ParameterLoaderNode extends AbstractNodeMain { * keep the code simple. */ private class LoadedResource { - public Map<String, Object> resource; - public String namespace; + private Map<?, ?> resource; + private String namespace; - LoadedResource(Object resource, String namespace) { - this.resource = (Map<String, Object>) resource; + LoadedResource(Map resource, String namespace) { + this.resource = resource; this.namespace = namespace; } }