18 #include "qnstcomposerplugin.h"
24 QnstComposerPlugin::QnstComposerPlugin(QObject* parent)
35 isSyncingFromTextual =
false;
38 QnstComposerPlugin::~QnstComposerPlugin()
43 void QnstComposerPlugin::createWidgets()
48 void QnstComposerPlugin::createConnections()
50 connect(view, SIGNAL(entityAdded(QString,QString,QMap<QString,QString>)),
51 SLOT(notifyEntityAddedInView(QString,QString,QMap<QString,QString>)));
53 connect(view, SIGNAL(entityRemoved(QString)),
54 SLOT(notifyEntityDeletedInView(QString)));
56 connect(view, SIGNAL(entityChanged(QString,QMap<QString,QString>)),
57 SLOT(notifyEntityChangedInView(QString,QMap<QString,QString>)));
59 connect(view, SIGNAL(entitySelected(QString)),
60 SLOT(requestEntitySelection(QString)));
67 QString data =
project->getPluginData(
"br.puc-rio.telemidia.qnst");
69 QString startEntitiesSep =
"~~VIEW-DATA~~";
70 QString endEntitiesSep =
"~~PLUGIN-DATA~~";
72 int indexOfStartEntities = data.indexOf(startEntitiesSep);
73 int indexOfEndEntities = data.indexOf(endEntitiesSep);
75 int indexOfStartEntitiesContent = indexOfStartEntities + startEntitiesSep.length();
78 QString mid = data.mid(indexOfStartEntitiesContent,
79 indexOfEndEntities - indexOfStartEntitiesContent);
83 startEntitiesSep =
"~~PLUGIN-DATA~~";
84 endEntitiesSep =
"$END_ENTITIES_LINES$";
86 indexOfStartEntities = data.indexOf(startEntitiesSep);
87 indexOfEndEntities = data.indexOf(endEntitiesSep);
89 indexOfStartEntitiesContent = indexOfStartEntities + startEntitiesSep.length();
92 mid = data.mid(indexOfStartEntitiesContent,
93 indexOfEndEntities - indexOfStartEntitiesContent);
96 int nextp = mid.indexOf(
"~");
100 QString entitypair = mid.mid(lastp, nextp - lastp);
102 QStringList list = entitypair.split(
"=");
104 QString coreID = list[0], structuralID = list[1];
106 entities[coreID] = structuralID;
109 if(view->hasEntity(structuralID))
112 view->getEntity(structuralID);
114 if(nstEntity != NULL)
116 QMap <QString, QString>::iterator begin, end, it;
117 QMap <QString, QString> userData;
119 Entity *entity =
project->getEntityById(coreID);
133 nextp = mid.indexOf(
"~", nextp+1);
146 data.append(
"$START_ENTITIES_LINES$");
148 data.append(
"~~VIEW-DATA~~");
149 data.append(view->serialize());
151 data.append(
"~~PLUGIN-DATA~~");
152 foreach(QString key, entities.keys()){
153 data.append(key+
"="+entities[key]+
"~");
156 data.append(
"$END_ENTITIES_LINES$");
163 void QnstComposerPlugin::updateFromModel()
165 QMap <QString, int> top, left, width, height;
168 foreach (QString key, entities.keys())
174 entity->getnstId() !=
"")
176 top[entity->getnstId()] = entity->getTop();
177 left[entity->getnstId()]= entity->getLeft();
178 height[entity->getnstId()] = entity->getHeight();
179 width[entity->getnstId()] = entity->getWidth();
183 foreach(QString coreID, entities.keys())
185 Entity *entity =
project->getEntityById(coreID);
188 requestEntityRemotion(entity);
193 view->clearAllData();
195 QStack <Entity *> stack;
200 Entity *current = stack.top();
203 QVector <Entity *> children = current->getChildren();
204 for(
int i = 0; i <children.size(); i++)
206 requestEntityAddition(children[i]);
207 stack.push(children[i]);
216 Entity *current = stack.top();
219 QVector <Entity *> children = current->getChildren();
220 for(
int i = 0; i <children.size(); i++)
222 requestEntityChange(children[i]);
223 stack.push(children[i]);
228 foreach (QString key, entities.keys())
232 if(entity && entity->getnstId() !=
"" && top.contains(entity->getnstId()))
234 entity->setTop(top[entity->getnstId()]);
235 entity->setLeft(left[entity->getnstId()]);
236 entity->setWidth(width[entity->getnstId()]);
237 entity->setHeight(height[entity->getnstId()]);
244 void QnstComposerPlugin::onEntityAdded(QString pluginID, Entity *entity)
246 if(isSyncingFromTextual)
return;
248 if (pluginID != getPluginInstanceID()){
249 requestEntityAddition(entity);
255 entities[entity->getUniqueId()] = request;
285 view->clearValidationErrors();
288 void QnstComposerPlugin::errorMessage(QString error)
293 void QnstComposerPlugin::onEntityChanged(QString pluginID, Entity *entity)
295 if(isSyncingFromTextual)
297 dirtyEntities.push_back(entity->getUniqueId());
301 if (pluginID != getPluginInstanceID())
302 requestEntityChange(entity);
305 if(entities.contains(entity->getUniqueId()))
307 QString structuralId = entities.value(entity->getUniqueId());
309 if(view->hasEntity(structuralId))
311 QnstEntity *nstEntity = view->getEntity(structuralId);
313 if(nstEntity != NULL)
329 view->clearValidationErrors();
332 void QnstComposerPlugin::onEntityRemoved(QString pluginID, QString entityID)
334 if(isSyncingFromTextual)
return;
336 if (pluginID != getPluginInstanceID())
338 requestEntityRemotion(
getProject()->getEntityById(entityID));
339 entities.remove(entityID);
343 void QnstComposerPlugin::changeSelectedEntity(QString pluginID,
void* param)
345 if(isSyncingFromTextual)
return;
346 QString* entityUID = (QString*) param;
348 if(entityUID != NULL)
350 Entity *entity =
getProject()->getEntityById(*entityUID);
353 requestEntitySelection(entity);
356 qWarning() <<
"QnstComposerPlugin is trying to select a entity that are not in the core"
361 void QnstComposerPlugin::requestEntityAddition(Entity* entity)
363 qDebug() <<
"QnstComposerPlugin::requestEntityAddition" << entity->getType();
365 QMap<QString, QString> properties;
377 entities[entity->getUniqueId()] = entity->getUniqueId();
379 if (entity->getAttribute(
"id") !=
"")
380 properties[
"id"] = entity->getAttribute(
"id");
388 entities[entity->getUniqueId()] = entity->getUniqueId();
390 if (entity->getAttribute(
"id") !=
"")
391 properties[
"id"] = entity->getAttribute(
"id");
393 if (entity->getAttribute(
"refer") !=
"")
394 properties[
"refer"] = entity->getAttribute(
"refer");
403 entities[entity->getUniqueId()] = entity->getUniqueId();
405 if (entity->getAttribute(
"id") !=
"")
406 properties[
"id"] = entity->getAttribute(
"id");
408 if (entity->getAttribute(
"refer") !=
"")
409 properties[
"refer"] = entity->getAttribute(
"refer");
418 entities[entity->getUniqueId()] = entity->getUniqueId();
420 properties[
"id"] = entity->getAttribute(
"id");
421 properties[
"src"] = entity->getAttribute(
"src");
422 properties[
"refer"] = entity->getAttribute(
"refer");
423 properties[
"instance"] = entity->getAttribute(
"instance");
424 properties[
"type"] = entity->getAttribute(
"type");
425 properties[
"descriptor"] = entity->getAttribute(
"descriptor");
427 if (entity->getAttribute(
"refer") !=
"")
429 QString referUID = getUidById(properties[
"refer"]);
430 if(entities.contains(referUID))
431 properties[
"referUID"] = entities[referUID];
435 properties[
"referUID"] =
"";
439 if(entities.contains(entity->getParentUniqueId()))
441 view->addEntity(entity->getUniqueId(),
442 entities[entity->getParentUniqueId()],
447 list =
getProject()->getEntitiesbyType(
"port");
450 foreach(Entity* e, list)
452 if (e->getAttribute(
"component") !=
"" &&
453 e->getAttribute(
"component") == properties[
"id"])
455 requestEntityChange(e);
464 entities[entity->getUniqueId()] = entity->getUniqueId();
466 properties[
"id"] = entity->getAttribute(
"id");
468 properties[
"component"] = entity->getAttribute(
"component");
469 if (entity->getAttribute(
"component") !=
"")
471 QString componentUID = getUidById(properties[
"component"]);
472 if(entities.contains(componentUID))
473 properties[
"componentUid"] = entities[componentUID];
476 properties[
"interface"] = entity->getAttribute(
"interface");
477 if (entity->getAttribute(
"interface") !=
"")
479 QString interfaceUID = getUidById(properties[
"interface"]);
480 if(entities.contains(interfaceUID))
481 properties[
"interfaceUid"] = entities[interfaceUID];
491 entities[entity->getUniqueId()] = entity->getUniqueId();
493 if (entity->getAttribute(
"id") !=
"")
494 properties[
"id"] = entity->getAttribute(
"id");
496 if (entity->getAttribute(
"xconnector") !=
"")
498 properties[
"xconnector"] = entity->getAttribute(
"xconnector");
500 QString xconnectorUID = getUidById(properties[
"xconnector"]);
501 if(entities.contains(xconnectorUID))
502 properties[
"xconnectorUID"] = entities[xconnectorUID];
504 properties[
"xconnectorUID"] =
"";
514 entities[entity->getUniqueId()] = entity->getUniqueId();
516 properties[
"role"] = entity->getAttribute(
"role");
517 properties[
"component"] = entity->getAttribute(
"component");
520 if (entity->getAttribute(
"component") !=
"")
522 comUID = getUidById(properties[
"component"]);
523 if(entities.contains(comUID))
524 properties[
"componentUid"] = entities[comUID];
526 properties[
"componentUid"] =
"";
530 properties[
"componentUid"] =
"";
533 properties[
"interface"] = entity->getAttribute(
"interface");
535 if (entity->getAttribute(
"interface") !=
"")
537 Entity* cmp =
getProject()->getEntityById(comUID);
541 foreach(Entity* c, cmp->getChildren())
543 if (c->getAttribute(
"id") == entity->getAttribute(
"interface") ||
544 c->getAttribute(
"name") == entity->getAttribute(
"interface"))
546 intUID = c->getUniqueId();
551 if(entities.contains(intUID))
552 properties[
"interfaceUid"] = entities[intUID];
554 properties[
"interfaceUid"] =
"";
559 properties[
"interfaceUid"] =
"";
562 properties[
"linkUID"] = entities[entity->getParentUniqueId()];
570 entities[entity->getUniqueId()] = entity->getUniqueId();
572 properties[
"id"] = entity->getAttribute(
"name");
580 entities[entity->getUniqueId()] = entity->getUniqueId();
582 properties[
"id"] = entity->getAttribute(
"id");
588 case Qnst::SwitchPort:
590 entities[entity->getUniqueId()] = entity->getUniqueId();
592 properties[
"id"] = entity->getAttribute(
"id");
600 entities[entity->getUniqueId()] = entity->getUniqueId();
602 properties[
"component"] = entity->getAttribute(
"component");
603 if (entity->getAttribute(
"component") !=
"")
605 QString componentUID = getUidById(properties[
"component"]);
606 if(entities.contains(componentUID))
607 properties[
"componentUid"] = entities[componentUID];
610 properties[
"interface"] = entity->getAttribute(
"interface");
611 if (entity->getAttribute(
"interface") !=
"")
613 QString interfaceUID = getUidById(properties[
"interface"]);
614 if(entities.contains(interfaceUID))
615 properties[
"interfaceUid"] = entities[interfaceUID];
622 case Qnst::BindParam:
625 properties[
"name"] = entity->getAttribute(
"name");
626 properties[
"value"] = entity->getAttribute(
"value");
641 if(type == Qnst::Body)
643 view->addEntity(entity->getUniqueId(),
"", properties);
648 QString parentUID = entity->getParentUniqueId();
649 if(entities.contains(parentUID))
650 view->addEntity(entity->getUniqueId(), entities[parentUID], properties);
652 qWarning() <<
"QnstPlugin:: You are trying to add a "
654 <<
" inside an entity that does not exists.";
660 if (entity->getType() ==
"causalConnector")
662 entities[entity->getUniqueId()] = entity->getUniqueId();
664 requestCausalConnectorAddition(entity);
666 else if (entity->getType() ==
"simpleCondition")
668 entities[entity->getUniqueId()] = entity->getUniqueId();
670 requestSimpleConditionAddition(entity);
672 else if (entity->getType() ==
"simpleAction")
674 entities[entity->getUniqueId()] = entity->getUniqueId();
676 requestSimpleActionAddition(entity);
678 else if (entity->getType() ==
"importBase")
680 entities[entity->getUniqueId()] = entity->getUniqueId();
681 requestImportBaseAddition(entity);
683 else if (entity->getType() ==
"connectorParam")
685 entities[entity->getUniqueId()] = entity->getUniqueId();
686 requestConnectorParamAddition(entity);
691 void QnstComposerPlugin::requestEntityRemotion(Entity* entity)
693 if (isEntityHandled(entity))
695 QString entityID = entity->getUniqueId();
696 if(entities.contains(entityID))
698 view->removeEntity(entities[entityID]);
699 entities.remove(entityID);
702 qWarning() <<
"You are trying to remove an entity that are not in the QnstComposerPlugin.";
706 void QnstComposerPlugin::requestEntityChange(Entity* entity)
708 QMap<QString, QString> properties;
719 if (entity->getAttribute(
"id") !=
"")
720 properties[
"id"] = entity->getAttribute(
"id");
728 if (entity->getAttribute(
"id") !=
"")
729 properties[
"id"] = entity->getAttribute(
"id");
731 if (entity->getAttribute(
"refer") !=
"")
732 properties[
"refer"] = entity->getAttribute(
"refer");
740 properties[
"id"] = entity->getAttribute(
"id");
741 properties[
"src"] = entity->getAttribute(
"src");
742 properties[
"refer"] = entity->getAttribute(
"refer");
743 properties[
"instance"] = entity->getAttribute(
"instance");
744 properties[
"type"] = entity->getAttribute(
"type");
745 properties[
"descriptor"] = entity->getAttribute(
"descriptor");
747 if(properties[
"refer"] !=
"")
749 QString referUID = getUidById(properties[
"refer"]);
750 if(entities.contains(referUID))
751 properties[
"referUID"] = entities[referUID];
755 properties[
"referUID"] =
"";
758 if(entities.contains(entity->getUniqueId()))
759 view->changeEntity( entities[entity->getUniqueId()],
763 list =
getProject()->getEntitiesbyType(
"port");
765 foreach(Entity* e, list){
766 if (e->getAttribute(
"component") !=
"")
768 if (e->getAttribute(
"component") == properties[
"id"])
770 requestEntityChange(e);
781 properties[
"id"] = entity->getAttribute(
"id");
782 properties[
"component"] = entity->getAttribute(
"component");
783 if (entity->getAttribute(
"component") !=
"")
785 QString componentUID = getUidById(properties[
"component"]);
786 if(entities.contains(componentUID))
787 properties[
"componentUid"] = entities[componentUID];
790 if (properties[
"componentUid"] !=
"")
792 properties[
"interface"] = entity->getAttribute(
"interface");
793 if (entity->getAttribute(
"interface") !=
"")
795 QString interfaceUID =
796 getUidByName(properties[
"interface"],
798 getUidById(properties[
"component"])));
800 if(entities.contains(interfaceUID))
801 properties[
"interfaceUid"] = entities[interfaceUID];
811 if (entity->getAttribute(
"id") !=
"")
812 properties[
"id"] = entity->getAttribute(
"id");
814 if (entity->getAttribute(
"xconnector") !=
"")
816 properties[
"xconnector"] = entity->getAttribute(
"xconnector");
817 if(entities.contains(getUidById(properties[
"xconnector"])))
819 properties[
"xconnectorUID"] =
820 entities[getUidById(properties[
"xconnector"])];
823 properties[
"xconnectorUID"] =
"";
832 case Qnst::Condition:
834 properties[
"TYPE"] =
"bind";
835 properties[
"role"] = entity->getAttribute(
"role");
836 properties[
"component"] = entity->getAttribute(
"component");
839 if (entity->getAttribute(
"component") !=
"")
841 comUID = getUidById(properties[
"component"]);
842 if(entities.contains(comUID))
843 properties[
"componentUid"] = entities[comUID];
845 properties[
"componentUid"] =
"";
849 properties[
"componentUid"] =
"";
852 properties[
"interface"] = entity->getAttribute(
"interface");
853 if (entity->getAttribute(
"interface") !=
"")
855 Entity* cmp =
getProject()->getEntityById(comUID);
860 foreach(Entity* c, cmp->getChildren())
862 if (c->getAttribute(
"id") == entity->getAttribute(
"interface") ||
863 c->getAttribute(
"name") == entity->getAttribute(
"interface"))
865 intUID = c->getUniqueId();
870 if(entities.contains(intUID))
871 properties[
"interfaceUid"] = entities[intUID];
873 properties[
"interfaceUid"] =
"";
878 properties[
"interfaceUid"] =
"";
882 properties[
"linkUID"] = entities[entity->getParentUniqueId()];
890 properties[
"TYPE"] =
"area";
891 properties[
"id"] = entity->getAttribute(
"id");
899 properties[
"TYPE"] =
"property";
900 properties[
"id"] = entity->getAttribute(
"name");
906 case Qnst::SwitchPort:
908 properties[
"id"] = entity->getAttribute(
"id");
915 properties[
"component"] = entity->getAttribute(
"component");
916 if (entity->getAttribute(
"component") !=
"")
918 QString componentUID = getUidById(properties[
"component"]);
919 if(entities.contains(componentUID))
920 properties[
"componentUid"] = entities[componentUID];
923 properties[
"interface"] = entity->getAttribute(
"interface");
924 if (entity->getAttribute(
"interface") !=
"")
926 QString interfaceUID = getUidById(properties[
"interface"]);
927 if(entities.contains(interfaceUID))
928 properties[
"interfaceUid"] = entities[interfaceUID];
935 case Qnst::BindParam:
937 properties[
"TYPE"] =
"bindParam";
939 properties[
"name"] = entity->getAttribute(
"name");
940 properties[
"value"] = entity->getAttribute(
"value");
941 properties[
"parent"] = entities[entity->getParentUniqueId()];
950 if(entities.contains(entity->getUniqueId()))
951 view->changeEntity(entities[entity->getUniqueId()], properties);
953 qWarning() <<
"QnstPlugin:: You are trying to EDIT an entity that does not exists.";
958 if (entity->getType() ==
"causalConnector")
960 requestCausalConnectorChange(entity);
963 else if (entity->getType() ==
"simpleCondition")
965 requestSimpleConditionChange(entity);
968 else if (entity->getType() ==
"simpleAction")
970 requestSimpleActionChange(entity);
973 else if (entity->getType() ==
"importBase")
975 requestImportBaseChange(entity);
977 else if (entity->getType() ==
"connectorParam")
984 void QnstComposerPlugin::requestEntitySelection(Entity* entity)
986 if (entities.contains(entity->getUniqueId()) &&
987 lastSelected != entity->getUniqueId())
989 if (entity->getType() ==
"body" ||
990 entity->getType() ==
"context" ||
991 entity->getType() ==
"media" ||
992 entity->getType() ==
"switch" ||
993 entity->getType() ==
"port" ||
994 entity->getType() ==
"link" ||
995 entity->getType() ==
"area" ||
996 entity->getType() ==
"mapping" ||
997 entity->getType() ==
"bind" ||
998 entity->getType() ==
"switchPort" ||
999 entity->getType() ==
"property")
1001 view->selectEntity(entities[entity->getUniqueId()]);
1006 void QnstComposerPlugin::requestImportBaseAddition(Entity* entity)
1008 qWarning() <<
"Adding requestImportBaseAddition " << entity;
1011 Entity* parent = entity->getParent();
1015 if (parent->getType() ==
"connectorBase")
1017 QMap<QString, QString> properties;
1019 properties[
"TYPE"] =
"importBase";
1021 if (entity->getAttribute(
"documentURI") !=
"")
1023 properties[
"projectURI"] =
getProject()->getLocation();
1024 properties[
"documentURI"] = entity->getAttribute(
"documentURI");
1027 if (entity->getAttribute(
"alias") !=
"")
1028 properties[
"alias"] = entity->getAttribute(
"alias");
1031 view->addEntity( entity->getUniqueId(),
1032 parent->getUniqueId(),
1039 void QnstComposerPlugin::requestImportBaseChange(Entity* entity)
1043 Entity* parent = entity->getParent();
1047 if (parent->getType() ==
"connectorBase")
1049 QMap<QString, QString> properties;
1051 properties[
"TYPE"] =
"importBase";
1053 if (entity->getAttribute(
"documentURI") !=
"")
1055 properties[
"projectURI"] =
getProject()->getLocation();
1056 properties[
"documentURI"] = entity->getAttribute(
"documentURI");
1059 if (entity->getAttribute(
"alias") !=
"")
1060 properties[
"alias"] = entity->getAttribute(
"alias");
1064 view->changeEntity(entity->getUniqueId(),properties);
1070 void QnstComposerPlugin::requestCausalConnectorAddition(Entity* entity)
1072 QMap<QString, QString> properties;
1074 properties[
"TYPE"] =
"causalConnector";
1076 if (entity->getAttribute(
"id") !=
"")
1077 properties[
"id"] = entity->getAttribute(
"id");
1079 if(entity->getParent()->getType() ==
"importBase")
1080 view->addEntity(entity->getUniqueId(), entity->getParentUniqueId(),
1083 view->addEntity(entity->getUniqueId(),
"", properties);
1086 void QnstComposerPlugin::requestCausalConnectorChange(Entity* entity)
1088 QMap<QString, QString> properties;
1090 if (entity->getAttribute(
"id") !=
"")
1091 properties[
"id"] = entity->getAttribute(
"id");
1093 if(entities.contains(entity->getUniqueId()))
1094 view->changeEntity(entities[entity->getUniqueId()], properties);
1097 void QnstComposerPlugin::requestSimpleConditionAddition(Entity* entity)
1099 QMap<QString, QString> properties;
1101 properties[
"TYPE"] =
"simpleCondition";
1102 Entity* conn = entity->getParent();
1103 while (conn->getType() !=
"causalConnector" && conn !=
getProject())
1105 conn = conn->getParent();
1108 if(entities.contains(conn->getUniqueId()))
1109 properties[
"connector"] = entities[conn->getUniqueId()];
1111 properties[
"connector"] =
"";
1113 if (entity->getAttribute(
"role") !=
"")
1115 properties[
"role"] = entity->getAttribute(
"role");
1118 QMap<QString, QString>::iterator begin;
1119 QMap<QString, QString>::iterator end;
1121 entity->getAttributeIterator(begin,end);
1127 QString name(begin.key());
1128 QString value(begin.value());
1130 if (value.startsWith(
"$"))
1132 properties[
"attr"+QString::number(n)] = name;
1133 properties[
"value"+QString::number(n)] = value.replace(
'$',
"");
1140 if(entities.contains(conn->getUniqueId()))
1141 view->addEntity(entity->getUniqueId(),
1142 entities[conn->getUniqueId()], properties);
1144 view->addEntity(entity->getUniqueId(),
"", properties);
1147 void QnstComposerPlugin::requestSimpleConditionChange(Entity* entity)
1149 QMap<QString, QString> properties;
1151 properties[
"TYPE"] =
"simpleCondition";
1153 Entity* conn = entity->getParent();
1154 while (conn->getType() !=
"causalConnector" && conn !=
getProject())
1156 conn = conn->getParent();
1159 if(entities.contains(conn->getUniqueId()))
1160 properties[
"connector"] = entities[conn->getUniqueId()];
1162 properties[
"connector"] =
"";
1164 if (entity->getAttribute(
"role") !=
"")
1165 properties[
"role"] = entity->getAttribute(
"role");
1167 QMap<QString, QString>::iterator begin;
1168 QMap<QString, QString>::iterator end;
1170 entity->getAttributeIterator(begin,end);
1176 QString name(begin.key());
1177 QString value(begin.value());
1179 if (value.startsWith(
"$"))
1181 properties[
"attr"+QString::number(n)] = name;
1182 properties[
"value"+QString::number(n)] = value.replace(
'$',
"");
1189 if(entities.contains(entity->getUniqueId()))
1190 view->changeEntity(entities[entity->getUniqueId()], properties);
1193 void QnstComposerPlugin::requestSimpleActionAddition(Entity* entity)
1195 QMap<QString, QString> properties;
1197 properties[
"TYPE"] =
"simpleAction";
1199 Entity* conn = entity->getParent();
1200 while (conn->getType() !=
"causalConnector" && conn !=
getProject())
1202 conn = conn->getParent();
1205 if(entities.contains(conn->getUniqueId()))
1206 properties[
"connector"] = entities[conn->getUniqueId()];
1208 properties[
"connector"] =
"";
1210 if (entity->getAttribute(
"role") !=
"")
1212 properties[
"role"] = entity->getAttribute(
"role");
1215 QMap<QString, QString>::iterator begin;
1216 QMap<QString, QString>::iterator end;
1218 entity->getAttributeIterator(begin,end);
1224 QString name(begin.key());
1225 QString value(begin.value());
1227 if (value.startsWith(
"$"))
1229 properties[
"attr"+QString::number(n)] = name;
1230 properties[
"value"+QString::number(n)] = value.replace(
'$',
"");
1237 if(entities.contains(conn->getUniqueId()))
1238 view->addEntity(entity->getUniqueId(),
1239 entities[conn->getUniqueId()], properties);
1241 view->addEntity(entity->getUniqueId(),
"", properties);
1244 void QnstComposerPlugin::requestSimpleActionChange(Entity* entity)
1246 QMap<QString, QString> properties;
1248 properties[
"TYPE"] =
"simpleAction";
1250 Entity* conn = entity->getParent();
1251 while (conn->getType() !=
"causalConnector" && conn !=
getProject())
1253 conn = conn->getParent();
1256 if(entities.contains(conn->getUniqueId()))
1257 properties[
"connector"] = entities[conn->getUniqueId()];
1259 properties[
"connector"] =
"";
1261 if (entity->getAttribute(
"role") !=
"")
1262 properties[
"role"] = entity->getAttribute(
"role");
1264 QMap<QString, QString>::iterator begin;
1265 QMap<QString, QString>::iterator end;
1267 entity->getAttributeIterator(begin,end);
1273 QString name(begin.key());
1274 QString value(begin.value());
1276 if (value.startsWith(
"$"))
1278 properties[
"attr"+QString::number(n)] = name;
1279 properties[
"value"+QString::number(n)] = value.replace(
'$',
"");
1286 if(entities.contains(entity->getUniqueId()))
1287 view->changeEntity(entities[entity->getUniqueId()], properties);
1290 void QnstComposerPlugin::requestConnectorParamAddition(Entity* entity)
1292 QMap<QString, QString> properties;
1294 properties[
"TYPE"] =
"connectorParam";
1296 properties[
"name"] = entity->getAttribute(
"name");
1298 QString parentUID = entity->getParentUniqueId();
1299 if(entities.contains(parentUID))
1300 view->addEntity(entity->getUniqueId(), entities[parentUID], properties);
1302 qWarning() <<
"QnstPlugin:: You are trying to add an CONNECTORPARAM as child of an entity that does not exists.";
1307 void QnstComposerPlugin::requestConnectorParamChange(Entity* entity)
1309 QMap<QString, QString> properties;
1311 properties[
"TYPE"] =
"connectorParam";
1313 properties[
"name"] = entity->getAttribute(
"name");
1314 properties[
"parent"] = entities[entity->getParentUniqueId()];
1316 if(entities.contains(entity->getUniqueId()))
1317 view->changeEntity(entities[entity->getUniqueId()], properties);
1320 void QnstComposerPlugin::notifyEntityAddedInView(
const QString uid,
1321 const QString parent,
1322 QMap<QString, QString> properties)
1326 Entity* entity = NULL;
1328 QMap<QString, QString> attributes;
1329 bool mustEmitAddEntity =
false;
1331 if(type != Qnst::Body)
1333 entity =
getProject()->getEntityById(entities.key(parent));
1337 qWarning() <<
"[QNST] Warning: trying to add an entity as child of an inexistent Entity";
1338 if(properties[
"TYPE"] ==
"importBase" ||
1339 properties[
"TYPE"] ==
"causalConnector" ||
1340 properties[
"TYPE"] ==
"connector" ||
1341 properties[
"TYPE"] ==
"complex-connector")
1343 qWarning() <<
"[QNST] " << properties[
"TYPE"] <<
" is a special case. So, we will not need a parent.";
1347 qWarning() <<
"[QNST] The entityAdd is beging ignored!";
1358 requestBodyDependence();
1359 QList<Entity*> list =
getProject()->getEntitiesbyType(
"ncl");
1361 if (!list.isEmpty())
1363 entity = list.first();
1365 if (properties[
"id"] !=
"")
1366 attributes[
"id"] = properties[
"id"];
1368 mustEmitAddEntity =
true;
1375 if (properties[
"id"] !=
"")
1376 attributes[
"id"] = properties[
"id"];
1378 if (properties[
"refer"] !=
"")
1379 attributes[
"refer"] = properties[
"refer"];
1381 mustEmitAddEntity =
true;
1387 if (properties[
"id"] !=
"")
1388 attributes[
"id"] = properties[
"id"];
1390 if (properties[
"refer"] !=
"")
1391 attributes[
"refer"] = properties[
"refer"];
1393 mustEmitAddEntity =
true;
1399 if (properties[
"id"] !=
"")
1400 attributes[
"id"] = properties[
"id"];
1402 if (properties[
"src"] !=
"")
1404 QString src = properties[
"src"];
1407 attributes[
"src"] = Utilities::relativePath(
project->getLocation(),
1412 attributes[
"src"] = properties[
"src"];
1416 if (properties[
"refer"] !=
"")
1417 attributes[
"refer"] = properties[
"refer"];
1419 if (properties[
"instance"] !=
"")
1420 attributes[
"instance"] = properties[
"instance"];
1422 if (properties[
"type"] !=
"")
1423 attributes[
"type"] = properties[
"type"];
1425 if (properties[
"descriptor"] !=
"")
1426 attributes[
"descriptor"] = properties[
"descriptor"];
1428 mustEmitAddEntity =
true;
1433 attributes[
"id"] = properties[
"id"];
1434 attributes[
"component"] = properties[
"component"];
1436 if(properties[
"interface"] !=
"")
1437 attributes[
"interface"] = properties[
"interface"];
1439 mustEmitAddEntity =
true;
1445 attributes[
"id"] = properties[
"id"];
1446 attributes[
"xconnector"] = properties[
"xconnector"];
1448 mustEmitAddEntity =
true;
1455 requestBindAddition(uid, parent, properties);
1456 mustEmitAddEntity =
false;
1462 attributes[
"id"] = properties[
"id"];
1463 mustEmitAddEntity =
true;
1467 case Qnst::Property:
1469 attributes[
"name"] = properties[
"id"];
1471 mustEmitAddEntity =
true;
1475 case Qnst::SwitchPort:
1477 if (properties[
"id"] !=
"")
1478 attributes[
"id"] = properties[
"id"];
1480 mustEmitAddEntity =
true;
1486 if (properties[
"component"] !=
"")
1487 attributes[
"component"] = properties[
"component"];
1489 if (properties[
"interface"] !=
"")
1490 attributes[
"interface"] = properties[
"interface"];
1492 mustEmitAddEntity =
true;
1496 case Qnst::BindParam:
1498 if (properties[
"name"] !=
"")
1499 attributes[
"name"] = properties[
"name"];
1501 if (properties[
"value"] !=
"")
1502 attributes[
"value"] = properties[
"value"];
1504 mustEmitAddEntity=
true;
1513 if(mustEmitAddEntity && entity != NULL)
1517 entity->getUniqueId(), attributes,
false);
1524 if (properties[
"TYPE"] ==
"connector")
1525 requestConnectorAddition(uid, parent, properties);
1526 else if (properties[
"TYPE"] ==
"complex-connector")
1527 requestComplexConnectorAddition(uid, parent, properties);
1531 void QnstComposerPlugin::notifyEntityDeletedInView(
const QString uid)
1533 if (entities.key(uid,
"nil") !=
"nil")
1536 entities.remove(entities.key(uid));
1540 void QnstComposerPlugin::notifyEntityChangedInView(
const QString uid,
1541 QMap<QString, QString> properties)
1545 QMap<QString, QString> attributes;
1546 Entity* entity =
getProject()->getEntityById(entities.key(uid));
1548 bool mustSetAttributes =
false;
1552 qWarning() <<
"[QNST] Error!!! Trying to change a entity that does not exist in the model";
1559 if (properties[
"id"] !=
"")
1560 attributes[
"id"] = properties[
"id"];
1562 mustSetAttributes =
true;
1569 if (properties[
"id"] !=
"")
1570 attributes[
"id"] = properties[
"id"];
1572 if (properties[
"refer"] !=
"")
1573 attributes[
"refer"] = properties[
"refer"];
1575 mustSetAttributes =
true;
1581 if (properties[
"id"] !=
"")
1582 attributes[
"id"] = properties[
"id"];
1584 if (properties[
"src"] !=
"")
1585 attributes[
"src"] = properties[
"src"];
1587 if (properties[
"refer"] !=
"")
1588 attributes[
"refer"] = properties[
"refer"];
1590 if (properties[
"instance"] !=
"")
1591 attributes[
"instance"] = properties[
"instance"];
1593 if (properties[
"type"] !=
"")
1594 attributes[
"type"] = properties[
"type"];
1596 if (properties[
"descriptor"] !=
"")
1597 attributes[
"descriptor"] = properties[
"descriptor"];
1599 mustSetAttributes =
true;
1605 attributes[
"id"] = properties[
"id"];
1607 if(properties[
"component"] !=
"")
1608 attributes[
"component"] = properties[
"component"];
1610 if(properties[
"interface"] !=
"")
1611 attributes[
"interface"] = properties[
"interface"];
1613 mustSetAttributes =
true;
1617 case Qnst::BindParam:
1619 if (properties[
"name"] !=
"")
1620 attributes[
"name"] = properties[
"name"];
1622 if (properties[
"value"] !=
"")
1623 attributes[
"value"] = properties[
"value"];
1625 mustSetAttributes =
true;
1631 if (properties[
"component"] !=
"")
1632 attributes[
"component"] = properties[
"component"];
1634 if (properties[
"interface"] !=
"")
1635 attributes[
"interface"] = properties[
"interface"];
1637 mustSetAttributes =
true;
1641 case Qnst::SwitchPort:
1644 if (properties[
"id"] !=
"")
1645 attributes[
"id"] = properties[
"id"];
1647 mustSetAttributes =
true;
1651 case Qnst::Property:
1659 if(mustSetAttributes)
1666 QString coreID = entities.key(uid);
1667 QnstEntity *qnstEntity = view->entities.value(uid);
1668 if(qnstEntity != NULL)
1678 void QnstComposerPlugin::requestEntitySelection(
const QString uid)
1680 if (entities.key(uid,
"nil") !=
"nil")
1682 lastSelected = entities.key(uid);
1685 new QString(entities.key(uid)));
1689 void QnstComposerPlugin::requestBodyDependence()
1691 QList<Entity*> list =
getProject()->getEntitiesbyType(
"ncl");
1696 if (project != NULL)
1698 QMap<QString, QString> attributes;
1699 emit
addEntity(
"ncl", project->getUniqueId(), attributes,
false);
1704 void QnstComposerPlugin::requestConnectorAddition(
const QString uid,
1705 const QString parent,
1706 const QMap<QString, QString> &properties)
1708 requestConnectorDependence();
1710 qWarning() <<
"QnstComposerPlugin::requestConnectorAddition";
1712 QList<Entity*> list =
getProject()->getEntitiesbyType(
"connectorBase");
1714 if (!list.isEmpty())
1716 Entity* entity = list.first();
1720 QMap<QString, QString> attributes;
1722 attributes[
"id"] = properties[
"id"];
1725 emit
addEntity(
"causalConnector", entity->getUniqueId(), attributes,
false);
1729 QMap<QString, QString> cattributes;
1730 cattributes[
"role"] = properties[
"condition"];
1731 cattributes[
"max"] =
"unbounded";
1733 emit
addEntity(
"simpleCondition", entities.key(uid), cattributes,
false);
1736 QMap<QString, QString> aattributes;
1737 aattributes[
"role"] = properties[
"action"].toLower();
1738 aattributes[
"max"] =
"unbounded";
1740 emit
addEntity(
"simpleAction", entities.key(uid), aattributes,
false);
1745 void QnstComposerPlugin::requestComplexConnectorAddition(
const QString uid,
1746 const QString parent,
1747 const QMap<QString, QString> &properties)
1749 requestConnectorDependence();
1751 QList<Entity*> list =
getProject()->getEntitiesbyType(
"connectorBase");
1753 if (!list.isEmpty())
1755 Entity* entity = list.first();
1759 QMap<QString, QString> attributes;
1761 attributes[
"id"] = properties[
"id"];
1764 emit
addEntity(
"causalConnector", entity->getUniqueId(), attributes,
false);
1767 QMap<QString, QString> fakemap;
1768 fakemap[
"operator"] =
"or";
1769 emit
addEntity(
"compoundCondition", entities.key(uid), fakemap,
false);
1771 fakemap[
"operator"] =
"par";
1772 emit
addEntity(
"compoundAction", entities.key(uid), fakemap,
false);
1777 Entity *cmp =
getProject()->getEntityById(entities.key(uid));
1780 foreach(Entity* child, cmp->getChildren())
1782 if (child->getType() ==
"compoundCondition")
1783 cpcUID = child->getUniqueId();
1785 if (child->getType() ==
"compoundAction")
1786 cpaUID = child->getUniqueId();
1791 if (properties[
"condition"] !=
"" && cpcUID !=
"")
1793 QMap<QString, QString> cattributes;
1794 cattributes[
"role"] = properties[
"condition"];
1795 cattributes[
"max"] =
"unbounded";
1797 request = properties[
"conditionUID"];
1798 emit
addEntity(
"simpleCondition", cpcUID, cattributes,
false);
1803 if (properties[
"action"] !=
"" && cpaUID !=
"")
1805 QMap<QString, QString> aattributes;
1806 aattributes[
"role"] = properties[
"action"].toLower();
1807 aattributes[
"max"] =
"unbounded";
1809 request = properties[
"actionUID"];
1810 emit
addEntity(
"simpleAction", cpaUID, aattributes,
false);
1817 void QnstComposerPlugin::requestConnectorDependence()
1819 requestConnectorBaseDependence();
1821 QList<Entity*> list =
getProject()->getEntitiesbyType(
"connectorBase");
1825 Entity* parent = NULL;
1827 if (!
getProject()->getEntitiesbyType(
"head").isEmpty())
1828 parent =
getProject()->getEntitiesbyType(
"head").first();
1832 QMap<QString, QString> attributes;
1834 emit
addEntity(
"connectorBase", parent->getUniqueId(), attributes,
false);
1839 void QnstComposerPlugin::requestConnectorBaseDependence()
1841 QList<Entity*> list =
getProject()->getEntitiesbyType(
"head");
1845 Entity* parent = NULL;
1847 if (!
getProject()->getEntitiesbyType(
"ncl").isEmpty())
1848 parent =
getProject()->getEntitiesbyType(
"ncl").first();
1852 QMap<QString, QString> attributes;
1854 emit
addEntity(
"head", parent->getUniqueId(), attributes,
false);
1859 void QnstComposerPlugin::requestBindAddition(
const QString uid,
1860 const QString parent,
1861 const QMap<QString, QString> &properties)
1864 QList<Entity*> connectors =
getProject()->getEntitiesbyType(
"causalConnector");
1866 QString connUID =
"";
1868 foreach(Entity* conn, connectors)
1870 if (conn->getAttribute(
"id") == properties[
"connector"])
1872 connUID = conn->getUniqueId();
1877 QString cpcUID =
"";
1878 QString cpaUID =
"";
1882 Entity *cmp =
getProject()->getEntityById(connUID);
1885 foreach(Entity* child, cmp->getChildren())
1887 if (child->getType() ==
"compoundCondition")
1888 cpcUID = child->getUniqueId();
1890 if (child->getType() ==
"compoundAction")
1891 cpaUID = child->getUniqueId();
1896 if (cpcUID !=
"" && cpaUID !=
"")
1898 if (properties[
"condition"] !=
"")
1900 bool hasCond =
false;
1901 Entity *cmp =
getProject()->getEntityById(cpcUID);
1904 foreach(Entity* child, cmp->getChildren())
1906 if (child->getAttribute(
"role") == properties[
"condition"])
1916 QMap<QString, QString> cattributes;
1918 cattributes[
"role"] = properties[
"condition"];
1920 emit
addEntity(
"simpleCondition", cpcUID, cattributes,
false);
1924 if (properties[
"action"] !=
"")
1926 bool hasAct =
false;
1928 Entity *cmp =
getProject()->getEntityById(cpaUID);
1931 foreach(Entity* child, cmp->getChildren())
1933 if (child->getAttribute(
"role") == properties[
"action"].toLower())
1943 QMap<QString, QString> aattributes;
1944 aattributes[
"role"] = properties[
"action"].toLower();
1946 emit
addEntity(
"simpleAction", cpaUID, aattributes,
false);
1952 QList<Entity*> links =
getProject()->getEntitiesbyType(
"link");
1954 QString liknUID =
"";
1956 foreach(Entity* link, links)
1958 if (link->getAttribute(
"id") == properties[
"link"])
1960 liknUID = link->getUniqueId();
1967 QMap<QString, QString> linkattributes;
1969 linkattributes[
"id"] = properties[
"link"];
1970 linkattributes[
"xconnector"] = properties[
"connector"];
1972 if (properties[
"linkUID"] !=
"")
1973 request = properties[
"linkUID"];
1975 request = QUuid::createUuid().toString();
1979 getProject()->getEntityById(entities.key(parent))->getUniqueId(),
1980 linkattributes,
false);
1983 liknUID = getUidById(linkattributes[
"id"]);
1987 if (properties[
"condition"] !=
"")
1990 QMap<QString, QString> cattributes;
1992 cattributes[
"role"] = properties[
"condition"];
1993 cattributes[
"component"] = properties[
"component"];
1995 if (properties[
"interface"] !=
"")
1996 cattributes[
"interface"] = properties[
"interface"];
1999 emit
addEntity(
"bind", liknUID, cattributes,
false);
2003 else if (properties[
"action"] !=
"")
2006 QMap<QString, QString> aattributes;
2008 aattributes[
"role"] = properties[
"action"].toLower();
2009 aattributes[
"component"] = properties[
"component"];
2011 if (properties[
"interface"] !=
"")
2012 aattributes[
"interface"] = properties[
"interface"];
2015 emit
addEntity(
"bind", liknUID, aattributes,
false);
2020 QString QnstComposerPlugin::getUidById(QString
id)
2025 QString QnstComposerPlugin::getUidById(QString
id, Entity* entity)
2029 if (entity->getAttribute(
"id") == id)
2030 return entity->getUniqueId();
2032 foreach(Entity* child, entity->getChildren())
2034 QString result = getUidById(
id, child);
2046 QString QnstComposerPlugin::getUidByName(QString name, Entity* entity)
2050 if (entity->getAttribute(
"name") == name)
2051 return entity->getUniqueId();
2053 foreach(Entity* child, entity->getChildren())
2055 QString result = getUidByName(name, child);
2068 void QnstComposerPlugin::cacheNCLIds()
2071 QString coreUID, structuralID, nclID;
2073 nclIDtoStructural.clear();
2074 previousCoreID.clear();
2075 foreach(coreUID, entities.keys())
2077 structuralID = entities.value(coreUID);
2078 current = project->getEntityById(coreUID);
2081 nclID = getNCLIdFromEntity(current);
2082 if(!nclID.isEmpty() && !nclID.isNull())
2084 nclIDtoStructural.insert(nclID, structuralID);
2085 previousCoreID.push_back(coreUID);
2091 QString QnstComposerPlugin::insertNCLIDIfEmpty(Entity *entity)
2093 const QString defaultID =
"idBody000";
2094 QString
id = entity->getAttribute(
"id");
2095 if(
id.isEmpty() ||
id.isNull())
2097 QMap <QString, QString> attrsTmp;
2098 QMap <QString, QString>::iterator begin, end, it;
2099 entity->getAttributeIterator(begin, end);
2100 for (it = begin; it != end; ++it)
2102 attrsTmp.insert(it.key(), it.value());
2104 attrsTmp.insert(
"id", defaultID);
2111 QString QnstComposerPlugin::getNCLIdFromEntity(Entity *entity)
2116 if(entity->getType() ==
"body")
2117 nclID = insertNCLIDIfEmpty(entity);
2119 if(entity->hasAttribute(
"id"))
2120 nclID = entity->getAttribute(
"id");
2121 else if(entity->hasAttribute(
"name"))
2122 nclID = entity->getAttribute(
"name");
2124 else if(entity->hasAttribute(
"alias"))
2125 nclID = entity->getAttribute(
"alias");
2127 nclID = QUuid::createUuid().toString();
2131 Entity *parent = entity->getParent();
2132 while(parent != NULL && parent->hasAttribute(
"id"))
2134 nclID = parent->getAttribute(
"id") +
"#" + nclID;
2135 parent = parent->getParent();
2141 bool QnstComposerPlugin::isEntityHandled(Entity *entity)
2145 QString type = entity->getType();
2148 if(type ==
"body" || type ==
"context" || type ==
"media" ||
2149 type ==
"switch" || type ==
"port" || type ==
"link" || type ==
"bind" ||
2150 type ==
"area" || type ==
"property" || type ==
"causalConnector" ||
2151 type ==
"switchPort" || type ==
"mapping" || type ==
"importBase"||
2152 type ==
"bindParam" || type ==
"connectorParam" ||
2153 type ==
"simpleCondition" || type ==
"simpleAction")
2160 void QnstComposerPlugin::syncNCLIdsWithStructuralIds()
2162 QMap <QString, QString> nclIDtoCoreID;
2163 QList <QString> nclCoreID_Ordered, alreadyUpdatedCoreId;
2164 QStack <Entity*> stack;
2165 Entity *currentEntity;
2166 QString currentNCLId;
2168 QString nclID, structuralID, coreID;
2171 stack.push(project);
2174 currentEntity = stack.front();
2177 currentNCLId = getNCLIdFromEntity(currentEntity);
2179 if(isEntityHandled(currentEntity) &&
2180 !currentNCLId.isEmpty() && !currentNCLId.isNull())
2182 nclIDtoCoreID.insert(currentNCLId, currentEntity->getUniqueId());
2183 nclCoreID_Ordered.push_back(currentEntity->getUniqueId());
2186 QVector<Entity *> children = currentEntity->getChildren();
2187 for(
int i = 0; i < children.size(); i++)
2189 stack.push_back(children.at(i));
2196 foreach(coreID, nclCoreID_Ordered)
2198 if(previousCoreID.contains(coreID))
2200 currentEntity = project->getEntityById(coreID);
2201 if(currentEntity != NULL)
2204 requestEntityChange(currentEntity);
2206 alreadyUpdatedCoreId.push_back(coreID);
2215 foreach (nclID, nclIDtoStructural.keys())
2217 structuralID = nclIDtoStructural.value(nclID);
2218 if(nclIDtoCoreID.contains(nclID))
2221 coreID = nclIDtoCoreID.value(nclID);
2223 if(alreadyUpdatedCoreId.contains(coreID))
2227 entities.remove(entities.key(structuralID));
2229 entities[coreID] = structuralID;
2230 currentEntity = project->getEntityById(coreID);
2231 if(currentEntity != NULL)
2233 requestEntityChange(currentEntity);
2234 alreadyUpdatedCoreId.push_back(coreID);
2239 if(alreadyUpdatedCoreId.contains(entities.key(structuralID)))
2243 view->removeEntity(structuralID);
2244 entities.remove(entities.key(structuralID));
2250 for(
int i = 0; i < nclCoreID_Ordered.size(); i++)
2252 coreID = nclCoreID_Ordered.at(i);
2253 if(alreadyUpdatedCoreId.contains(coreID))
2256 currentEntity = project->getEntityById(coreID);
2257 if(!entities.contains(coreID) && currentEntity != NULL)
2259 requestEntityAddition(currentEntity);
2266 void QnstComposerPlugin::textualStartSync(QString,
void*)
2270 dirtyEntities.clear();
2271 isSyncingFromTextual =
true;
2274 void QnstComposerPlugin::textualFinishSync(QString,
void*)
2276 qDebug() <<
"QnstComposerPlugin::textualFinishSync";
2277 isSyncingFromTextual =
false;
2282 void QnstComposerPlugin::clearValidationError(QString,
void *param)
2284 view->clearValidationErrors();
2287 void QnstComposerPlugin::validationError(QString pluginID,
void *param)
2289 if(isSyncingFromTextual)
2294 pair <QString, QString> *p = (pair <QString, QString> *)param;
2296 if (entities.contains(p->first))
2297 view->markError(entities.value(p->first), p->second);