www.mooseframework.org
Public Member Functions | Static Public Member Functions | Protected Member Functions | Static Protected Member Functions | Protected Attributes | Friends | List of all members
JsonSyntaxTree Class Reference

Holds the syntax in a Json::Value tree. More...

#include <JsonSyntaxTree.h>

Public Member Functions

 JsonSyntaxTree (const std::string &search_string)
 
virtual ~JsonSyntaxTree ()
 
bool addParameters (const std::string &parent_path, const std::string &path, bool is_type, const std::string &action, bool is_action, InputParameters *params, const FileLineInfo &lineinfo, const std::string &classname)
 Add parameters to the tree. More...
 
void addActionTask (const std::string &path, const std::string &action, const std::string &task, const FileLineInfo &lineinfo)
 Add a task to the tree. More...
 
const nlohmann::json & getRoot () const
 Get the root of the tree. More...
 
void addSyntaxType (const std::string &path, const std::string type)
 Add an associated type to a block. More...
 
void addGlobal ()
 Add the global section to the output. More...
 

Static Public Member Functions

static std::string basicCppType (const std::string &cpp_type)
 Utilities for making sense of c++ types. More...
 

Protected Member Functions

std::string buildOptions (const std::iterator_traits< InputParameters::iterator >::value_type &p, bool &out_of_range_allowed, std::map< MooseEnumItem, std::string > &docs)
 
size_t setParams (InputParameters *params, bool search_match, nlohmann::json &all_params)
 
nlohmann::json & getJson (const std::string &parent, const std::string &path, bool is_type)
 
nlohmann::json & getJson (const std::string &path)
 
std::pair< std::string, std::string > getObjectLabel (const std::string &obj) const
 
std::pair< std::string, std::string > getActionLabel (const std::string &action) const
 

Static Protected Member Functions

static std::string buildOutputString (const std::iterator_traits< InputParameters::iterator >::value_type &p)
 
static std::vector< std::string > splitPath (const std::string &path)
 

Protected Attributes

nlohmann::json _root
 
std::string _search
 
std::map< std::string, std::pair< std::string, std::string > > _action_label_map
 
std::map< std::string, std::pair< std::string, std::string > > _object_label_map
 

Friends

class MooseServer
 

Detailed Description

Holds the syntax in a Json::Value tree.

Definition at line 22 of file JsonSyntaxTree.h.

Constructor & Destructor Documentation

◆ JsonSyntaxTree()

JsonSyntaxTree::JsonSyntaxTree ( const std::string &  search_string)

Definition at line 29 of file JsonSyntaxTree.C.

29  : _search(search_string)
30 {
31  // Registry holds a map with labels (ie MooseApp) as keys and a vector of RegistryEntry
32  // as values. We need the reverse map: given an action or object name then get the label.
33  auto & actmap = Registry::allActions();
34  for (auto & entry : actmap)
35  for (auto & act : entry.second)
36  _action_label_map[act->_classname] = std::make_pair(entry.first, act->_file);
37 
38  auto & objmap = Registry::allObjects();
39  for (auto & entry : objmap)
40  for (auto & obj : entry.second)
41  _object_label_map[obj->name()] = std::make_pair(entry.first, obj->_file);
42 }
static const std::map< std::string, std::vector< std::shared_ptr< RegistryEntryBase > > > & allActions()
Returns a per-label keyed map of all Actions in the registry.
Definition: Registry.h:214
static const std::map< std::string, std::vector< std::shared_ptr< RegistryEntryBase > > > & allObjects()
Returns a per-label keyed map of all MooseObjects in the registry.
Definition: Registry.h:209
std::map< std::string, std::pair< std::string, std::string > > _action_label_map
std::string _search
std::map< std::string, std::pair< std::string, std::string > > _object_label_map

◆ ~JsonSyntaxTree()

virtual JsonSyntaxTree::~JsonSyntaxTree ( )
inlinevirtual

Definition at line 26 of file JsonSyntaxTree.h.

26 {}

Member Function Documentation

