/*
* Copyright (C) 2012 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.osgi.common;
import org.apache.commons.logging.Log;
import org.ros.master.uri.MasterUriProvider;
import org.ros.node.ConnectedNode;
import org.ros.node.NodeConfiguration;
import org.ros.node.NodeListener;
import org.ros.node.NodeMain;
import java.net.URI;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ScheduledExecutorService;
/**
* A ROS environment.
*
* <p>
* This contains the node configuration to use and access to the environments
* thread pools.
*
* @author Keith M. Hughes
*/
public interface RosEnvironment {
/**
* The separator between ROS names, e.g. node names, topic names.
*/
String ROS_NAME_SEPARATOR = "/";
/**
* Name the ROS node will have as its base name.
*/
String CONFIGURATION_ROS_NODE_NAME = "org.ros.node.name";
/**
* The host this node is running on. Can either be a resolvable domain name or
* an IP address.
*/
String CONFIGURATION_ROS_HOST = "org.ros.host";
/**
* URI of the ROS Master.
*/
String CONFIGURATION_ROS_MASTER_URI = "org.ros.master.uri";
/**
* Configuration property giving the ROS container type.
*/
String CONFIGURATION_ROS_CONTAINER_TYPE = "org.ros.container.type";
/**
* Configuration property value for the master ROS container type.
*/
String CONFIGURATION_ROS_CONTAINER_TYPE_MASTER = "master";
/**
* Configuration property value for the node ROS container type.
*/
String CONFIGURATION_ROS_CONTAINER_TYPE_NODE = "node";
/**
* Configuration property giving the ROS network type, e.g. prod, dev, local.
*/
String CONFIGURATION_ROS_NETWORK_TYPE = "org.ros.network.type";
/**
* Get the node configuration to be used as a public node for this
* environment.
*
* @return the public node configuration
*/
NodeConfiguration getPublicNodeConfiguration();
/**
* Get a public node configuration where names will be resolved via the node
* name returned by {@link #getNodeName()}.
*
* @return the public node configuration
*/
NodeConfiguration getPublicNodeConfigurationWithNodeName();
/**
* Get a public node configuration where names will be resolved via the node
* name returned by {@link #getNodeName()} plus the additional subname.
*
* <p>
* For example, if {@link #getNodeName()} returns {@code /foobar}, the node
* name will be rooted at {@code /foobar/subname}.
*
* @param subname
* The next level of node name.
*
* @return the public node configuration
*/
NodeConfiguration getPublicNodeConfigurationWithNodeName(String subname);
/**
* Get the node configuration to be used as a private node for this
* environment.
*
* @return
*/
NodeConfiguration getPrivateNodeConfiguration();
/**
* Create a node from the given node configuration.
*
* @param configuration
* the configuration describing the node
*
* @return a newly created node.
*/
ConnectedNode newNode(NodeConfiguration configuration);
/**
* Create a node from the given node configuration with the given set of node
* listeners.
*
* @param configuration
* the configuration describing the node
* @param listeners
* the listeners to add to the node on creation
*
* @return a newly created node.
*/
ConnectedNode newNode(NodeConfiguration nodeConfiguration, Collection<NodeListener> listeners);
/**
* Run a node in the environment.
*
* @param node
* The node to run
* @param configuration
* Configuration to run the node in.
*/
void executeNodeMain(NodeMain node, NodeConfiguration configuration);
/**
* Get the name of the node for this environment.
*
* @return
*/
String getNodeName();
/**
* Get the master URI.
*
* <p>
* All {@link NodeConfiguration} instances returned by this instance will have
* this master URI.
*
* @return The master URI.
*/
URI getMasterUri();
/**
* Get the host ROS is running on.
*
* <p>
* All {@link NodeConfiguration} instances returned by this instance will have
* this host.
*
* @return The host.
*/
String getHost();
/**
* Get the executor service being used by the container.
*
* @return
*/
ScheduledExecutorService getExecutorService();
/**
* Get the container logger.
*
* @return
*/
Log getLog();
/**
* Get the value of a property from the ROS environment.
*
* @param property
* the name of the property
*
* @return the value if the property if it exists, or {@code null}
*/
String getProperty(String property);
/**
* Set the value of a property in the ROS environment.
*
* @param property
* the name of the property
*
* @param value
* the value if the property
*/
void setProperty(String property, String value);
/**
* Add a collection of name/value properties to the ROS environment.
*
* @param properties
* a collection of name/value pairs of properties
*/
void setProperties(Map<String, String> properties);
/**
* Is this environment a master environment?
*
* @return
*/
boolean isMaster();
/**
* Set the master URI provider the environment will use.
*
* @param masterUriProvider
*/
void setMasterUriProvider(MasterUriProvider masterUriProvider);
/**
* Get the network type for the ROS graph.
*
* <p>
* This allows distinguishing between ROS Masters, e.g. localdev, prod,
* fredbot.
*
* @return
*/
String getNetworkType();
}