PackageBuilder.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 Cedric Seehausen (usdnr at kit dot edu)
20  * @date 2016
21  * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
22  * GNU General Public License
23  */
24 
25 
26 #include "PackageBuilder.h"
27 
28 #include <algorithm>
29 #include <filesystem>
30 #include <fstream>
31 
39 
40 using namespace ScenarioManager;
41 using namespace Parser;
42 using namespace Data_Structure;
43 
44 std::map<std::string, DependencyTree> PackageBuilder::cachedTrees;
45 
48 {
49  armarx::CMakePackageFinder pFinder(name);
51 
52  StringList scenarios = parser.getScenariosFromFolder(pFinder.getScenariosDir());
53 
54  //format them into the right parsing
55  int i = 0;
56  for (auto scenario : scenarios)
57  {
58  scenario.append("::Package::" + name);
59  scenarios[i] = scenario;
60  ARMARX_INFO_S << scenario << " " << scenarios[i];
61  i++;
62  }
63 
64  return parsePackage(name, scenarios);
65 }
66 
68 PackageBuilder::parsePackage(std::string name, StringList openedScenarios)
69 {
72 
73  if (pFinder.packageFound())
74  {
75  PackagePtr result;
76 
77  result = PackagePtr(new Package(name, pFinder.getConfigDir(), pFinder.getScenariosDir()));
78 
79  DependenciesGenerator generator;
80  generator.generateDependenciesCfg(result);
81 
82  const std::vector<std::string> executables = pFinder.getComponentExecutableNames();
83  for (auto executable : executables)
84  {
85  auto application = std::make_shared<Data_Structure::Application>(
86  executable, pFinder.getBinaryDir(), result->getName());
87  result->addApplication(application);
88  }
89 
90  std::string scenarioDir = pFinder.getScenariosDir();
92  std::vector<std::string> packageScenarios = parser.getScenariosFromFolder(scenarioDir);
93 
94  for (auto scenarioName : packageScenarios)
95  {
96  for (unsigned int i = 0; i < openedScenarios.size(); i++)
97  {
98  StringList stringSplit;
99 
100  auto pos = openedScenarios[i].find("::Package::");
101  stringSplit.push_back(openedScenarios[i].substr(0, pos));
102  stringSplit.push_back(openedScenarios[i].substr(pos + 11));
103 
104  if (scenarioName.compare(stringSplit.at(0)) == 0 &&
105  result->getName().compare(stringSplit.at(1)) == 0)
106  {
107  ScenarioPtr scenario;
108 
109  auto subfolderPos = scenarioName.find("/");
110  if (subfolderPos != std::string::npos)
111  {
112  scenario = parser.parseScenario(result,
113  scenarioName.substr(subfolderPos + 1),
114  scenarioName.substr(0, subfolderPos));
115  }
116  else
117  {
118  scenario = parser.parseScenario(result, scenarioName);
119  }
120 
121  if (scenario.get() != nullptr)
122  {
123  scenario->reloadAppInstances();
124  result->addScenario(scenario);
125  }
126  else
127  {
128  ARMARX_INFO_S << "Could not find / parse Scenario at " + scenarioDir +
129  " despite CMake knows it.";
130  }
131  continue;
132  }
133  }
134  }
135  return result;
136  }
137 
138  ARMARX_INFO << "Package '" << name << "' not found!";
139  return PackagePtr();
140 }
141 
144 {
145  StringList result;
146 
147  StringList packages = GetDefaultPackages();
148  for (auto package : packages)
149  {
153 
154  StringList scenarios = parser.getScenariosFromFolder(finder.getScenariosDir());
155 
156  if (std::find(scenarios.begin(), scenarios.end(), scenario) != scenarios.end())
157  {
158  result.push_back(package);
159  }
160  }
161 
162  return result;
163 }
164 
167 {
168  StringList packages;
170  {
171  return armarx::Application::getInstance()->getArmarXPackageNames();
172  }
173  return packages;
174 }
StringUtil.hpp
ScenarioManager::Data_Structure::ScenarioPtr
std::shared_ptr< Scenario > ScenarioPtr
Definition: Scenario.h:35
ScenarioManager::Parser::DependenciesGenerator::generateDependenciesCfg
void generateDependenciesCfg(ScenarioManager::Data_Structure::PackagePtr package)
Definition: DependenciesGenerator.cpp:91
armarx::CMakePackageFinder::packageFound
bool packageFound() const
Returns whether or not this package was found with cmake.
Definition: CMakePackageFinder.cpp:511
armarx::CMakePackageFinder::getScenariosDir
std::string getScenariosDir() const
Definition: CMakePackageFinder.h:200
armarx::CMakePackageFinderCache::findPackage
const CMakePackageFinder & findPackage(const std::string &packageName, const std::filesystem::path &packagePath="", bool suppressStdErr=false, bool usePackagePathOnlyAsHint=false)
Definition: CMakePackageFinderCache.cpp:17
ScenarioManager::Parser::PackageBuilder::parsePackage
ScenarioManager::Data_Structure::PackagePtr parsePackage(std::string name)
Parses the package of the given name and creates a Package out of the parsed data.
Definition: PackageBuilder.cpp:47
armarx::CMakePackageFinder
The CMakePackageFinder class provides an interface to the CMake Package finder capabilities.
Definition: CMakePackageFinder.h:52
ScenarioManager::Parser::XMLScenarioParser
This class provides different methods to parse and save scenario data in XML-Files....
Definition: XMLScenarioParser.h:58
ScenarioManager::Parser::PackageBuilder::GetDefaultPackages
static StringList GetDefaultPackages()
Definition: PackageBuilder.cpp:166
PackageBuilder.h
ScenarioManager::Data_Structure::PackagePtr
std::shared_ptr< Package > PackagePtr
Definition: Package.h:122
armarx::CMakePackageFinder::getComponentExecutableNames
std::vector< std::string > getComponentExecutableNames() const
Definition: CMakePackageFinder.cpp:703
ScenarioManager::Parser::DependenciesGenerator
Definition: DependenciesGenerator.h:40
armarx::CMakePackageFinder::getBinaryDir
std::string getBinaryDir() const
Definition: CMakePackageFinder.h:174
DependenciesGenerator.h
XMLScenarioParser.h
armarx::Application::getInstance
static ApplicationPtr getInstance()
Retrieve shared pointer to the application object.
Definition: Application.cpp:315
CMakePackageFinder.h
IceStorm::parser
Parser * parser
Definition: Parser.cpp:34
armarx::CMakePackageFinder::getConfigDir
std::string getConfigDir() const
Returns the path needed to find this package with cmake, i.e.
Definition: CMakePackageFinder.h:105
ScenarioManager
Definition: Application.cpp:180
ARMARX_INFO
#define ARMARX_INFO
Definition: Logging.h:181
armarx::CMakePackageFinderCache::GlobalCache
static CMakePackageFinderCache GlobalCache
Definition: CMakePackageFinderCache.h:23
ARMARX_INFO_S
#define ARMARX_INFO_S
Definition: Logging.h:202
Logging.h
ArmarXDataPath.h
Application.h
ScenarioManager::Parser::PackageBuilder::FilterPackagesForScenario
static StringList FilterPackagesForScenario(std::string scenario)
Definition: PackageBuilder.cpp:143
ScenarioManager::Parser::StringList
std::vector< std::string > StringList
Definition: PackageBuilder.h:35