diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentAnalysisEditorBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentAnalysisEditorBean.java index 22d813a1b6b3a802d42f7de750684732c3e1612f..81fbdbc0eedffcbbaaf10adfb4e05e4dc9389990 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentAnalysisEditorBean.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentAnalysisEditorBean.java @@ -503,6 +503,10 @@ public final class CurrentAnalysisEditorBean { this.currentAnalysisEditorGraphBean.setGridColor(this.userBean.getGridColor()); this.currentAnalysisEditorGraphBean.setGridSize(this.userBean.getGridSize()); + // Perform an initial auto layout + this.currentAnalysisEditorGraphBean.startAutoLayout(); + this.currentAnalysisEditorGraphBean.checkReadOnlyForGuests(); + // Repaint the graph this.currentAnalysisEditorGraphBean.refreshGraph(); } diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentAnalysisEditorGraphBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentAnalysisEditorGraphBean.java index e4ca8e11696b39bc1e65a7a0f20ed20668f33efc..4c30b4442780f7495d8dfb88736dc0116505648c 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentAnalysisEditorGraphBean.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentAnalysisEditorGraphBean.java @@ -38,6 +38,7 @@ import kieker.monitoring.core.registry.Registry; import kieker.webgui.common.exception.InvalidInputSizeException; import kieker.webgui.common.exception.UninitializedGraphException; import kieker.webgui.service.IGraphLayoutService; +import kieker.webgui.web.beans.session.UserBean; import org.primefaces.context.RequestContext; @@ -163,6 +164,8 @@ public final class CurrentAnalysisEditorGraphBean { @Autowired private IGraphLayoutService layouter; + @Autowired + private UserBean userBean; /** * This map contains all components (plugins, repositories and ports) within the graph to identify them with a unique ID. @@ -662,4 +665,13 @@ public final class CurrentAnalysisEditorGraphBean { this.refreshGraph(); } + /** + * This method checks whether the current user is a guest and activates the read only mode if necessary. + */ + public void checkReadOnlyForGuests() { + if ("Guest".equals(this.userBean.getUserrole())) { + RequestContext.getCurrentInstance().execute("graph.setReadOnly('false', 'true');"); + } + } + } diff --git a/Kieker.WebGUI/src/main/webapp/pages/AnalysisEditorPage.xhtml b/Kieker.WebGUI/src/main/webapp/pages/AnalysisEditorPage.xhtml index 063bbab76c3c640e9dacd484b3724130f8476364..38800bc62cf9ae568370d212ab6a64092177a939 100644 --- a/Kieker.WebGUI/src/main/webapp/pages/AnalysisEditorPage.xhtml +++ b/Kieker.WebGUI/src/main/webapp/pages/AnalysisEditorPage.xhtml @@ -4,7 +4,8 @@ xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:p="http://primefaces.org/ui" - xmlns:f="http://java.sun.com/jsf/core"> + xmlns:f="http://java.sun.com/jsf/core" + xmlns:c="http://java.sun.com/jsp/jstl/core"> <h:head/> @@ -79,13 +80,17 @@ <!-- Those are the menu bar entries left from the help-submenu. --> <ui:define name="furtherMenuBarEntries"> <p:submenu label="#{localizedMessages.file}"> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-save" value=" #{localizedMessages.saveProject}" update=":messages" ajax="true" action="#{currentAnalysisEditorBean.saveProject(false)}" disabled="#{empty currentAnalysisEditorBean.project}"/> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-saveAs" value=" #{localizedMessages.saveProjectAs}" update=":messages" ajax="true" disabled="#{true or empty currentAnalysisEditorBean.project}"/> - <p:separator /> + <c:if test="#{sec:areAnyGranted('User, Administrator')}"> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-save" value=" #{localizedMessages.saveProject}" update=":messages" ajax="true" action="#{currentAnalysisEditorBean.saveProject(false)}" disabled="#{empty currentAnalysisEditorBean.project}"/> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-saveAs" value=" #{localizedMessages.saveProjectAs}" update=":messages" ajax="true" disabled="#{true or empty currentAnalysisEditorBean.project}"/> + <p:separator /> + </c:if> <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-reload" value=" #{localizedMessages.reloadProject}" ajax="false" url="analysisEditor?projectName=#{currentAnalysisEditorBean.projectName}" disabled="#{empty currentAnalysisEditorBean.project}" /> <p:separator/> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-manageLibraries" value=" #{localizedAnalysisEditorPageMessages.manageLibraries}" onclick="manageLibrariesDialog.show()" ajax="true" disabled="#{empty currentAnalysisEditorBean.project}"/> - <p:separator /> + <c:if test="#{sec:areAnyGranted('User, Administrator')}"> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-manageLibraries" value=" #{localizedAnalysisEditorPageMessages.manageLibraries}" onclick="manageLibrariesDialog.show()" ajax="true" disabled="#{empty currentAnalysisEditorBean.project}"/> + <p:separator /> + </c:if> <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-settings" value=" #{localizedMessages.settings}" onclick="settingsDlg.show()" ajax="true"/> <p:separator /> <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-close" value=" #{localizedMessages.closeProject}" action="ProjectOverviewPage.xhtml?faces-redirect=true" ajax="false"/> @@ -139,11 +144,11 @@ <!-- The classname is not editable, the name is editable with a specific target, other properies are editable normally. --> <p:column headerText="#{localizedMessages.value}" style="width:125px"> <h:outputText id="className" value="#{currentAnalysisEditorBean.selectedPlugin.classname}" rendered="#{rowIndex == 0}"/> - <p:inplace id="nameEditor" editor="true" rendered="#{rowIndex == 1}" > + <p:inplace id="nameEditor" editor="true" rendered="#{rowIndex == 1}" disabled="#{not sec:areAnyGranted('User, Administrator')}" > <p:inputText value="#{currentAnalysisEditorBean.selectedPlugin.name}" /> <p:ajax event="save" listener="#{currentAnalysisEditorGraphBean.renameNode(currentAnalysisEditorBean.selectedPlugin, currentAnalysisEditorBean.selectedPlugin.name)}" /> </p:inplace> - <p:inplace id="normalEditor" editor="true" rendered="#{rowIndex > 1}"> + <p:inplace id="normalEditor" editor="true" rendered="#{rowIndex > 1}" disabled="#{not sec:areAnyGranted('User, Administrator')}"> <p:inputText value="#{property.value}" /> </p:inplace> <p:tooltip for="className" value="#{localizedAnalysisEditorPageMessages.tooltipClassName}" rendered="#{rowIndex == 0}"/> @@ -154,113 +159,117 @@ </h:form> </p:layoutUnit> - <!-- The following is the toolpalette, presenting the available plugins etc. --> - <p:layoutUnit position="east" size="300" header="#{localizedAnalysisEditorPageMessages.availablePlugins}" resizable="true" collapsible="true"> - <h:form id="toolpalette"> - <p:accordionPanel multiple="true" activeIndex="0,1,2"> - <p:tab title="#{localizedAnalysisEditorPageMessages.reader}"> - <ui:repeat value="#{currentAnalysisEditorBean.availableComponents.readers}" var="reader"> - <p:commandLink id="readerLink" value="#{reader.plugin.name}" action="#{currentAnalysisEditorBean.addPlugin(reader)}" update=":messages" disabled="#{not reader.fullyInitialized}" /><br/> - <p:tooltip for="readerLink"> - <b><h:outputText value="#{reader.plugin.name} (#{reader.plugin.classname})"/></b> - <br/> - <h:outputText value="#{reader.description}"/> - <br/><br/> - <ui:fragment rendered="#{not empty reader.plugin.outputPorts}"> - <b><h:outputText value="#{localizedAnalysisEditorPageMessages.outputPorts}:"/></b> - <p:dataList value="#{reader.plugin.outputPorts}" var="port"> - #{port.name} - </p:dataList> - </ui:fragment> - <ui:fragment rendered="#{not empty reader.plugin.repositories}"> - <b><h:outputText value="#{localizedAnalysisEditorPageMessages.repositoryPorts}:" /></b> - <p:dataList value="#{reader.plugin.repositories}" var="port"> - #{port.name} - </p:dataList> - </ui:fragment> - <ui:fragment rendered="#{not empty reader.plugin.properties}"> - <b><h:outputText value="#{localizedAnalysisEditorPageMessages.configuration}:"/></b> - <p:dataList value="#{reader.plugin.properties}" var="property"> - #{property.name} - </p:dataList> - </ui:fragment> - <ui:fragment rendered="#{not empty reader.dependency}"> - <b><h:outputText value="#{localizedAnalysisEditorPageMessages.dependencies}:"/></b> + <c:if test="#{sec:areAnyGranted('User, Administrator')}"> + <!-- The following is the toolpalette, presenting the available plugins etc. --> + <p:layoutUnit position="east" size="300" header="#{localizedAnalysisEditorPageMessages.availablePlugins}" resizable="true" collapsible="true"> + <h:form id="toolpalette"> + <p:accordionPanel multiple="true" activeIndex="0,1,2"> + <p:tab title="#{localizedAnalysisEditorPageMessages.reader}"> + <ui:repeat value="#{currentAnalysisEditorBean.availableComponents.readers}" var="reader"> + <p:commandLink id="readerLink" value="#{reader.plugin.name}" action="#{currentAnalysisEditorBean.addPlugin(reader)}" update=":messages" disabled="#{not reader.fullyInitialized}" /><br/> + <p:tooltip for="readerLink"> + <b><h:outputText value="#{reader.plugin.name} (#{reader.plugin.classname})"/></b> <br/> - <h:outputText value="#{reader.dependency}"/> - </ui:fragment> - </p:tooltip> - </ui:repeat> - </p:tab> - <p:tab title="#{localizedAnalysisEditorPageMessages.filter}"> - <ui:repeat value="#{currentAnalysisEditorBean.availableComponents.filters}" var="filter"> - <p:commandLink id="filterLink" value="#{filter.plugin.name}" action="#{currentAnalysisEditorBean.addPlugin(filter)}" update=":messages"/><br/> - <p:tooltip for="filterLink"> - <b><h:outputText value="#{filter.plugin.name} (#{filter.plugin.classname})"/></b> - <br/> - <h:outputText value="#{filter.description}"/> - <br/><br/> - <ui:fragment rendered="#{not empty filter.plugin.inputPorts}"> - <b><h:outputText value="#{localizedAnalysisEditorPageMessages.inputPorts}:"/></b> - <p:dataList value="#{filter.plugin.inputPorts}" var="port"> - #{port.name} - </p:dataList> - </ui:fragment> - <ui:fragment rendered="#{not empty filter.plugin.outputPorts}"> - <b><h:outputText value="#{localizedAnalysisEditorPageMessages.outputPorts}:"/></b> - <p:dataList value="#{filter.plugin.outputPorts}" var="port"> - #{port.name} - </p:dataList> - </ui:fragment> - <ui:fragment rendered="#{not empty filter.plugin.repositories}"> - <b><h:outputText value="#{localizedAnalysisEditorPageMessages.repositoryPorts}:"/></b> - <p:dataList value="#{filter.plugin.repositories}" var="port"> - #{port.name} - </p:dataList> - </ui:fragment> - <ui:fragment rendered="#{not empty filter.plugin.properties}"> - <b><h:outputText value="#{localizedAnalysisEditorPageMessages.configuration}:"/></b> - <p:dataList value="#{filter.plugin.properties}" var="property"> - #{property.name} - </p:dataList> - </ui:fragment> - <ui:fragment rendered="#{not empty filter.dependency}"> - <b><h:outputText value="#{localizedAnalysisEditorPageMessages.dependencies}:"/></b> + <h:outputText value="#{reader.description}"/> + <br/><br/> + <ui:fragment rendered="#{not empty reader.plugin.outputPorts}"> + <b><h:outputText value="#{localizedAnalysisEditorPageMessages.outputPorts}:"/></b> + <p:dataList value="#{reader.plugin.outputPorts}" var="port"> + #{port.name} + </p:dataList> + </ui:fragment> + <ui:fragment rendered="#{not empty reader.plugin.repositories}"> + <b><h:outputText value="#{localizedAnalysisEditorPageMessages.repositoryPorts}:" /></b> + <p:dataList value="#{reader.plugin.repositories}" var="port"> + #{port.name} + </p:dataList> + </ui:fragment> + <ui:fragment rendered="#{not empty reader.plugin.properties}"> + <b><h:outputText value="#{localizedAnalysisEditorPageMessages.configuration}:"/></b> + <p:dataList value="#{reader.plugin.properties}" var="property"> + #{property.name} + </p:dataList> + </ui:fragment> + <ui:fragment rendered="#{not empty reader.dependency}"> + <b><h:outputText value="#{localizedAnalysisEditorPageMessages.dependencies}:"/></b> + <br/> + <h:outputText value="#{reader.dependency}"/> + </ui:fragment> + </p:tooltip> + </ui:repeat> + </p:tab> + <p:tab title="#{localizedAnalysisEditorPageMessages.filter}"> + <ui:repeat value="#{currentAnalysisEditorBean.availableComponents.filters}" var="filter"> + <p:commandLink id="filterLink" value="#{filter.plugin.name}" action="#{currentAnalysisEditorBean.addPlugin(filter)}" update=":messages"/><br/> + <p:tooltip for="filterLink"> + <b><h:outputText value="#{filter.plugin.name} (#{filter.plugin.classname})"/></b> <br/> - <h:outputText value="#{filter.dependency}"/> - </ui:fragment> - </p:tooltip> - </ui:repeat> - </p:tab> - <p:tab title="#{localizedAnalysisEditorPageMessages.repositories}"> - <ui:repeat value="#{currentAnalysisEditorBean.availableComponents.repositories}" var="repository"> - <p:commandLink id="repositoryLink" value="#{repository.repository.name}" action="#{currentAnalysisEditorBean.addRepository(repository)}" update=":messages"/><br/> - <p:tooltip for="repositoryLink"> - <b><h:outputText value="#{repository.repository.name} (#{repository.repository.classname})"/></b> - <br/> - <h:outputText value="#{repository.description}"/> - <br/><br/> - <ui:fragment rendered="#{not empty repository.repository.properties}"> - <b><h:outputText value="#{localizedAnalysisEditorPageMessages.configuration}:"/></b> - <p:dataList value="#{repository.repository.properties}" var="property"> - #{property.name} - </p:dataList> - </ui:fragment> - <ui:fragment rendered="#{not empty repository.dependency}"> - <b><h:outputText value="#{localizedAnalysisEditorPageMessages.dependencies}:"/></b> + <h:outputText value="#{filter.description}"/> + <br/><br/> + <ui:fragment rendered="#{not empty filter.plugin.inputPorts}"> + <b><h:outputText value="#{localizedAnalysisEditorPageMessages.inputPorts}:"/></b> + <p:dataList value="#{filter.plugin.inputPorts}" var="port"> + #{port.name} + </p:dataList> + </ui:fragment> + <ui:fragment rendered="#{not empty filter.plugin.outputPorts}"> + <b><h:outputText value="#{localizedAnalysisEditorPageMessages.outputPorts}:"/></b> + <p:dataList value="#{filter.plugin.outputPorts}" var="port"> + #{port.name} + </p:dataList> + </ui:fragment> + <ui:fragment rendered="#{not empty filter.plugin.repositories}"> + <b><h:outputText value="#{localizedAnalysisEditorPageMessages.repositoryPorts}:"/></b> + <p:dataList value="#{filter.plugin.repositories}" var="port"> + #{port.name} + </p:dataList> + </ui:fragment> + <ui:fragment rendered="#{not empty filter.plugin.properties}"> + <b><h:outputText value="#{localizedAnalysisEditorPageMessages.configuration}:"/></b> + <p:dataList value="#{filter.plugin.properties}" var="property"> + #{property.name} + </p:dataList> + </ui:fragment> + <ui:fragment rendered="#{not empty filter.dependency}"> + <b><h:outputText value="#{localizedAnalysisEditorPageMessages.dependencies}:"/></b> + <br/> + <h:outputText value="#{filter.dependency}"/> + </ui:fragment> + </p:tooltip> + </ui:repeat> + </p:tab> + <p:tab title="#{localizedAnalysisEditorPageMessages.repositories}"> + <ui:repeat value="#{currentAnalysisEditorBean.availableComponents.repositories}" var="repository"> + <p:commandLink id="repositoryLink" value="#{repository.repository.name}" action="#{currentAnalysisEditorBean.addRepository(repository)}" update=":messages"/><br/> + <p:tooltip for="repositoryLink"> + <b><h:outputText value="#{repository.repository.name} (#{repository.repository.classname})"/></b> <br/> - <h:outputText value="#{repository.dependency}"/> - </ui:fragment> - </p:tooltip> - </ui:repeat> - </p:tab> - </p:accordionPanel> - </h:form> - </p:layoutUnit> + <h:outputText value="#{repository.description}"/> + <br/><br/> + <ui:fragment rendered="#{not empty repository.repository.properties}"> + <b><h:outputText value="#{localizedAnalysisEditorPageMessages.configuration}:"/></b> + <p:dataList value="#{repository.repository.properties}" var="property"> + #{property.name} + </p:dataList> + </ui:fragment> + <ui:fragment rendered="#{not empty repository.dependency}"> + <b><h:outputText value="#{localizedAnalysisEditorPageMessages.dependencies}:"/></b> + <br/> + <h:outputText value="#{repository.dependency}"/> + </ui:fragment> + </p:tooltip> + </ui:repeat> + </p:tab> + </p:accordionPanel> + </h:form> + </p:layoutUnit> + </c:if> </ui:define> <ui:define name="furtherDialogIncludes"> - <ui:include src="../dialogs/AnalysisEditorPageDialogs.xhtml" /> + <c:if test="#{sec:areAnyGranted('User, Administrator')}"> + <ui:include src="../dialogs/AnalysisEditorPageDialogs.xhtml" /> + </c:if> </ui:define> </ui:composition>