◆ addActionTask()

void JsonSyntaxTree::addActionTask ( const std::string &  path,
const std::string &  action,
const std::string &  task,
const FileLineInfo lineinfo 
)

Add a task to the tree.

Parameters
pathThe path of the action
actionName of the action
taskName of the task
lineinfoThe FileLineInfo where the action/task was registered

Definition at line 332 of file JsonSyntaxTree.C.

336 {
337  nlohmann::json & json = getJson("", path, false);
338  if (lineinfo.isValid())
339  json[action]["tasks"][task_name]["file_info"][lineinfo.file()] = lineinfo.line();
340 }
nlohmann::json & getJson(const std::string &parent, const std::string &path, bool is_type)
int line() const
Definition: FileLineInfo.C:23
std::string file() const
Definition: FileLineInfo.C:29
bool isValid() const
Definition: FileLineInfo.C:17

◆ addGlobal()

void JsonSyntaxTree::addGlobal ( )

Add the global section to the output.

Definition at line 155 of file JsonSyntaxTree.C.

156 {
157  // If they are doing a search they probably don't want to see this
158  if (_search.empty())
159  {
160  auto params = Moose::Builder::validParams();
161  nlohmann::json jparams;
162  setParams(&params, true, jparams);
163  _root["global"]["parameters"] = jparams;
164 
165  // Just create a list of registered app names
166  nlohmann::json apps;
167  auto & factory = AppFactory::instance();
168  for (const auto & name_bi_pair : factory.registeredObjects())
169  apps.push_back(name_bi_pair.first);
170 
171  _root["global"]["registered_apps"] = apps;
172  }
173 }
size_t setParams(InputParameters *params, bool search_match, nlohmann::json &all_params)
static InputParameters validParams()
Parameters that are processed directly by the Parser and are valid anywhere in the input...
Definition: Builder.C:139
static AppFactory & instance()
Get the instance of the AppFactory.
Definition: AppFactory.C:17
nlohmann::json _root
std::string _search

◆ addParameters()

bool JsonSyntaxTree::addParameters ( const std::string &  parent_path,
const std::string &  path,
bool  is_type,
const std::string &  action,
bool  is_action,
InputParameters params,
const FileLineInfo lineinfo,
const std::string &  classname 
)

Add parameters to the tree.

Parameters
parent_pathThe parent syntax path that the action belongs to
pathThe path of the action
is_typeWhether this belongs to a "<type>" or not
actionName of the action
is_actionWheter it is an action
paramsThe InputParameters to add to the tree
lineinfoThe FileLineInfo where the action/path was registered
Returns
Whether the parameters were added to the tree (ie if it matched the search string).

Definition at line 176 of file JsonSyntaxTree.C.

