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";
63 std::system((
"rm -rf " + (std::string)DESKTOP_ICONS_FILE).c_str());
71 DesktopIconTable::~DesktopIconTable(
void) {}
81 auto childrenMap = configManager->__SELF_NODE__.
getChildren();
84 configManager->
getNode(ConfigurationManager::XDAQ_CONTEXT_TABLE_NAME);
86 ConfigurationManager::XDAQ_CONTEXT_TABLE_NAME);
91 activeDesktopIcons_.clear();
97 for(
auto& child : childrenMap)
99 if(!child.second.getNode(COL_STATUS).getValue<
bool>())
104 icon = &(activeDesktopIcons_.back());
106 icon->recordUID_ = child.first;
107 icon->caption_ = child.second.getNode(COL_CAPTION).getValue<std::string>();
108 icon->alternateText_ =
109 child.second.getNode(COL_ALTERNATE_TEXT).getValue<std::string>();
110 icon->enforceOneWindowInstance_ =
111 child.second.getNode(COL_FORCE_ONLY_ONE_INSTANCE).getValue<
bool>();
113 child.second.getNode(COL_PERMISSIONS).getValue<std::string>();
114 icon->imageURL_ = child.second.getNode(COL_IMAGE_URL).getValue<std::string>();
115 icon->windowContentURL_ =
116 child.second.getNode(COL_WINDOW_CONTENT_URL).getValue<std::string>();
117 icon->folderPath_ = child.second.getNode(COL_FOLDER_PATH).getValue<std::string>();
119 if(icon->windowContentURL_.size() == 0)
121 __SS__ <<
"Illegal empty URL in Desktop Icon '" << child.first <<
"'"
126 if(icon->folderPath_ == TableViewColumnInfo::DATATYPE_STRING_DEFAULT)
127 icon->folderPath_ =
"";
130 TableViewColumnInfo::DATATYPE_STRING_DEFAULT)
150 icon->caption_ = removeCommas(
151 icon->caption_,
false ,
true );
152 icon->alternateText_ = removeCommas(
153 icon->alternateText_,
false ,
true );
154 icon->imageURL_ = removeCommas(icon->imageURL_,
true );
155 icon->windowContentURL_ =
156 removeCommas(icon->windowContentURL_,
true );
157 icon->folderPath_ = removeCommas(
158 icon->folderPath_,
false ,
true );
166 if(icon->windowContentURL_.size() && icon->windowContentURL_[0] ==
'/')
177 if(contextUID != gatewayContextUID)
181 contextTableNode.
getNode(contextUID);
183 std::string contextAddress =
184 contextNode.
getNode(XDAQContextTable::colContext_.colAddress_)
186 unsigned int contextPort =
187 contextNode.
getNode(XDAQContextTable::colContext_.colPort_)
191 icon->windowContentURL_ = contextAddress +
":" +
192 std::to_string(contextPort) +
193 icon->windowContentURL_;
197 catch(
const std::runtime_error& e)
199 __SS__ <<
"Error finding XDAQ Application origin which was linked to "
201 << child.first <<
"': " << e.what() << __E__;
202 ss <<
"\n\nPlease fix by disabling the Icon, enabling the App or "
203 "fixing the link in the Configurate Tree."
211 if(icon->windowContentURL_[icon->windowContentURL_.size() - 1] !=
'=')
213 if(icon->windowContentURL_.find(
'?') ==
215 icon->windowContentURL_ +=
"?urn=";
217 icon->windowContentURL_ +=
"&urn=";
222 icon->windowContentURL_ += std::to_string(intVal);
230 if(!child.second.getNode(COL_PARAMETER_LINK).isDisconnected())
234 if(icon->windowContentURL_.find(
'?') == std::string::npos)
235 icon->windowContentURL_ +=
'?';
236 else if(addedAppId ||
237 icon->windowContentURL_[icon->windowContentURL_.size() - 1] !=
239 icon->windowContentURL_ +=
'&';
242 auto paramGroupMap = child.second.getNode(COL_PARAMETER_LINK).getChildren();
243 bool notFirst =
false;
244 for(
const auto& param : paramGroupMap)
246 if(!param.second.isEnabled())
250 icon->windowContentURL_ +=
'&';
253 icon->windowContentURL_ +=
254 StringMacros::encodeURIComponent(
255 param.second.getNode(COL_PARAMETER_KEY).getValue<std::string>()) +
257 StringMacros::encodeURIComponent(
258 param.second.getNode(COL_PARAMETER_VALUE)
259 .getValue<std::string>());
269 const std::string& localURL)
const
272 std::string contextAddress;
274 if(localURL.size() && localURL[0] ==
'/')
277 configManager->
getNode(ConfigurationManager::XDAQ_CONTEXT_TABLE_NAME);
279 ConfigurationManager::XDAQ_CONTEXT_TABLE_NAME);
284 contextAddress = contextNode.
getNode(XDAQContextTable::colContext_.colAddress_)
286 unsigned int contextPort =
287 contextNode.
getNode(XDAQContextTable::colContext_.colPort_)
293 "OTS_REMOTE_ICONS_NO_PORT_FOWARDING"))
294 contextAddress +=
":" + std::to_string(contextPort);
296 contextAddress = std::string(
"http://") +
"localhost" +
":" +
297 std::to_string(contextPort);
301 __COUTT__ <<
"Ignoring missing environment variable "
302 "OTS_REMOTE_ICONS_NO_PORT_FOWARDING, and assuming localhost "
303 "port forwarding to web browser."
306 std::string(
"http://") +
"localhost" +
":" + std::to_string(contextPort);
308 retURL = contextAddress + localURL;
316 if(retURL.find(
'?') == std::string::npos)
318 else if(retURL[retURL.size() - 1] !=
'?')
320 retURL +=
"remoteServerOrigin=" + StringMacros::encodeURIComponent(contextAddress) +
321 "&remoteServerUrnLid=" +
322 std::to_string(XDAQContextTable::XDAQApplication::GATEWAY_APP_ID);
328 std::string DesktopIconTable::removeCommas(
const std::string& str,
332 std::string retStr =
"";
333 retStr.reserve(str.length());
335 for(
unsigned int i = 0; i < str.length(); ++i)
338 else if(andHexReplace)
340 else if(andHTMLReplace)
348 const std::vector<DesktopIconTable::DesktopIcon>& newIcons)
350 activeDesktopIcons_.clear();
351 for(
const auto& newIcon : newIcons)
352 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 getContextOfGateway(ConfigurationManager *configManager) const
only considers ON contexts and applications
std::string getContextOfApplication(ConfigurationManager *configManager, const std::string &appUID) const
only considers ON contexts and applications
std::string permissionThresholdString_