25 #include <SimoxUtility/algorithm/string/string_tools.h>
32 #include "../../StatechartViewerPlugin/model/State.h"
33 #include "../../StatechartViewerPlugin/model/stateinstance/DynamicRemoteState.h"
34 #include "../../StatechartViewerPlugin/model/stateinstance/EndState.h"
35 #include "../../StatechartViewerPlugin/model/stateinstance/LocalState.h"
36 #include "../../StatechartViewerPlugin/model/stateinstance/RemoteState.h"
50 document.append_node(buildXmlDeclaration());
56 document.allocate_attribute(
"name", cloneQString(state->getStateName())));
57 rootNode->
append_attribute(document.allocate_attribute(
"uuid", cloneQString(state->getUUID())));
59 "width", cloneQString(QString::number(state->getSize().width()))));
61 "height", cloneQString(QString::number(state->getSize().height()))));
65 const QString& description = state->getDescription();
67 if (!description.isEmpty())
69 rootNode->
append_node(buildDescription(description));
72 rootNode->
append_node(buildParameterList(
"InputParameters", state->getInputParameters()));
73 rootNode->
append_node(buildParameterList(
"OutputParameters", state->getOutputParameters()));
74 rootNode->
append_node(buildParameterList(
"LocalParameters", state->getLocalParameters()));
75 rootNode->
append_node(buildSubstateList(state->getSubstates()));
76 rootNode->
append_node(buildEventList(state->getOutgoingEvents()));
80 if (startStateTransition->destinationState)
82 rootNode->
append_node(buildStartState(startStateTransition));
84 rootNode->
append_node(buildTransitionList(state->getTransitions(), uuidToNodeMap));
86 document.append_node(rootNode);
95 return QString::fromStdString(
s);
103 document.allocate_attribute(
"refuuid", cloneQString(localState->getClassUUID())));
105 "left", cloneQString(QString::number(localState->getTopLeft().x()))));
107 "top", cloneQString(QString::number(localState->getTopLeft().y()))));
109 "boundingSquareSize", cloneQString(QString::number(localState->getBoundingSquareSize()))));
117 document.allocate_attribute(
"refuuid", cloneQString(remoteState->getClassUUID())));
119 document.allocate_attribute(
"proxyName", cloneQString(remoteState->proxyName)));
121 "left", cloneQString(QString::number(remoteState->getTopLeft().x()))));
123 "top", cloneQString(QString::number(remoteState->getTopLeft().y()))));
125 "boundingSquareSize", cloneQString(QString::number(remoteState->getBoundingSquareSize()))));
133 document.allocate_attribute(
"refuuid", cloneQString(dynamicRemoteState->getClassUUID())));
135 "left", cloneQString(QString::number(dynamicRemoteState->getTopLeft().x()))));
137 "top", cloneQString(QString::number(dynamicRemoteState->getTopLeft().y()))));
139 "boundingSquareSize",
140 cloneQString(QString::number(dynamicRemoteState->getBoundingSquareSize()))));
148 document.allocate_attribute(
"event", cloneQString(endState->getEventName())));
150 "left", cloneQString(QString::number(endState->getTopLeft().x()))));
152 "top", cloneQString(QString::number(endState->getTopLeft().y()))));
154 "boundingSquareSize", cloneQString(QString::number(endState->getBoundingSquareSize()))));
158 XmlWriter::buildDescription(
const QString& description)
164 XmlWriter::buildEventList(
const EventList& eventList)
168 for (EventList::const_iterator i = eventList.begin(); i != eventList.end(); ++i)
173 eventNode->
append_attribute(document.allocate_attribute(
"name", cloneQString(event->name)));
175 if (!event->description.isEmpty())
177 eventNode->
append_node(buildDescription(event->description));
187 XmlWriter::buildParameterList(
const QString&
tagName,
193 for (armarx::statechartmodel::StateParameterMap::const_iterator i = parameterMap.begin();
194 i != parameterMap.end();
197 QString parameterName = i.key();
204 document.allocate_attribute(
"name", cloneQString(parameterName)));
206 document.allocate_attribute(
"type", cloneQString(parameter->type)));
209 cloneQString(QString::fromStdString(
210 variantInfo->getNestedHumanNameFromBaseName(parameter->type.toStdString())))));
212 document.allocate_attribute(
"optional", parameter->optional ?
"yes" :
"no"));
214 if (!parameter->description.isEmpty())
216 parameterNode->
append_node(buildDescription(parameter->description));
219 for (
auto j = parameter->profileDefaultValues.constBegin();
220 j != parameter->profileDefaultValues.constEnd();
225 QString profileName = j.key();
230 document.allocate_attribute(
"profile", cloneQString(profileName)));
236 jsonObject->serializeIceObject(j.value().first);
238 document.allocate_attribute(
"value", cloneQString(j.value().second)));
240 document.allocate_attribute(
"docValue",
241 cloneQString(QString::fromStdString(
242 escapeString(j.value().first->toString())))));
243 parameterNode->
append_node(profileDefaultValueNode);
245 else if (j.value().second.size() != 0)
248 document.allocate_attribute(
"value", cloneQString(j.value().second)));
249 parameterNode->
append_node(profileDefaultValueNode);
260 XmlWriter::escapeString(std::string
str)
262 str = simox::alg::replace_all(
str,
"\\",
"\\\\");
263 str = simox::alg::replace_all(
str,
"\r",
"\\r");
264 str = simox::alg::replace_all(
str,
"\n",
"\\n");
269 XmlWriter::buildParameterMappingList(
271 const QString& mappingName)
277 for (ParameterMappingList::const_iterator j = parameterMappingList.begin();
278 j != parameterMappingList.end();
286 QString mappingSourceString;
288 mappingSourceString =
292 document.allocate_attribute(
"sourceType", cloneQString(mappingSourceString)));
294 document.allocate_attribute(
"from", cloneQString(parameterMapping->sourceKey)));
296 document.allocate_attribute(
"to", cloneQString(parameterMapping->destinationKey)));
298 for (
auto j = parameterMapping->profileValues.constBegin();
299 j != parameterMapping->profileValues.constEnd();
304 QString profileName = j.key();
309 document.allocate_attribute(
"profile", cloneQString(profileName)));
313 document.allocate_attribute(
"value", cloneQString(j.value())));
314 parameterMappingNode->
append_node(profileDefaultValueNode);
330 "substateName", cloneQString(startStateTransition->destinationState->getInstanceName())));
333 startStateTransition->mappingToNextStatesInput,
"ParameterMappings");
339 auto supportPoints = startStateTransition->supportPoints.toPointList();
340 for (QList<QPointF>::const_iterator j = supportPoints.begin(); j != supportPoints.end(); ++j)
342 QPointF supportPoint = *j;
347 document.allocate_attribute(
"posX", cloneQString(QString::number(supportPoint.x()))));
349 document.allocate_attribute(
"posY", cloneQString(QString::number(supportPoint.y()))));
364 for (StateInstanceMap::const_iterator i = substateMap.begin(); i != substateMap.end(); ++i)
366 QString substateName = i.key();
369 substate->accept(*
this);
371 document.allocate_attribute(
"name", cloneQString(substateName)));
380 const QMap<QString, StateTreeNodePtr>& uuidToNodeMap)
384 for (CTransitionList::const_iterator i = transitionList.begin(); i != transitionList.end(); ++i)
391 "from", cloneQString(transition->sourceState->getInstanceName())));
392 if (transition->transitionUserCode && transition->destinationState)
395 document.allocate_attribute(
"transitionCodeEnabled",
"1"));
396 if (transition->destinationState->getStateClass())
399 uuidToNodeMap.find(transition->destinationState->getStateClass()->getUUID());
401 if (it != uuidToNodeMap.end())
407 "toClass", cloneQString(node->getState()->getStateName())));
409 "toGroup", cloneQString(node->getGroup()->getName())));
411 "toPackage", cloneQString(node->getGroup()->getPackageName())));
414 if (transition->sourceState)
416 if (transition->sourceState->getStateClass())
419 uuidToNodeMap.find(transition->sourceState->getStateClass()->getUUID());
421 if (it != uuidToNodeMap.end())
427 "fromClass", cloneQString(node->getState()->getStateName())));
429 "fromGroup", cloneQString(node->getGroup()->getName())));
432 cloneQString(node->getGroup()->getPackageName())));
438 throw LocalException() << (
"Could not find source stateclass of instance " +
439 transition->sourceState->getInstanceName() +
440 "! Please open all Remote States in the "
441 "Statechart Editor before saving.");
447 throw LocalException()
448 << (
"Could not find destination stateclass of instance " +
449 transition->destinationState->getInstanceName() +
450 "! Please open all Remote States in the Statechart Editor before saving.");
454 if (transition->destinationState)
457 "to", cloneQString(transition->destinationState->getInstanceName())));
461 document.allocate_attribute(
"eventName", cloneQString(transition->eventName)));
465 buildParameterMappingList(transition->mappingToNextStatesInput,
"ParameterMappings");
466 transitionNode->
append_node(parameterMappingsNode);
467 parameterMappingsNode = buildParameterMappingList(transition->mappingToParentStatesLocal,
468 "ParameterMappingsToParentsLocal");
469 transitionNode->
append_node(parameterMappingsNode);
470 parameterMappingsNode = buildParameterMappingList(transition->mappingToParentStatesOutput,
471 "ParameterMappingsToParentsOutput");
472 transitionNode->
append_node(parameterMappingsNode);
478 auto supportPoints = transition->supportPoints.toPointList();
479 for (QList<QPointF>::const_iterator j = supportPoints.begin(); j != supportPoints.end();
482 QPointF supportPoint = *j;
487 "posX", cloneQString(QString::number(supportPoint.x()))));
489 "posY", cloneQString(QString::number(supportPoint.y()))));
503 XmlWriter::buildXmlDeclaration()
513 XmlWriter::cloneQString(
const QString&
string)
516 return document.allocate_string(
string.
toUtf8());