ApplicationInstance.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of ArmarX.
3  *
4  * Copyright (C) 2011-2016, High Performance Humanoid Technologies (H2T), Karlsruhe Institute of Technology (KIT), all rights reserved.
5  *
6  * ArmarX is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  * ArmarX is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
17  *
18  * @package ArmarXCore::core
19  * @author Dennis Weigelt
20  * @date 2016
21  * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
22  * GNU General Public License
23  */
24 
25 
26 #include "ApplicationInstance.h"
27 
28 #include "../parser/iceparser.h"
35 
36 #include <filesystem>
37 
38 
39 using namespace ScenarioManager;
40 using namespace armarx;
41 
42 const std::string Data_Structure::ApplicationStatus::Stopped = "Stopped";
43 const std::string Data_Structure::ApplicationStatus::Running = "Running";
44 const std::string Data_Structure::ApplicationStatus::Waiting = "Waiting";
45 const std::string Data_Structure::ApplicationStatus::Mixed = "Mixed";
46 const std::string Data_Structure::ApplicationStatus::Unknown = "Unknown";
47 const std::string Data_Structure::ApplicationStatus::Inactive = "Inactive";
48 const std::string Data_Structure::ApplicationStatus::Missing = "Missing";
49 
51 {
52  return configDomain;
53 }
54 
56 {
58  configDomain = value;
59 }
60 
62 {
63  return this->readOnly;
64 }
65 
66 Data_Structure::ApplicationInstance::ApplicationInstance(std::string executableName, std::string executablePath, std::string instanceName, std::string configPath, std::string packageName, ScenarioPtr scenario, std::string node, bool enabled, bool iceAutoRestart)
67  : Application(executableName, executablePath, packageName), instanceName(instanceName)
68  , configPath(configPath)
69  , status(ApplicationStatus::Unknown), nodeName(node), scenario(scenario), pid(-1), statusWriteBlock(false), enabled(enabled), iceAutoRestart(iceAutoRestart)
70 {
71 }
72 
73 
74 Data_Structure::ApplicationInstance::ApplicationInstance(Application application, std::string instanceName, std::string configPath, ScenarioPtr scenario, std::string node, bool enabled, bool iceAutoRestart)
75  : Application(application),
76  instanceName(instanceName),
77  configPath(configPath),
78  status(ApplicationStatus::Unknown),
79  nodeName(node),
80  scenario(scenario),
81  pid(-1),
82  statusWriteBlock(false),
84  iceAutoRestart(iceAutoRestart)
85 {
86 }
87 
89 {
90  return scenario;
91 }
92 
94 {
95  return this->instanceName;
96 }
97 
99 {
100  this->instanceName = newName;
101 }
102 
104 {
105  return this->configPath;
106 }
107 
109 {
110  this->configPath = configPath;
111 }
112 
114 {
115  std::filesystem::path scenariosFolder(scenario->getPackage()->getScenarioPath());
116  std::filesystem::path scenarioFolder = scenariosFolder / scenario->getName();
117  std::filesystem::path scenarioCfgFolder = scenarioFolder / "config";
118 
119  std::filesystem::path configPath = scenarioCfgFolder;
120 
121  if (!this->instanceName.empty() && this->instanceName != R"("")" && this->instanceName != R"(" ")")
122  {
123  configPath = configPath / (this->getName() + "." + this->getInstanceName() + ".cfg");
124  }
125  else
126  {
127  configPath = configPath / (this->getName() + ".cfg");;
128  }
129 
130  if (configPath != this->configPath)
131  {
132  std::filesystem::remove(std::filesystem::path(this->configPath));
133  }
134  this->configPath = configPath.string();
135 }
136 
138 {
139  return this->status;
140 }
141 
143 {
144  bool result = status != this->status;
145  if (result)
146  {
147  this->status = status;
148  }
149  return result;
150 }
151 
153 {
154  return this->pid;
155 }
156 
157 void Data_Structure::ApplicationInstance::setPid(int pid) // if PID < -1 Error?
158 {
159  this->pid = pid;
160 }
161 
163 {
164  if (!properties->isPropertySet(name))
165  {
166  properties->defineOptionalProperty(name, std::string("::NOT_DEFINED::"), "Custom Property");
167  }
168  properties->getProperties()->setProperty(name, value);
169 }
170 
171 void Data_Structure::ApplicationInstance::addProperty(std::string name, std::string value)
172 {
173  if (!properties->isPropertySet(name))
174  {
175  properties->defineOptionalProperty(name, std::string("::NOT_DEFINED::"), "Custom Property");
176  }
177  properties->getProperties()->setProperty(name, value);
178 }
179 
181 {
183  parser.saveCfg(shared_from_this());
184 }
185 
187 {
188  if (!isReadOnly())
189  {
190  return;
191  }
192 
193  if (!std::filesystem::is_symlink(configPath))
194  {
195  ARMARX_WARNING << "Make local called on non-linked application";
196  return;
197  }
198 
199  std::filesystem::remove(configPath);
200  this->save();
201  // Reload to register status changes
202  this->load();
203 }
204 
206 {
207  deleteConfig();
208  load(true);
209  auto target_path = other.configPath.lexically_relative(configPath.parent_path());
210  std::filesystem::create_symlink(target_path, configPath);
211  load();
212 }
213 
215 {
216  deleteConfig();
217  load(true);
218  std::filesystem::copy_file(other.configPath, configPath,
219  std::filesystem::copy_options::overwrite_existing);
220  load();
221 }
222 
224 {
225  if (std::filesystem::exists(this->configPath))
226  {
227  std::filesystem::remove(this->configPath);
228  }
229 }
230 
232 {
233  if (!std::filesystem::exists(configPath))
234  {
235  ARMARX_WARNING_S << "Cannot find ApplicationInstance Config at:" << configPath;
236  }
237  else
238  {
240  setProperties(parser.mergeXmlAndCfg(shared_from_this(), firstLoad));
241  }
242 
243  // If the config file is a symlink, put app into read-only mode
244  this->readOnly = std::filesystem::is_symlink(configPath);
245 }
246 
248 {
249  std::ofstream ofs;
250 
251  ofs.open(configPath.c_str(), std::ofstream::out | std::ofstream::app);
252  ARMARX_DEBUG << configPath << " is writeable: " << ofs.is_open();
253 
254  return ofs.is_open();
255 }
256 
258 {
259  return statusWriteBlock;
260 }
261 
263 {
264  statusWriteBlock = blocked;
265 }
266 
268 {
269  return nodeName;
270 }
271 
273 {
274  return nodeName.empty() && scenario ? scenario->getNodeName() : nodeName;
275 }
276 
278 {
279  this->nodeName = nodeName;
280 }
281 
283 {
284  return enabled;
285 }
286 
288 {
289  this->enabled = enabled;
290 }
291 
293 {
294  return iceAutoRestart;
295 }
296 
298 {
299  this->iceAutoRestart = enabled;
300 }
ScenarioManager::Data_Structure::ScenarioPtr
std::shared_ptr< Scenario > ScenarioPtr
Definition: Scenario.h:36
ScenarioManager::Data_Structure::ApplicationInstance::getPid
int getPid()
Definition: ApplicationInstance.cpp:152
ScenarioManager::Data_Structure::ApplicationInstance::modifyProperty
void modifyProperty(std::string name, std::string value)
Changes the value of the specified property.
Definition: ApplicationInstance.cpp:162
ScenarioManager::Data_Structure::ApplicationInstance::setIceAutoRestart
void setIceAutoRestart(bool enabled)
Definition: ApplicationInstance.cpp:297
ScenarioManager::Data_Structure::ApplicationInstance
Class containing data about the instance of an application. Provides methods to get and set the data....
Definition: ApplicationInstance.h:63
ScenarioManager::Data_Structure::ApplicationInstance::getNodeName
std::string getNodeName() const
Definition: ApplicationInstance.cpp:267
PropertyDefinitionContainerFormatter.h
ScenarioManager::Parser::IceParser
Definition: iceparser.h:37
ScenarioManager::Data_Structure::ApplicationStatus
Definition: ApplicationInstance.h:45
ScenarioManager::Data_Structure::ApplicationStatus::Stopped
static const std::string Stopped
Definition: ApplicationInstance.h:47
ScenarioManager::Data_Structure::ApplicationInstance::getEffectiveNodeName
std::string getEffectiveNodeName() const
Definition: ApplicationInstance.cpp:272
ScenarioManager::Data_Structure::ApplicationInstance::setStatus
bool setStatus(const std::string &status)
Sets the status of this ApplicationInstance.
Definition: ApplicationInstance.cpp:142
PropertyDefinitionFormatter.h
ScenarioManager::Data_Structure::ApplicationStatus::Missing
static const std::string Missing
Definition: ApplicationInstance.h:53
ScenarioManager::Data_Structure::ApplicationStatus::Running
static const std::string Running
Definition: ApplicationInstance.h:48
ScenarioManager::Data_Structure::ApplicationInstance::setConfigDomain
void setConfigDomain(const std::string &value)
Definition: ApplicationInstance.cpp:55
ScenarioManager::Data_Structure::ApplicationInstance::getScenario
ScenarioPtr getScenario()
Definition: ApplicationInstance.cpp:88
ScenarioManager::Data_Structure::ApplicationInstance::ApplicationInstance
ApplicationInstance(std::string executableName, std::string executablePath, std::string instanceName, std::string configPath, std::string packageName, ScenarioPtr scenarioName, std::string node, bool enabled, bool iceAutoRestart)
Constructor that sets the base data of this ApplicationInstance.
ScenarioManager::Data_Structure::Application
Class containing data about an application Provides methods to get and set the date contained in the ...
Definition: Application.h:45
ScenarioManager::Data_Structure::ApplicationInstance::setInstanceName
void setInstanceName(std::string newName)
Sets the name of this ApplicationInstance.
Definition: ApplicationInstance.cpp:98
ScenarioManager::Data_Structure::ApplicationInstance::getConfigDomain
std::string getConfigDomain() const
Definition: ApplicationInstance.cpp:50
armarx::navigation::algorithms::save
bool save(const Costmap &costmap, const std::filesystem::path &directory)
Definition: persistence.cpp:101
ScenarioManager::Data_Structure::ApplicationInstance::getStatus
std::string getStatus()
Returns the status.
Definition: ApplicationInstance.cpp:137
armarx::status
status
Definition: FiniteStateMachine.h:259
cxxopts::value
std::shared_ptr< Value > value()
Definition: cxxopts.hpp:926
ScenarioManager::Data_Structure::ApplicationInstance::deleteConfig
void deleteConfig()
Definition: ApplicationInstance.cpp:223
ScenarioManager::Data_Structure::ApplicationInstance::getIceAutoRestart
bool getIceAutoRestart()
Definition: ApplicationInstance.cpp:292
ARMARX_DEBUG
#define ARMARX_DEBUG
Definition: Logging.h:177
ScenarioManager::Data_Structure::ApplicationInstance::resetConfigPath
void resetConfigPath()
resetConfigPath.
Definition: ApplicationInstance.cpp:113
PropertyDefinitionConfigFormatter.h
ScenarioManager::Data_Structure::ApplicationStatus::Waiting
static const std::string Waiting
Definition: ApplicationInstance.h:49
ScenarioManager::Data_Structure::ApplicationInstance::getConfigPath
std::string getConfigPath()
Definition: ApplicationInstance.cpp:103
enabled
std::atomic< bool > * enabled
Definition: RemoteGuiWidgetController.cpp:75
ScenarioManager::Data_Structure::ApplicationInstance::setPid
void setPid(int pid)
Sets the pid of this ApplicationInstance.
Definition: ApplicationInstance.cpp:157
ScenarioManager::Data_Structure::ApplicationInstance::isConfigWritable
bool isConfigWritable()
Definition: ApplicationInstance.cpp:247
ScenarioManager::Data_Structure::ApplicationStatus::Inactive
static const std::string Inactive
Definition: ApplicationInstance.h:52
ScenarioManager::Data_Structure::ApplicationInstance::copyFrom
void copyFrom(ApplicationInstance &other)
copyFrom Copy the other instance configuration to this one.
Definition: ApplicationInstance.cpp:214
ScenarioManager::Data_Structure::ApplicationStatus::Mixed
static const std::string Mixed
Definition: ApplicationInstance.h:50
ScenarioManager::Data_Structure::ApplicationStatus::Unknown
static const std::string Unknown
Definition: ApplicationInstance.h:51
ScenarioManager::Data_Structure::ApplicationInstance::setStatusWriteBlock
void setStatusWriteBlock(bool blocked)
Definition: ApplicationInstance.cpp:262
armarx::Application
Baseclass for all ArmarX applications.
Definition: Application.h:193
ARMARX_WARNING_S
#define ARMARX_WARNING_S
Definition: Logging.h:206
ScenarioManager::Data_Structure::ApplicationInstance::addProperty
void addProperty(std::string name, std::string value)
Adds a new property with the specified name and value to this ApplicationInstance.
Definition: ApplicationInstance.cpp:171
ApplicationInstance.h
ScenarioManager::Data_Structure::ApplicationInstance::save
void save()
Saves the IceProperties to the configPath.
Definition: ApplicationInstance.cpp:180
ExpressionException.h
ScenarioManager::Data_Structure::ApplicationInstance::getInstanceName
std::string getInstanceName()
Definition: ApplicationInstance.cpp:93
IceStorm::parser
Parser * parser
Definition: Parser.cpp:33
ARMARX_CHECK_EXPRESSION
#define ARMARX_CHECK_EXPRESSION(expression)
This macro evaluates the expression and if it turns out to be false it will throw an ExpressionExcept...
Definition: ExpressionException.h:73
ScenarioManager
Definition: Application.cpp:166
ScenarioManager::Data_Structure::ApplicationInstance::setEnabled
void setEnabled(bool enabled)
Definition: ApplicationInstance.cpp:287
ScenarioManager::Data_Structure::ApplicationInstance::load
void load(bool firstLoad=false)
Loades the IceProperties from the configPath Firstload determins if properties that equal their defau...
Definition: ApplicationInstance.cpp:231
ScenarioManager::Data_Structure::ApplicationInstance::getEnabled
bool getEnabled()
Definition: ApplicationInstance.cpp:282
ScenarioManager::Data_Structure::ApplicationInstance::getStatusWriteBlock
bool getStatusWriteBlock()
Definition: ApplicationInstance.cpp:257
ScenarioManager::Data_Structure::ApplicationInstance::makeLocal
void makeLocal()
Make a local copy of this instance if it is linked and nothing otherwise.
Definition: ApplicationInstance.cpp:186
ScenarioManager::Data_Structure::ApplicationInstance::linkFrom
void linkFrom(ApplicationInstance &other)
linkFrom Link this instance configuration from the other instance.
Definition: ApplicationInstance.cpp:205
Logging.h
ScenarioManager::Data_Structure::ApplicationInstance::isReadOnly
bool isReadOnly() const
Definition: ApplicationInstance.cpp:61
ARMARX_WARNING
#define ARMARX_WARNING
Definition: Logging.h:186
armarx::armem::server::ltm::mongodb::util::load
void load(const mongocxx::database &db, armem::wm::Memory &m)
Definition: operations.cpp:40
armarx
This file offers overloads of toIce() and fromIce() functions for STL container types.
Definition: ArmarXTimeserver.cpp:28
ScenarioManager::Data_Structure::ApplicationInstance::setNodeName
void setNodeName(std::string nodeName)
Definition: ApplicationInstance.cpp:277
ScenarioManager::Data_Structure::ApplicationInstance::setConfigPath
void setConfigPath(std::string configPath)
Sets the config path of this ApplicationInstance.
Definition: ApplicationInstance.cpp:108