184 {
185  if (action == "EmptyAction")
186  return false;
187 
188  nlohmann::json all_params;
189  bool search_match = !_search.empty() && (MooseUtils::wildCardMatch(path, _search) ||
192  auto count = setParams(params, search_match, all_params);
193  if (!_search.empty() && count == 0)
194  // no parameters that matched the search string
195  return false;
196 
197  nlohmann::json & json = getJson(parent, path, is_type);
198 
199  if (is_action)
200  {
201  json[action]["parameters"] = all_params;
202  json[action]["description"] = params->getClassDescription();
203  json[action]["action_path"] = path;
204  auto label_pair = getActionLabel(action);
205  json[action]["label"] = label_pair.first;
206  json[action]["register_file"] = label_pair.second;
207  if (lineinfo.isValid())
208  json[action]["file_info"][lineinfo.file()] = lineinfo.line();
209  }
210  else if (params)
211  {
212  if (params->isParamValid("_moose_base"))
213  json["moose_base"] = params->get<std::string>("_moose_base");
214 
215  json["parameters"] = all_params;
216  json["syntax_path"] = path;
217  json["parent_syntax"] = parent;
218  json["description"] = params->getClassDescription();
219  auto label_pair = getObjectLabel(path);
220  json["label"] = label_pair.first;
221  json["register_file"] = label_pair.second;
222  if (lineinfo.isValid())
223  {
224  json["file_info"][lineinfo.file()] = lineinfo.line();
225  if (!classname.empty())
226  json["class"] = classname;
227  }
228  }
229  return true;
230 }
std::vector< std::pair< R1, R2 > > get(const std::string &param1, const std::string &param2) const
Combine two vector parameters into a single vector of pairs.
nlohmann::json & getJson(const std::string &parent, const std::string &path, bool is_type)
size_t setParams(InputParameters *params, bool search_match, nlohmann::json &all_params)
int line() const
Definition: FileLineInfo.C:23
std::pair< std::string, std::string > getActionLabel(const std::string &action) const
std::pair< std::string, std::string > getObjectLabel(const std::string &obj) const
std::string file() const
Definition: FileLineInfo.C:29
bool wildCardMatch(std::string name, std::string search_string)
Definition: MooseUtils.C:874
bool isValid() const
Definition: FileLineInfo.C:17
std::string _search
std::string getClassDescription() const
Returns the class description.
bool isParamValid(const std::string &name) const
This method returns parameters that have been initialized in one fashion or another, i.e.

◆ addSyntaxType()

void JsonSyntaxTree::addSyntaxType ( const std::string &  path,
const std::string  type 
)

Add an associated type to a block.

Parameters
pathPath of the block
typeType name to associate the block with

Definition at line 317 of file JsonSyntaxTree.C.

318 {
320  {
321  auto & j = getJson(path);
322  j["associated_types"].push_back(type);
323  }
324  // If they are doing a search they probably don't want to see this
325  if (_search.empty())
326  {
327  _root["global"]["associated_types"][type].push_back(path);
328  }
329 }
nlohmann::json & getJson(const std::string &parent, const std::string &path, bool is_type)
nlohmann::json _root
bool wildCardMatch(std::string name, std::string search_string)
Definition: MooseUtils.C:874
std::string _search

◆ basicCppType()

std::string JsonSyntaxTree::basicCppType ( const std::string &  cpp_type)
static

Utilities for making sense of c++ types.

Definition at line 343 of file JsonSyntaxTree.C.

Referenced by MooseServer::addParametersToList(), MooseServer::addValuesToList(), and setParams().

344 {
345  std::string s = "String";
346  if (cpp_type.find("std::vector") != std::string::npos ||
347  cpp_type.find("libMesh::VectorValue") != std::string::npos ||
348  cpp_type.find("libMesh::TensorValue") != std::string::npos ||
349  cpp_type.find("Eigen::Matrix") != std::string::npos)
350  {
351  // Get the template type and use its basic type for the array type
352  pcrecpp::RE r("^[^<]+<\\s*(.*)\\s*>$");
353  std::string t;
354  r.FullMatch(cpp_type, &t);
355 
356  // Capture type just to the first comma for Eigen::Matrix<type,V,W,X,Y,Z>
357  if (cpp_type.find("Eigen::Matrix") != std::string::npos)
358  t = t.substr(0, t.find(","));
359 
360  s = "Array:" + basicCppType(t);
361  }
362  else if (cpp_type.find("MultiMooseEnum") != std::string::npos ||
363  cpp_type.find("ExecFlagEnum") != std::string::npos ||
364  cpp_type.find("VectorPostprocessorName") != std::string::npos ||
365  cpp_type.find("std::map") != std::string::npos)
366  s = "Array:String";
367  else if (cpp_type.find("libMesh::Point") != std::string::npos)
368  s = "Array:Real";
369  else if (cpp_type == "int" || cpp_type == "unsigned int" || cpp_type == "short" ||
370  cpp_type == "unsigned short" || cpp_type == "char" || cpp_type == "unsigned char" ||
371  cpp_type == "long" || cpp_type == "unsigned long" || cpp_type == "long long" ||
372  cpp_type == "unsigned long long")
373  s = "Integer";
374  else if (cpp_type == "double" || cpp_type == "float")
375  s = "Real";
376  else if (cpp_type == "bool")
377  s = "Boolean";
378 
379  return s;
380 }
static std::string basicCppType(const std::string &cpp_type)
Utilities for making sense of c++ types.

◆ buildOptions()

std::string JsonSyntaxTree::buildOptions ( const std::iterator_traits< InputParameters::iterator >::value_type &  p,
bool &  out_of_range_allowed,
std::map< MooseEnumItem, std::string > &  docs 
)
protected

Definition at line 233 of file JsonSyntaxTree.C.

Referenced by setParams().

236 {
238 
239  std::string options;
240  {
241  auto * enum_type = dynamic_cast<InputParameters::Parameter<MooseEnum> *>(val);
242  if (enum_type)
243  {
244  out_of_range_allowed = enum_type->get().isOutOfRangeAllowed();
245  options = enum_type->get().getRawNames();
246  docs = enum_type->get().getItemDocumentation();
247  }
248  }
249  {
250  auto * enum_type = dynamic_cast<InputParameters::Parameter<MultiMooseEnum> *>(val);
251  if (enum_type)
252  {
253  out_of_range_allowed = enum_type->get().isOutOfRangeAllowed();
254  options = enum_type->get().getRawNames();
255  docs = enum_type->get().getItemDocumentation();
256  }
257  }
258  {
259  auto * enum_type = dynamic_cast<InputParameters::Parameter<ExecFlagEnum> *>(val);
260  if (enum_type)
261  {
262  out_of_range_allowed = enum_type->get().isOutOfRangeAllowed();
263  options = enum_type->get().getRawNames();
264  docs = enum_type->get().getItemDocumentation();
265  }
266  }
267  {
268  auto * enum_type = dynamic_cast<InputParameters::Parameter<std::vector<MooseEnum>> *>(val);
269  if (enum_type)
270  {
271  out_of_range_allowed = (enum_type->get())[0].isOutOfRangeAllowed();
272  options = (enum_type->get())[0].getRawNames();
273  docs = enum_type->get()[0].getItemDocumentation();
274  }
275  }
276  return options;
277 }
T * get(const std::unique_ptr< T > &u)
The MooseUtils::get() specializations are used to support making forwards-compatible code changes fro...
Definition: MooseUtils.h:1147

◆ buildOutputString()

std::string JsonSyntaxTree::buildOutputString ( const std::iterator_traits< InputParameters::iterator >::value_type &  p)
staticprotected

Definition at line 280 of file JsonSyntaxTree.C.

Referenced by MooseServer::addParametersToList(), and setParams().

282 {
284 
285  // Account for Point
286  std::stringstream str;
287  InputParameters::Parameter<Point> * ptr0 = dynamic_cast<InputParameters::Parameter<Point> *>(val);
288 
289  // Account for RealVectorValues
290  InputParameters::Parameter<RealVectorValue> * ptr1 =
291  dynamic_cast<InputParameters::Parameter<RealVectorValue> *>(val);
292 
293  // Output the Point components
294  if (ptr0)
295  str << ptr0->get().operator()(0) << " " << ptr0->get().operator()(1) << " "
296  << ptr0->get().operator()(2);
297 
298  // Output the RealVectorValue components
299  else if (ptr1)
300  str << ptr1->get().operator()(0) << " " << ptr1->get().operator()(1) << " "
301  << ptr1->get().operator()(2);
302 
303  // General case, call the print operator
304  else
305  val->print(str);
306 
307  // remove additional '\n' possibly generated in output (breaks JSON parsing)
308  std::string tmp_str = str.str();
309  for (auto & ch : tmp_str)
310  if (ch == '\n')
311  ch = ' ';
312 
313  return tmp_str.substr(0, tmp_str.find("<RESIDUAL>"));
314 }
virtual void print(std::ostream &) const=0
T * get(const std::unique_ptr< T > &u)
The MooseUtils::get() specializations are used to support making forwards-compatible code changes fro...
Definition: MooseUtils.h:1147

◆ getActionLabel()

std::pair< std::string, std::string > JsonSyntaxTree::getActionLabel ( const std::string &  action) const
protected

Definition at line 394 of file JsonSyntaxTree.C.

Referenced by addParameters().

395 {
396  auto it = _action_label_map.find(action);
397  if (it != _action_label_map.end())
398  return it->second;
399  else
400  return std::make_pair("", "");
401 }
std::map< std::string, std::pair< std::string, std::string > > _action_label_map

◆ getJson() [1/2]

nlohmann::json & JsonSyntaxTree::getJson ( const std::string &  parent,
const std::string &  path,
bool  is_type 
)
protected

Definition at line 77 of file JsonSyntaxTree.C.

Referenced by addActionTask(), addParameters(), and addSyntaxType().

78 {
79  if (parent.empty())
80  {
81  auto & j = getJson(path);
82  if (path.back() == '*' && !j.contains("subblock_types"))
83  j["subblock_types"] = nlohmann::json();
84  else if (path.back() != '*' && !j.contains("types"))
85  j["types"] = nlohmann::json();
86  return j["actions"];
87  }
88 
89  auto & parent_json = getJson(parent);
90  auto paths = splitPath(path);
91  std::string key = "subblock_types";
92  if (is_type)
93  key = "types";
94  auto & val = parent_json[key][paths.back()];
95  return val;
96 }
nlohmann::json & getJson(const std::string &parent, const std::string &path, bool is_type)
static std::vector< std::string > splitPath(const std::string &path)

◆ getJson() [2/2]

nlohmann::json & JsonSyntaxTree::getJson ( const std::string &  path)
protected

Definition at line 57 of file JsonSyntaxTree.C.

58 {
59  auto paths = splitPath(path);
60  mooseAssert(paths.size() > 0, "path is empty");
61  auto * next = &(_root["blocks"][paths[0]]);
62 
63  for (auto pit = paths.begin() + 1; pit != paths.end(); ++pit)
64  {
65  if (*pit == "*")
66  // It has an action syntax as a parent
67  next = &(*next)["star"];
68  else if (*pit == "<type>")
69  next = &(*next)["types"];
70  else
71  next = &(*next)["subblocks"][*pit];
72  }
73  return *next;
74 }
static std::vector< std::string > splitPath(const std::string &path)
nlohmann::json _root

◆ getObjectLabel()

std::pair< std::string, std::string > JsonSyntaxTree::getObjectLabel ( const std::string &  obj) const
protected

Definition at line 383 of file JsonSyntaxTree.C.

Referenced by addParameters().

384 {
385  auto paths = splitPath(obj);
386  auto it = _object_label_map.find(paths.back());
387  if (it != _object_label_map.end())
388  return it->second;
389  else
390  return std::make_pair("", "");
391 }
static std::vector< std::string > splitPath(const std::string &path)
std::map< std::string, std::pair< std::string, std::string > > _object_label_map

◆ getRoot()

const nlohmann::json& JsonSyntaxTree::getRoot ( ) const
inline

Get the root of the tree.

Returns
The top level Json::Value holding the tree.

Definition at line 63 of file JsonSyntaxTree.h.

Referenced by MooseApp::setupOptions().

63 { return _root; }
nlohmann::json _root

◆ setParams()

size_t JsonSyntaxTree::setParams ( InputParameters params,
bool  search_match,
nlohmann::json &  all_params 
)
protected

Definition at line 99 of file JsonSyntaxTree.C.

Referenced by addGlobal(), and addParameters().

100 {
101  size_t count = 0;
102  for (auto & iter : *params)
103  {
104  // Make sure we want to see this parameter
105  bool param_match = !_search.empty() && MooseUtils::wildCardMatch(iter.first, _search);
106  if (params->isPrivate(iter.first) || (!_search.empty() && !search_match && !param_match))
107  continue;
108 
109  ++count;
110  nlohmann::json param_json;
111 
112  param_json["required"] = params->isParamRequired(iter.first);
113 
114  // Only output default if it has one
115  if (params->isParamValid(iter.first))
116  param_json["default"] = buildOutputString(iter);
117  else if (params->hasDefaultCoupledValue(iter.first))
118  param_json["default"] = params->defaultCoupledValue(iter.first);
119 
120  bool out_of_range_allowed = false;
121  std::map<MooseEnumItem, std::string> docs;
122  param_json["options"] = buildOptions(iter, out_of_range_allowed, docs);
123  if (!nlohmann::to_string(param_json["options"]).empty())
124  {
125  param_json["out_of_range_allowed"] = out_of_range_allowed;
126  if (!docs.empty())
127  {
128  nlohmann::json jdocs;
129  for (const auto & doc : docs)
130  jdocs[doc.first.name()] = doc.second;
131  param_json["option_docs"] = jdocs;
132  }
133  }
134  auto reserved_values = params->reservedValues(iter.first);
135  for (const auto & reserved : reserved_values)
136  param_json["reserved_values"].push_back(reserved);
137 
138  std::string t = MooseUtils::prettyCppType(params->type(iter.first));
139  param_json["cpp_type"] = t;
140  param_json["basic_type"] = basicCppType(t);
141  param_json["group_name"] = params->getGroupName(iter.first);
142  param_json["name"] = iter.first;
143 
144  std::string doc = params->getDocString(iter.first);
145  MooseUtils::escape(doc);
146  param_json["description"] = doc;
147  param_json["controllable"] = params->isControllable(iter.first);
148  param_json["deprecated"] = params->isParamDeprecated(iter.first);
149  all_params[iter.first] = param_json;
150  }
151  return count;
152 }
std::string buildOptions(const std::iterator_traits< InputParameters::iterator >::value_type &p, bool &out_of_range_allowed, std::map< MooseEnumItem, std::string > &docs)
static std::string buildOutputString(const std::iterator_traits< InputParameters::iterator >::value_type &p)
static std::string basicCppType(const std::string &cpp_type)
Utilities for making sense of c++ types.
bool wildCardMatch(std::string name, std::string search_string)
Definition: MooseUtils.C:874
std::string _search
void escape(std::string &str)
This function will escape all of the standard C++ escape characters so that they can be printed...
Definition: MooseUtils.C:196
std::string prettyCppType(const std::string &cpp_type)
Definition: MooseUtils.C:1235

◆ splitPath()

std::vector< std::string > JsonSyntaxTree::splitPath ( const std::string &  path)
staticprotected

Definition at line 45 of file JsonSyntaxTree.C.

Referenced by getJson(), and getObjectLabel().

46 {
47  std::string s;
48  std::istringstream f(path);
49  std::vector<std::string> paths;
50  while (std::getline(f, s, '/'))
51  if (s.size() > 0)
52  paths.push_back(s);
53  return paths;
54 }

Friends And Related Function Documentation

◆ MooseServer

friend class MooseServer
friend

Definition at line 107 of file JsonSyntaxTree.h.

Member Data Documentation

◆ _action_label_map

std::map<std::string, std::pair<std::string, std::string> > JsonSyntaxTree::_action_label_map
protected

Maps storing action/object name to the label and file location

Definition at line 102 of file JsonSyntaxTree.h.

Referenced by getActionLabel(), and JsonSyntaxTree().

◆ _object_label_map

std::map<std::string, std::pair<std::string, std::string> > JsonSyntaxTree::_object_label_map
protected

Definition at line 103 of file JsonSyntaxTree.h.

Referenced by getObjectLabel(), and JsonSyntaxTree().

◆ _root

nlohmann::json JsonSyntaxTree::_root
protected

Definition at line 97 of file JsonSyntaxTree.h.

Referenced by addGlobal(), addSyntaxType(), getJson(), and getRoot().

◆ _search

std::string JsonSyntaxTree::_search
protected

Definition at line 98 of file JsonSyntaxTree.h.

Referenced by addGlobal(), addParameters(), addSyntaxType(), and setParams().


The documentation for this class was generated from the following files: