1 #include "otsdaq/ConfigurationInterface/ConfigurationManager.h"
2 #include "otsdaq/Macros/TablePluginMacros.h"
3 #include "otsdaq/TablePlugins/DesktopIconTable.h"
4 #include "otsdaq/TablePlugins/XDAQContextTable/XDAQContextTable.h"
6 #include "otsdaq/WebUsersUtilities/WebUsers.h"
13 #define DESKTOP_ICONS_FILE \
14 std::string(__ENV__("SERVICE_DATA_PATH")) + "/OtsWizardData/iconList.dat"
19 const std::string DesktopIconTable::COL_STATUS = TableViewColumnInfo::COL_NAME_STATUS;
20 const std::string DesktopIconTable::COL_CAPTION =
"Caption";
21 const std::string DesktopIconTable::COL_ALTERNATE_TEXT =
"AlternateText";
22 const std::string DesktopIconTable::COL_FORCE_ONLY_ONE_INSTANCE =
"ForceOnlyOneInstance";
23 const std::string DesktopIconTable::COL_PERMISSIONS =
"RequiredPermissionLevel";
24 const std::string DesktopIconTable::COL_IMAGE_URL =
"ImageURL";
25 const std::string DesktopIconTable::COL_WINDOW_CONTENT_URL =
"WindowContentURL";
26 const std::string DesktopIconTable::COL_APP_LINK =
"LinkToApplicationTable";
27 const std::string DesktopIconTable::COL_APP_LINK_UID =
"LinkToApplicationUID";
29 const std::string DesktopIconTable::COL_PARAMETER_LINK =
"LinkToParameterTable";
30 const std::string DesktopIconTable::COL_PARAMETER_LINK_GID =
"LinkToParameterGroupID";
31 const std::string DesktopIconTable::COL_FOLDER_PATH =
"FolderPath";
33 const std::string DesktopIconTable::COL_PARAMETER_GID =
"windowParameterGroupID";
34 const std::string DesktopIconTable::COL_PARAMETER_KEY =
"windowParameterKey";
35 const std::string DesktopIconTable::COL_PARAMETER_VALUE =
"windowParameterValue";
37 const std::string DesktopIconTable::ICON_TABLE =
38 ConfigurationManager::DESKTOP_ICON_TABLE_NAME;
39 const std::string DesktopIconTable::PARAMETER_TABLE =
"DesktopWindowParameterTable";
68 DesktopIconTable::~DesktopIconTable(
void) {}
78 auto childrenMap = configManager->__SELF_NODE__.
getChildren();
81 configManager->
getNode(ConfigurationManager::XDAQ_CONTEXT_TABLE_NAME);
83 ConfigurationManager::XDAQ_CONTEXT_TABLE_NAME);
88 activeDesktopIcons_.clear();
94 for(
auto& child : childrenMap)
96 if(!child.second.getNode(COL_STATUS).getValue<
bool>())
101 icon = &(activeDesktopIcons_.back());
103 icon->recordUID_ = child.first;
104 icon->caption_ = child.second.getNode(COL_CAPTION).getValue<std::string>();
105 icon->alternateText_ =
106 child.second.getNode(COL_ALTERNATE_TEXT).getValue<std::string>();
107 icon->enforceOneWindowInstance_ =
108 child.second.getNode(COL_FORCE_ONLY_ONE_INSTANCE).getValue<
bool>();
110 child.second.getNode(COL_PERMISSIONS).getValue<std::string>();
111 icon->imageURL_ = child.second.getNode(COL_IMAGE_URL).getValue<std::string>();
112 icon->windowContentURL_ =
113 child.second.getNode(COL_WINDOW_CONTENT_URL).getValue<std::string>();
114 icon->folderPath_ = child.second.getNode(COL_FOLDER_PATH).getValue<std::string>();
116 if(icon->windowContentURL_.size() == 0)
118 __SS__ <<
"Illegal empty URL in Desktop Icon '" << child.first <<
"'"
123 if(icon->folderPath_ == TableViewColumnInfo::DATATYPE_STRING_DEFAULT)
124 icon->folderPath_ =
"";
127 TableViewColumnInfo::DATATYPE_STRING_DEFAULT)
147 icon->caption_ = removeCommas(
148 icon->caption_,
false ,
true );
149 icon->alternateText_ = removeCommas(
150 icon->alternateText_,
false ,
true );
151 icon->imageURL_ = removeCommas(icon->imageURL_,
true );
152 icon->windowContentURL_ =
153 removeCommas(icon->windowContentURL_,
true );
154 icon->folderPath_ = removeCommas(
155 icon->folderPath_,
false ,
true );
163 if(icon->windowContentURL_.size() && icon->windowContentURL_[0] ==
'/')
179 <<
"' is disabled, which will likely break the behavior of "
181 << child.first <<
".' To fix, reenable the target app."
185 if(contextUID != gatewayContextUID)
189 contextTableNode.
getNode(contextUID);
194 <<
"Warning! The parent context '" << contextUID
196 <<
"' is disabled, which will likely break the behavior "
197 "of the Desktop Icon '"
199 <<
".' To fix, reenable the target app's parent context."
202 std::string contextAddress =
203 contextNode.
getNode(XDAQContextTable::colContext_.colAddress_)
205 unsigned int contextPort =
206 contextNode.
getNode(XDAQContextTable::colContext_.colPort_)
210 icon->windowContentURL_ = contextAddress +
":" +
211 std::to_string(contextPort) +
212 icon->windowContentURL_;
216 catch(
const std::runtime_error& e)
218 __SS__ <<
"Error finding XDAQ Application origin which was linked to "
220 << child.first <<
"': " << e.what() << __E__;
221 ss <<
"\n\nPlease fix by disabling the Icon, enabling the App or "
222 "fixing the link in the Configurate Tree."
230 if(icon->windowContentURL_[icon->windowContentURL_.size() - 1] !=
'=')
232 if(icon->windowContentURL_.find(
'?') ==
234 icon->windowContentURL_ +=
"?urn=";
236 icon->windowContentURL_ +=
"&urn=";
241 icon->windowContentURL_ += std::to_string(intVal);
249 if(!child.second.getNode(COL_PARAMETER_LINK).isDisconnected())
253 if(icon->windowContentURL_.find(
'?') == std::string::npos)
254 icon->windowContentURL_ +=
'?';
255 else if(addedAppId ||
256 icon->windowContentURL_[icon->windowContentURL_.size() - 1] !=
258 icon->windowContentURL_ +=
'&';
261 auto paramGroupMap = child.second.getNode(COL_PARAMETER_LINK).getChildren();
262 bool notFirst =
false;
263 for(
const auto& param : paramGroupMap)
265 if(!param.second.isEnabled())
269 icon->windowContentURL_ +=
'&';
272 icon->windowContentURL_ +=
273 StringMacros::encodeURIComponent(
274 param.second.getNode(COL_PARAMETER_KEY).getValue<std::string>()) +
276 StringMacros::encodeURIComponent(
277 param.second.getNode(COL_PARAMETER_VALUE)
278 .getValue<std::string>());
288 const std::string& localURL)
const
290 std::string contextAddress;
293 configManager->
getNode(ConfigurationManager::XDAQ_CONTEXT_TABLE_NAME);
295 ConfigurationManager::XDAQ_CONTEXT_TABLE_NAME);
300 contextAddress = contextNode.
getNode(XDAQContextTable::colContext_.colAddress_)
302 unsigned int contextPort =
303 contextNode.
getNode(XDAQContextTable::colContext_.colPort_)
309 "OTS_REMOTE_ICONS_NO_PORT_FOWARDING"))
310 contextAddress +=
":" + std::to_string(contextPort);
312 contextAddress = std::string(
"http://") +
"localhost" +
":" +
313 std::to_string(contextPort);
317 __COUTT__ <<
"Ignoring missing environment variable "
318 "OTS_REMOTE_ICONS_NO_PORT_FOWARDING, and assuming localhost "
319 "port forwarding to web browser."
322 std::string(
"http://") +
"localhost" +
":" + std::to_string(contextPort);
328 __COUTTV__(localURL);
329 if(localURL.size() && localURL[0] ==
'/')
330 retURL = contextAddress + localURL;
339 if(retURL.find(
'?') == std::string::npos)
341 else if(retURL[retURL.size() - 1] !=
'?')
343 retURL +=
"remoteServerOrigin=" + StringMacros::encodeURIComponent(contextAddress) +
344 "&remoteServerUrnLid=" +
345 std::to_string(XDAQContextTable::XDAQApplication::GATEWAY_APP_ID);
352 std::string DesktopIconTable::removeCommas(
const std::string& str,
356 std::string retStr =
"";
357 retStr.reserve(str.length());
359 for(
unsigned int i = 0; i < str.length(); ++i)
362 else if(andHexReplace)
364 else if(andHTMLReplace)
372 const std::vector<DesktopIconTable::DesktopIcon>& newIcons)
374 activeDesktopIcons_.clear();
375 for(
const auto& newIcon : newIcons)
376 activeDesktopIcons_.push_back(newIcon);
ConfigurationTree getNode(const std::string &nodeString, bool doNotThrowOnBrokenUIDLinks=false) const
"root/parent/parent/"
const T * getTable(const std::string &tableName) const
std::vector< std::pair< std::string, ConfigurationTree > > getChildren(std::map< std::string, TableVersion > *memberMap=0, std::string *accumulatedTreeErrors=0) const
bool isDisconnected(void) const
ConfigurationTree getNode(const std::string &nodeName, bool doNotThrowOnBrokenUIDLinks=false) const
navigating between nodes
const std::string & getValueAsString(bool returnLinkTableValue=false) const
void getValue(T &value) const
std::string getRemoteURL(ConfigurationManager *configManager, const std::string &localURL) const
Convert to remote URL assuming port forwarding to primary Gateway Port.
void init(ConfigurationManager *configManager)
Methods.
void setAllDesktopIcons(const std::vector< DesktopIconTable::DesktopIcon > &newIcons)
overwrite dynamically the init result
static const std::string COL_APP_ID
XDAQ App Column names.
static const std::string COL_NAME
std::string getContextOfApplication(ConfigurationManager *configManager, const std::string &appUID, bool allowOffContexts=false) const
only considers ON contexts and applications, unless off contexts allows
std::string getContextOfGateway(ConfigurationManager *configManager) const
only considers ON contexts and applications
defines used also by OtsConfigurationWizardSupervisor
std::string permissionThresholdString_