Scenario.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 "Scenario.h"
27 
28 #include <filesystem>
29 #include <fstream>
30 
31 #include <Ice/Properties.h>
32 
35 
36 #include "../parser/XMLScenarioParser.h"
37 
38 using namespace ScenarioManager;
39 
40 Data_Structure::Scenario::Scenario(const std::string& name,
41  const std::string& creationTime,
42  const std::string& lastChangedTime,
43  const PackagePtr& package,
44  const std::string& globalConfigName,
45  const std::string& subfolder) :
46  name(name),
47  creationTime(creationTime),
48  lastChangedTime(lastChangedTime),
49  globalConfigName(globalConfigName),
50  subfolder(subfolder),
51  nodeName("NodeMain"),
52  package(package),
53  applications(new std::vector<ApplicationInstancePtr>()),
54  globalConfig(new armarx::PropertyDefinitionContainer(name))
55 {
57  auto* cfgInternal = dynamic_cast<armarx::IceProperties*>(cfgProperties.get());
58  cfgInternal->setInheritanceSolver(nullptr);
59 
60  globalConfig->setProperties(cfgProperties);
61  globalConfig->setPrefix("");
62  globalConfig->setDescription("Global Config from Scenario " + name);
63 }
64 
65 std::string
67 {
68  return this->name;
69 }
70 
71 void
72 Data_Structure::Scenario::setName(std::string scenarioName)
73 {
74  name = std::move(scenarioName);
75 }
76 
77 std::string
79 {
80  return this->creationTime;
81 }
82 
83 std::string
85 {
86  return this->lastChangedTime;
87 }
88 
89 std::string
91 {
92  return globalConfigName;
93 }
94 
95 std::string
97 {
98  return subfolder;
99 }
100 
101 std::string
103 {
104  std::string scenarioPath = package.lock()->getScenarioPath();
105 
106  if (subfolder.empty())
107  {
108  scenarioPath.append("/").append(name).append("/").append(name).append(".scx");
109  }
110  else
111  {
112  scenarioPath.append("/")
113  .append(subfolder)
114  .append("/")
115  .append(name)
116  .append("/")
117  .append(name)
118  .append(".scx");
119  }
120 
121  return scenarioPath;
122 }
123 
124 std::string
126 {
127  std::string scenarioPath = package.lock()->getScenarioPath();
128 
129  scenarioPath.append("/").append(name);
130 
131  return scenarioPath;
132 }
133 
134 bool
136 {
137  std::ofstream ofs;
138  ofs.open(getPath().c_str(), std::ofstream::out | std::ofstream::app);
139  ARMARX_DEBUG << getPath() << " is writeable: " << ofs.is_open();
140 
141  return ofs.is_open();
142 
143  std::filesystem::file_status s = std::filesystem::status(std::filesystem::path(getPath()));
144  if ((s.permissions() & std::filesystem::perms::owner_write) != std::filesystem::perms::none)
145  {
146  return true;
147  }
148  return false;
149 }
150 
153 {
154  return package.lock();
155 }
156 
157 std::string
159 {
160  std::string status = ApplicationStatus::Unknown;
161  for (const auto& app : *applications)
162  {
163  if (!app->getEnabled())
164  {
165  continue;
166  }
167  if (status == ApplicationStatus::Unknown && app->getStatus() == ApplicationStatus::Running)
168  {
170  }
171  else if (status == ApplicationStatus::Unknown &&
172  app->getStatus() == ApplicationStatus::Stopped)
173  {
175  }
176  else if (status == ApplicationStatus::Unknown &&
177  app->getStatus() == ApplicationStatus::Inactive)
178  {
180  }
181  else if (status == ApplicationStatus::Running &&
182  app->getStatus() == ApplicationStatus::Running)
183  {
185  }
186  else if (status == ApplicationStatus::Stopped &&
187  app->getStatus() == ApplicationStatus::Stopped)
188  {
190  }
191  else if (status == ApplicationStatus::Inactive &&
192  app->getStatus() == ApplicationStatus::Inactive)
193  {
195  }
196  else if ((status == ApplicationStatus::Running &&
197  app->getStatus() == ApplicationStatus::Stopped) ||
199  app->getStatus() == ApplicationStatus::Running) ||
201  app->getStatus() == ApplicationStatus::Inactive) ||
203  app->getStatus() == ApplicationStatus::Inactive) ||
205  app->getStatus() == ApplicationStatus::Running) ||
207  app->getStatus() == ApplicationStatus::Stopped))
208  {
210  break;
211  }
212  else if (app->getStatus() == ApplicationStatus::Waiting)
213  {
215  break;
216  }
217  else if (app->getStatus() == ApplicationStatus::Unknown)
218  {
220  break;
221  }
222  else
223  {
225  break;
226  }
227  }
228 
229  return status;
230 }
231 
232 void
234 {
235  this->lastChangedTime = std::move(time);
236 }
237 
238 void
240 {
241  globalConfigName = std::move(configName);
242 }
243 
246 {
247  return applications;
248 }
249 
252 {
253  for (auto app : *applications)
254  {
255  if (app->getName() == appName)
256  {
257  return app;
258  }
259  }
260 
261  return {nullptr};
262 }
263 
264 void
266 {
267  applications->push_back(application);
268 }
269 
270 void
272  const Data_Structure::ApplicationInstancePtr& application) //?
273 {
274  for (auto iter = applications->begin(); iter != applications->end(); ++iter)
275  {
276  if (*iter == application)
277  {
278  (*iter)->deleteConfig();
279  applications->erase(iter);
280  return;
281  }
282  }
283 }
284 
285 void
286 Data_Structure::Scenario::save(bool saveApplications)
287 {
289  parser.saveScenario(shared_from_this(), saveApplications);
290 }
291 
292 void
294 {
295  if (!isReadOnly())
296  {
297  return;
298  }
299 
300  if (!std::filesystem::is_symlink(getGlobalConfigPath()))
301  {
302  ARMARX_WARNING << "Make local called on non-linked global scenario config";
303  return;
304  }
305 
306  std::filesystem::remove(getGlobalConfigPath());
307  this->save();
308  // Reload to register status changes
309  this->reloadGlobalConf();
310 }
311 
312 bool
314 {
315  return std::filesystem::is_symlink(getGlobalConfigPath());
316 }
317 
318 void
320 {
321  for (const auto& it : *applications)
322  {
323  it->load();
324  }
325 }
326 
327 void
329 {
330  if (isGlobalConfigFileexistent())
331  {
332  globalConfig->getProperties()->load(getGlobalConfigPath());
333  }
334 }
335 
338 {
339  return globalConfig;
340 }
341 
342 std::string
344 {
345  std::filesystem::path scenarioPath;
346  if (subfolder.empty())
347  {
348  scenarioPath = std::filesystem::path(
349  package.lock()->getScenarioPath().append("/").append(name).append("/"));
350  }
351  else
352  {
353  scenarioPath = std::filesystem::path(package.lock()
354  ->getScenarioPath()
355  .append("/")
356  .append(subfolder + "/")
357  .append(name)
358  .append("/"));
359  }
360 
361  scenarioPath =
362  scenarioPath /
363  std::filesystem::path(globalConfigName.empty() ? "./config/global.cfg" : globalConfigName);
364  return scenarioPath.string();
365 }
366 
367 bool
369 {
370  std::ofstream ofs;
371  ofs.open(getGlobalConfigPath().c_str(), std::ofstream::out | std::ofstream::app);
372  ARMARX_DEBUG << getGlobalConfigPath() << " is writeable: " << ofs.is_open();
373 
374  return ofs.is_open();
375 }
376 
377 bool
379 {
380  return std::filesystem::exists(std::filesystem::path(getGlobalConfigPath()));
381 }
382 
383 bool
385 {
386  for (const auto& app : *applications)
387  {
388  if (app->getStatusWriteBlock())
389  {
390  return true;
391  }
392  }
393  return false;
394 }
395 
396 void
398 {
399  for (const auto& app : *applications)
400  {
401  app->setStatusWriteBlock(state);
402  }
403 }
404 
405 std::vector<std::string>
407 {
408  std::vector<std::string> result;
409  for (const auto& app : *applications)
410  {
411  result.push_back(app->getEffectiveNodeName());
412  }
413  return result;
414 }
415 
416 bool
418 {
419  for (const auto& app : *applications)
420  {
421  app->updateFound();
422  if (!app->getFound())
423  {
424  return false;
425  }
426  }
427  return true;
428 }
429 
430 std::string
432 {
433  return nodeName;
434 }
435 
436 void
438 {
439  nodeName = value;
440 }
ScenarioManager::Data_Structure::Scenario::getName
std::string getName()
Definition: Scenario.cpp:66
ScenarioManager::Data_Structure::Scenario::getGlobalConfigPath
std::string getGlobalConfigPath()
Definition: Scenario.cpp:343
ScenarioManager::Data_Structure::ApplicationInstancePtr
std::shared_ptr< ApplicationInstance > ApplicationInstancePtr
Definition: ApplicationInstance.h:33
ScenarioManager::Data_Structure::Scenario::getGlobalConfig
armarx::PropertyDefinitionsPtr getGlobalConfig()
Definition: Scenario.cpp:337
ScenarioManager::Data_Structure::Scenario::addApplication
void addApplication(const ApplicationInstancePtr &application)
Adds an Application to this scenario.
Definition: Scenario.cpp:265
Scenario.h
ScenarioManager::Data_Structure::ApplicationInstanceVectorPtr
std::shared_ptr< std::vector< ApplicationInstancePtr > > ApplicationInstanceVectorPtr
Definition: ApplicationInstance.h:35
ScenarioManager::Data_Structure::Scenario::setNodeName
void setNodeName(const std::string &value)
Definition: Scenario.cpp:437
ScenarioManager::Data_Structure::Scenario::setName
void setName(std::string name)
Definition: Scenario.cpp:72
ScenarioManager::Data_Structure::Scenario::setLastChangedTime
void setLastChangedTime(std::string time)
Sets the last-changed-time to now.
Definition: Scenario.cpp:233
ScenarioManager::Parser::XMLScenarioParser
This class provides different methods to parse and save scenario data in XML-Files....
Definition: XMLScenarioParser.h:58
ScenarioManager::Data_Structure::ApplicationStatus::Stopped
static const std::string Stopped
Definition: ApplicationInstance.h:47
ScenarioManager::Data_Structure::Scenario::getPath
std::string getPath()
Definition: Scenario.cpp:102
ScenarioManager::Data_Structure::Scenario::makeLocalGlobalConfig
void makeLocalGlobalConfig()
Definition: Scenario.cpp:293
ScenarioManager::Data_Structure::Scenario::reloadGlobalConf
void reloadGlobalConf()
Definition: Scenario.cpp:328
ScenarioManager::Data_Structure::ApplicationStatus::Running
static const std::string Running
Definition: ApplicationInstance.h:48
ScenarioManager::Data_Structure::Scenario::getStatus
std::string getStatus()
Definition: Scenario.cpp:158
ScenarioManager::Data_Structure::Scenario::allApplicationsFound
bool allApplicationsFound()
Definition: Scenario.cpp:417
IceInternal::Handle<::Ice::Properties >
armarx::navigation::algorithms::save
bool save(const Costmap &costmap, const std::filesystem::path &directory)
Definition: persistence.cpp:114
ScenarioManager::Data_Structure::Scenario::save
void save(bool saveApplications=true)
Definition: Scenario.cpp:286
ScenarioManager::Data_Structure::Scenario::getApplications
ApplicationInstanceVectorPtr getApplications()
Definition: Scenario.cpp:245
armarx::status
status
Definition: FiniteStateMachine.h:244
cxxopts::value
std::shared_ptr< Value > value()
Definition: cxxopts.hpp:855
ScenarioManager::Data_Structure::Scenario::getFolder
std::string getFolder()
Definition: Scenario.cpp:125
ScenarioManager::Data_Structure::Scenario::reloadAppInstances
void reloadAppInstances()
Definition: Scenario.cpp:319
ScenarioManager::Data_Structure::PackagePtr
std::shared_ptr< Package > PackagePtr
Definition: Package.h:122
ScenarioManager::Data_Structure::Scenario::getNodeName
std::string getNodeName() const
Definition: Scenario.cpp:431
ScenarioManager::Data_Structure::Scenario::getSubfolder
std::string getSubfolder()
Definition: Scenario.cpp:96
ARMARX_DEBUG
#define ARMARX_DEBUG
Definition: Logging.h:184
ScenarioManager::Data_Structure::Scenario::removeApplication
void removeApplication(const ApplicationInstancePtr &application)
Removes an Application from this scenario.
Definition: Scenario.cpp:271
ScenarioManager::Data_Structure::ApplicationStatus::Waiting
static const std::string Waiting
Definition: ApplicationInstance.h:49
armarx::IceProperties::create
static Ice::PropertiesPtr create(const Ice::PropertiesPtr &iceProperties=nullptr)
Definition: IceProperties.cpp:35
ScenarioManager::Data_Structure::ApplicationStatus::Inactive
static const std::string Inactive
Definition: ApplicationInstance.h:52
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::Scenario::getCreationTime
std::string getCreationTime()
SCENARIO_H.
Definition: Scenario.cpp:78
ScenarioManager::Data_Structure::Scenario::getGlobalConfigName
std::string getGlobalConfigName()
Definition: Scenario.cpp:90
ScenarioManager::Data_Structure::Scenario::getStatusWriteBlock
bool getStatusWriteBlock()
Definition: Scenario.cpp:384
armarx::IceProperties::setInheritanceSolver
virtual void setInheritanceSolver(const InheritanceSolverPtr &inheritanceSolver)
Sets an inheritance solver in case of testing or using a non-default solver.
Definition: IceProperties.cpp:233
ScenarioManager::Data_Structure::Scenario::isGlobalConfigFileexistent
bool isGlobalConfigFileexistent()
Definition: Scenario.cpp:378
armarx::IceProperties
IceProperties stores ice properties and resolves property inheritance.
Definition: IceProperties.h:120
IceStorm::parser
Parser * parser
Definition: Parser.cpp:34
ScenarioManager::Data_Structure::Scenario::getAllDeploymendNodeNames
std::vector< std::string > getAllDeploymendNodeNames()
Definition: Scenario.cpp:406
ScenarioManager::Data_Structure::Scenario::isScenarioFileWriteable
bool isScenarioFileWriteable()
Definition: Scenario.cpp:135
ScenarioManager::Data_Structure::Scenario::isReadOnly
bool isReadOnly()
Definition: Scenario.cpp:313
ScenarioManager
Definition: Application.cpp:180
ScenarioManager::Data_Structure::Scenario::getPackage
PackagePtr getPackage()
Definition: Scenario.cpp:152
std
Definition: Application.h:66
IceUtil::Handle< class PropertyDefinitionContainer >
ScenarioManager::Data_Structure::Scenario::isGlobalConfigWritable
bool isGlobalConfigWritable()
Definition: Scenario.cpp:368
ScenarioManager::Data_Structure::Scenario::getLastChangedTime
std::string getLastChangedTime()
Definition: Scenario.cpp:84
ScenarioManager::Data_Structure::Scenario::setGlobalConfigName
void setGlobalConfigName(std::string name)
Definition: Scenario.cpp:239
ScenarioManager::Data_Structure::Scenario::setStatusWriteBlock
void setStatusWriteBlock(bool state)
Definition: Scenario.cpp:397
ScenarioManager::Data_Structure::Scenario::Scenario
Scenario(const std::string &name, const std::string &creationTime, const std::string &lastChangedTime, const PackagePtr &package, const std::string &globalConfigName="./config/global.cfg", const std::string &subfolder="")
Constructor that sets some base information about the scenario.
Definition: Scenario.cpp:40
Logging.h
ARMARX_WARNING
#define ARMARX_WARNING
Definition: Logging.h:193
IceProperties.h
armarx::ctrlutil::s
double s(double t, double s0, double v0, double a0, double j)
Definition: CtrlUtil.h:33
ScenarioManager::Data_Structure::Scenario::getApplicationByName
ApplicationInstancePtr getApplicationByName(const std::string &name)
Definition: Scenario.cpp:251
armarx
This file offers overloads of toIce() and fromIce() functions for STL container types.
Definition: ArmarXTimeserver.cpp:27