39 "Check consistency of OKS schema file\n" +
40 fmt::format(
"Return codes: {} Success, file is OK\n", Exitcode::SUCCESS) +
41 fmt::format(
" {} Bad command line\n", Exitcode::BADCMD) +
42 fmt::format(
" {} Failed to find file\n", Exitcode::NOFILE) +
43 fmt::format(
" {} Failed to load file -- invalid schema\n", Exitcode::LOADFAIL) +
44 fmt::format(
" {} File contains relationship to non loaded class\n", Exitcode::BADRELATIONSHIP) +
45 fmt::format(
" {} File contains object with relationship to non loaded class/object\n",
46 Exitcode::UNRESOLVED) +
47 fmt::format(
" {} File refers to class in file not directly included\n", Exitcode::MISSING_INCLUDE)
51 app.add_option(
"-f,--file",
filename,
"Schema file")->required();
53 CLI11_PARSE(app, argc, argv);
61 return Exitcode::LOADFAIL;
64 return Exitcode::NOFILE;
65 }
catch (std::exception& exc) {
66 TLOG() << exc.what() <<
"\n";
67 return Exitcode::LOADFAIL;
70 if (file ==
nullptr) {
72 return Exitcode::LOADFAIL;
75 std::set<std::string> includes;
76 for (
const auto& ifile : file->get_include_files()) {
77 includes.insert(ifile);
78 TLOG_DEBUG(2) <<
"direct inserting " << ifile <<
"\n";
81 Exitcode result = Exitcode::SUCCESS;
83 if (
filename.ends_with(
".schema.xml")) {
85 for (
auto [name, oks_class] : kernel.
classes()) {
87 if (file->get_full_file_name() != oks_class->get_file()->get_full_file_name()) {
92 auto cfile = oks_class->get_file()->get_short_file_name();
93 if (cfile != file->get_short_file_name() && !includes.contains(cfile)) {
94 TLOG() <<
"Error " <<
filename <<
" misses include of " << cfile <<
" required by " << name;
95 if (result == Exitcode::SUCCESS) {
96 result = Exitcode::MISSING_INCLUDE;
99 auto relationships = oks_class->direct_relationships();
100 if (relationships !=
nullptr) {
101 for (
auto rel : *relationships) {
102 auto rel_class = rel->get_class_type();
103 if (rel_class ==
nullptr) {
104 TLOG() <<
"Error class '" << name <<
"' has relationship '" << rel->get_name() <<
"' to a class '"
105 << rel->get_type() <<
"' that is not loaded\n";
106 if (result == Exitcode::SUCCESS) {
107 result = Exitcode::BADRELATIONSHIP;
115 }
else if (
filename.ends_with(
".data.xml")) {
117 auto check_relationship = [&](
OksData* data) {
118 auto relobj = data->data.OBJECT;
119 if (relobj ==
nullptr) {
122 auto ofile_name = relobj->get_file()->get_short_file_name();
123 if (file->get_short_file_name() != ofile_name && !includes.contains(ofile_name)) {
124 TLOG() <<
"Error " <<
filename <<
" misses include of " << ofile_name <<
" required by " << relobj->GetId();
125 if (result == Exitcode::SUCCESS) {
126 result = Exitcode::MISSING_INCLUDE;
132 for (
auto obj : *data_objs) {
135 auto oks_class =
obj->GetClass();
136 auto cfile = oks_class->get_file()->get_short_file_name();
137 if (!includes.contains(cfile)) {
138 TLOG() <<
"Error " <<
filename <<
" misses include of " << cfile <<
" required by " <<
obj->GetId()
139 <<
" of class " << oks_class->get_name();
140 if (result == Exitcode::SUCCESS) {
141 result = Exitcode::MISSING_INCLUDE;
147 auto relationships = oks_class->all_relationships();
148 if (relationships !=
nullptr) {
149 for (
auto rel : *relationships) {
150 auto relval =
obj->GetRelationshipValue(rel->get_name());
151 if (relval ==
nullptr) {
155 for (OksData::List::iterator iter = relval->data.LIST->begin(); iter != relval->data.LIST->end(); ++iter) {
156 check_relationship(*iter);
159 check_relationship(relval);
168 if (!status.empty()) {
169 if (result == Exitcode::SUCCESS) {
170 result = Exitcode::UNRESOLVED;