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
40using namespace ScenarioManager;
41using namespace Parser;
42using namespace Data_Structure;
43
44std::map<std::string, DependencyTree> PackageBuilder::cachedTrees;
45
48{
49 armarx::CMakePackageFinder pFinder(name);
50 XMLScenarioParser parser;
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
68PackageBuilder::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();
91 XMLScenarioParser parser;
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 {
152 XMLScenarioParser parser;
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}
Class containing data about a package, its scenarios and its applications.
Definition Package.h:47
void generateDependenciesCfg(ScenarioManager::Data_Structure::PackagePtr package)
ScenarioManager::Data_Structure::PackagePtr parsePackage(std::string name)
Parses the package of the given name and creates a Package out of the parsed data.
static StringList FilterPackagesForScenario(std::string scenario)
This class provides different methods to parse and save scenario data in XML-Files.
static ApplicationPtr getInstance()
Retrieve shared pointer to the application object.
static CMakePackageFinderCache GlobalCache
The CMakePackageFinder class provides an interface to the CMake Package finder capabilities.
std::string getBinaryDir() const
std::string getScenariosDir() const
std::vector< std::string > getComponentExecutableNames() const
std::string getConfigDir() const
Returns the path needed to find this package with cmake, i.e.
bool packageFound() const
Returns whether or not this package was found with cmake.
#define ARMARX_INFO
The normal logging level.
Definition Logging.h:181
#define ARMARX_INFO_S
Definition Logging.h:202
std::shared_ptr< Scenario > ScenarioPtr
Definition Scenario.h:35
std::shared_ptr< Package > PackagePtr
Definition Package.h:122
std::vector< std::string > StringList