30 #include <QApplication>
32 #include <QStyledItemDelegate>
37 #include <ArmarXCore/interface/core/ArmarXManagerInterface.h>
39 #include <ArmarXGui/gui-plugins/SystemStateMonitorPlugin/ui_ArmarXManagerRepositoryDialog.h>
55 const QStyleOptionViewItem&
option,
56 const QModelIndex&
index)
const override
58 return new QLineEdit(parent);
64 QLineEdit* lineEdit = qobject_cast<QLineEdit*>(editor);
67 QString propValue =
index.data().toString();
68 propValue.remove(0, propValue.indexOf(
":") + 2);
69 QString propName =
index.data().toString();
71 propName.truncate(propName.indexOf(
":") - 1);
72 lineEdit->setText(propValue);
73 lineEdit->setProperty(
"propertyName", propName);
79 QAbstractItemModel* model,
80 const QModelIndex&
index)
const override
82 QLineEdit* lineEdit = qobject_cast<QLineEdit*>(editor);
86 lineEdit->property(
"propertyName").toString() +
" : " +
88 auto it = managerPrxMap->find(
index.parent().parent().parent().data().toString());
89 if (it != managerPrxMap->end())
91 armarx::ArmarXManagerInterfacePrx prx = it->second;
92 prx->getPropertiesAdmin()->ice_collocationOptimized(
false)->setProperties(
93 {{lineEdit->property(
"propertyName").
toString().toStdString(),
94 lineEdit->text().toStdString()}});
107 qRegisterMetaType<StateUpdateMap>(
"StateUpdateMap");
108 qRegisterMetaType<ArmarXManagerItem::ManagerDataMap>(
"ArmarXManagerItem::ManagerDataMap");
109 qRegisterMetaType<ArmarXManagerItem::ManagerData>(
"ArmarXManagerItem::ManagerData");
110 qRegisterMetaType<ManagerPrxMap>(
"ManagerPrxMap");
113 filterExpansionTimer.setSingleShot(
true);
114 connect(&filterExpansionTimer, SIGNAL(timeout()),
this, SLOT(delayedFilterExpansion()));
115 connect(ui.btnProblematicOnly,
116 SIGNAL(toggled(
bool)),
118 SLOT(on_btnProblematicOnly_toggled(
bool)),
119 Qt::UniqueConnection);
121 fillLegendLayout(ui.colorLegendLayout, *monitoredManagerModel);
129 stateUpdateTask->stop();
132 delete managerRepositoryModel;
133 delete monitoredManagerModel;
150 managerRepositoryModel, monitoredManagerModel,
getWidget());
151 managerRepositoryDialog->setModal(
true);
152 connect(managerRepositoryDialog, SIGNAL(accepted()),
this, SLOT(
acceptConfig()));
153 connect(managerRepositoryDialog,
154 SIGNAL(requestedManagerScan()),
157 ui.monitoredManagersTree->setItemDelegate(
160 filterModel->addCustomFilter(
161 [
this](QAbstractItemModel* model,
int source_row,
const QModelIndex& source_parent)
163 QModelIndex index0 = model->index(source_row, 0, source_parent);
164 if (this->ui.btnProblematicOnly->isChecked())
167 index0.data((int)ArmarXManagerModel::UserDataRoles::ComponentStarted);
168 auto variantDependency =
169 index0.data((int)ArmarXManagerModel::UserDataRoles::ResolvedDependency);
170 if (variant.isValid())
173 if (variant.toBool())
179 if (variantDependency.isValid())
181 if (variantDependency.toBool())
186 if (!variant.isValid() && !variantDependency.isValid())
197 filterModel->setSourceModel(monitoredManagerModel);
198 filterModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
199 ui.monitoredManagersTree->setModel(filterModel);
201 connect(ui.lineEditFilter,
202 SIGNAL(textChanged(QString)),
204 SLOT(setFilterFixedString(QString)));
205 connect(ui.lineEditFilter,
206 SIGNAL(textChanged(QString)),
208 SLOT(expandFilterSelection(QString)),
209 Qt::QueuedConnection);
211 connect(ui.configureButton, SIGNAL(clicked()),
this, SLOT(openManagerRepositoryDialog()));
214 SIGNAL(updateManagerStatesSignal(ArmarXManagerItem::ManagerDataMap)),
216 SLOT(updateManagerStates(ArmarXManagerItem::ManagerDataMap)));
222 SystemStateMonitorWidget::loadSettings(QSettings* settings)
224 managerRepositoryModel->populate(settings->value(
"ManagerRepository").toStringList());
226 monitoredManagerModel->populate(settings->value(
"MonitoredManagers").toStringList());
227 ui.monitoredManagersTree->expandToDepth(1);
231 SystemStateMonitorWidget::saveSettings(QSettings* settings)
233 settings->setValue(
"ManagerRepository", managerRepositoryModel->toStringList());
235 settings->setValue(
"MonitoredManagers", monitoredManagerModel->toStringList());
239 SystemStateMonitorWidget::onInitComponent()
241 monitoredManagerModel->setIceManager(getIceManager());
242 managerRepositoryModel->setIceManager(getIceManager());
246 SystemStateMonitorWidget::onConnectComponent()
250 &SystemStateMonitorWidget::updateManagerObjectsState,
253 "SystemStateMonitorUpdate");
254 stateUpdateTask->setDelayWarningTolerance(5000);
255 stateUpdateTask->start();
256 if (monitoredManagerModel->empty())
262 std::unique_lock lock(managerPrxMapMutex);
263 currentManagerPrxMap = monitoredManagerModel->getManagerProxyMap();
268 SystemStateMonitorWidget::onDisconnectComponent()
272 stateUpdateTask->stop();
277 SystemStateMonitorWidget::onExitComponent()
281 stateUpdateTask->stop();
286 SystemStateMonitorWidget::updateManagerStates(
291 std::unique_lock lock(monitoredManagerModel->getMutex());
293 monitoredManagerModel->updateManagerDetails(managerData);
294 filterModel->invalidate();
298 SystemStateMonitorWidget::retrieveManagerData(ArmarXManagerInterfacePrx prx,
305 managerData.
proxy = prx;
306 prx = prx->ice_timeout(1000);
307 managerData.
name = QString::fromStdString(prx->ice_getIdentity().name);
308 managerData.
appProperties = prx->getApplicationPropertyInfos();
309 result &= retrieveManagerObjectsState(prx, managerData.
objects);
312 managerData.
connection = prx->ice_collocationOptimized(
false)->ice_getConnection();
315 ? QString::fromStdString(managerData.
connection->getEndpoint()->toString())
316 :
"Endpoint: no connection data";
319 catch (
const IceUtil::Exception& ex)
323 QString::fromStdString(
"? (" + std::string(ex.ice_id()) +
")");
325 managerData.
online =
true;
329 managerData.
online =
false;
336 SystemStateMonitorWidget::retrieveManagerObjectsState(
337 ArmarXManagerInterfacePrx prx,
345 prx->ice_timeout(200)->ice_ping();
354 Ice::StringSeq objectNames = prx->getManagedObjectNames();
356 for (
auto& objectName : objectNames)
359 objEntry.
name = objectName.c_str();
360 objEntry.
state = prx->getObjectState(objectName);
361 objEntry.
connectivity = prx->getObjectConnectivity(objectName);
362 objEntry.
properties = prx->getObjectPropertyInfos(objectName);
365 objEntry.
metaInfoMap = prx->getMetaInfo(objectName);
372 objectStates[objEntry.
name] = (objEntry);
379 SystemStateMonitorWidget::updateManagerObjectsState()
386 decltype(currentManagerPrxMap) proxies;
388 std::unique_lock lock(managerPrxMapMutex);
389 proxies = currentManagerPrxMap;
392 for (
auto it = proxies.begin(); it != proxies.end(); it++)
395 bool online = retrieveManagerObjectsState(it->second, stateMap);
396 managerDataMap[it->first].online = online;
397 managerDataMap[it->first].name = it->first;
398 managerDataMap[it->first].objects = stateMap;
401 managerDataMap[it->first].appProperties =
402 it->second->getApplicationPropertyInfos();
404 retrieveManagerData(it->second, managerDataMap[it->first]);
407 << (IceUtil::Time::now() - start).toMilliSecondsDouble();
410 emit updateManagerStatesSignal(managerDataMap);
414 SystemStateMonitorWidget::acceptConfig()
416 this->managerRepositoryModel->copyFrom(
417 managerRepositoryDialog->getManagerRepositoryModel());
419 this->monitoredManagerModel->copyFrom(managerRepositoryDialog->getMonitoredManagersModel());
420 ui.monitoredManagersTree->expandToDepth(1);
421 std::unique_lock lock(managerPrxMapMutex);
422 currentManagerPrxMap = monitoredManagerModel->getManagerProxyMap();
426 SystemStateMonitorWidget::fetchOnlineManagers()
428 enableMainWidgetAsync(
false);
429 auto admin = getIceManager()->getIceGridSession()->getAdmin();
431 IceGrid::ObjectInfoSeq objects = admin->getAllObjectInfos(
"*Manager");
433 IceGrid::ObjectInfoSeq::iterator iter = objects.begin();
434 IceGrid::ObjectInfoSeq result;
436 while (iter != objects.end())
438 Ice::ObjectPrx current = iter->proxy;
440 ArmarXManagerInterfacePrx object;
445 object = ArmarXManagerInterfacePrx::checkedCast(current->ice_timeout(60));
449 ARMARX_INFO << current->ice_getIdentity().name <<
": "
452 admin->removeObject(current->ice_getIdentity());
454 qApp->processEvents();
458 result.push_back(*iter);
464 enableMainWidgetAsync(
true);
466 QStringList managers;
467 for (
const IceGrid::ObjectInfo& info : result)
469 managers.append(info.proxy->ice_getIdentity().name.c_str());
476 SystemStateMonitorWidget::retrieveOnlineManagers()
478 managerRepositoryDialog->addOnlineManagers(fetchOnlineManagers());
482 SystemStateMonitorWidget::openManagerRepositoryDialog()
484 managerRepositoryDialog->getManagerRepositoryModel()->copyFrom(managerRepositoryModel);
486 managerRepositoryDialog->getMonitoredManagersModel()->copyFrom(monitoredManagerModel);
488 retrieveOnlineManagers();
490 managerRepositoryDialog->show();
494 SystemStateMonitorWidget::prefillView()
496 managerRepositoryModel->clear();
497 monitoredManagerModel->clear();
499 QStringList managers = fetchOnlineManagers();
503 addArmarXManagers(managers);
504 QMetaObject::invokeMethod(ui.monitoredManagersTree,
"expandToDepth", Q_ARG(
int, 0));
505 std::unique_lock lock(managerPrxMapMutex);
506 currentManagerPrxMap = monitoredManagerModel->getManagerProxyMap(managers);
510 SystemStateMonitorWidget::addArmarXManagerEntries(
ManagerPrxMap managers)
515 for (
auto& pair : managers)
517 ArmarXManagerItem* item =
new ArmarXManagerItem(pair.first);
518 item->setManagerProxy(pair.second);
519 monitoredManagerModel->appendRow(item);
522 ui.monitoredManagersTree->expandToDepth(1);
526 SystemStateMonitorWidget::addArmarXManagers(QStringList managerNames)
529 for (
auto& name : managerNames)
537 getIceManager()->getProxy<ArmarXManagerInterfacePrx>(name.toStdString());
538 retrieveManagerData(proxy,
data);
539 QMetaObject::invokeMethod(monitoredManagerModel,
540 "upsertManagerDetails",
552 SystemStateMonitorWidget::expandFilterSelection(QString filterStr)
555 if (filterStr.length() == 0)
557 ui.monitoredManagersTree->collapseAll();
562 filterExpansionTimer.start(500);
567 SystemStateMonitorWidget::delayedFilterExpansion()
571 InfixFilterModel::ExpandFilterResults(ui.monitoredManagersTree);
575 armarx::SystemStateMonitorWidget::on_btnProblematicOnly_toggled(
bool checked)
580 filterModel->invalidate();
585 SystemStateMonitorWidget::fillLegendLayout(QHBoxLayout* layout, ArmarXManagerModel& model)
const
587 auto addLegendEntry = [layout, &model](ManagedIceObjectState state,
const QString& text)
589 QLabel* label =
new QLabel(text);
591 QBrush brush = model.getBrush(state);
592 QPalette p = label->palette();
593 p.setColor(label->backgroundRole(), brush.color());
594 label->setPalette(p);
595 label->setAutoFillBackground(
true);
598 QFont font = label->font();
599 font.setPointSize(10);
600 label->setFont(font);
602 layout->addWidget(label);
605 addLegendEntry(armarx::eManagedIceObjectCreated,
"Created");
606 addLegendEntry(armarx::eManagedIceObjectInitializing,
"Initializing");
607 addLegendEntry(armarx::eManagedIceObjectInitialized,
"Initialized");
608 addLegendEntry(armarx::eManagedIceObjectInitializationFailed,
"Initialization Failed");
609 addLegendEntry(armarx::eManagedIceObjectStarting,
"Connecting");
610 addLegendEntry(armarx::eManagedIceObjectStarted,
"Connected");
611 addLegendEntry(armarx::eManagedIceObjectStartingFailed,
"Connecting Failed");
612 addLegendEntry(armarx::eManagedIceObjectExiting,
"Exiting");
613 addLegendEntry(armarx::eManagedIceObjectExited,
"Exited");