<?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" 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:c="http://java.sun.com/jsp/jstl/core"> <h:head/> <h:body> <ui:composition template="/templates/PagesTemplate.xhtml"> <ui:param name="unsavedModifications" value="#{currentAnalysisEditorBean.unsavedModification}"/> <ui:param name="projectName" value="#{currentAnalysisEditorBean.projectName}"/> <ui:param name="pagename" value="analysisEditor"/> <ui:param name="showProjectName" value="true"/> <ui:define name="metaData"> <f:metadata> <f:viewParam id="projectNameParam" name="projectName" value="#{currentAnalysisEditorBean.projectName}"/> <f:event type="preRenderView" listener="#{currentAnalysisEditorBean.initialize()}" /> </f:metadata> </ui:define> <ui:define name="bundleIncludes"> <f:loadBundle var="localizedAnalysisEditorPageMessages" basename="lang.AnalysisEditorPage"/> </ui:define> <ui:define name="cssIncludes"> <link rel="stylesheet" type="text/css" href="#{root}/css/FlowEditor.css" /> <link rel="stylesheet" type="text/css" href="#{root}/css/AnalysisEditorPage.css" /> </ui:define> <ui:define name="jsIncludes"> <script language="javascript" type="text/javascript" src="#{root}/js/jit.js"></script> <script language="javascript" type="text/javascript" src="#{root}/js/flowEditor.js"></script> </ui:define> <ui:define name="js"> <script> nodeEnterListener = function() { graph.setMouseCursor('pointer'); } nodeClickListener = function(node, info, e) { nodeClickCommand([{name : 'ID', value : node.id}]); markNode(node, '#FF0000'); } nodeRemoveListener = function(node) { nodeRemoveCommand([{name : 'ID', value : node.id}]); } edgeCreateListener = function(sourceNode, targetNode, sourcePort, targetPort) { edgeCreateCommand([{name : 'sourcePortID', value : sourcePort.id},{name : 'targetPortID', value : targetPort.id}]); } edgeRemoveListener = function(sourceNode, targetNode, sourcePort, targetPort) { edgeRemoveCommand([{name : 'sourcePortID', value : sourcePort.id},{name : 'targetPortID', value : targetPort.id}]); } autoLayoutListener = function(nodes, edges) { autoLayoutCommand([{name : 'nodes', value : nodes}, {name : 'edges', value : edges}]); } function preSaveProject(overwriteNewerProject) { var layoutString = graph.savePositions(); saveProjectCommand([{name : 'layoutString', value : layoutString}, {name : 'overwriteNewerProject', value : overwriteNewerProject}]); } // "Overwrite" the function in the template function bodyLoaded() { // postInit(); } </script> </ui:define> <ui:define name="furtherForms"> <h:form id="hidden" style="display:none"> <p:remoteCommand autoRun="true" name="init" action="#{currentAnalysisEditorBean.initializeGraph()}" /> <p:remoteCommand name="postInit" action="#{currentAnalysisEditorGraphBean.scaleToFit()}" /> </h:form> <h:form id="hiddenNodeProperties" style="display:none"> <p:remoteCommand name="nodeClickCommand" action="#{currentAnalysisEditorGraphBean.nodeClicked()}" update=":propertiesForm"/> <p:remoteCommand name="nodeRemoveCommand" action="#{currentAnalysisEditorGraphBean.nodeRemoved()}" update=":propertiesForm"/> <p:remoteCommand name="edgeCreateCommand" action="#{currentAnalysisEditorGraphBean.edgeCreated()}"/> <p:remoteCommand name="edgeRemoveCommand" action="#{currentAnalysisEditorGraphBean.edgeRemoved()}"/> <p:remoteCommand name="autoLayoutCommand" action="#{currentAnalysisEditorGraphBean.autoLayout()}"/> <p:remoteCommand name="saveProjectCommand" action="#{currentAnalysisEditorBean.saveProject()}" update=":messages"/> </h:form> </ui:define> <!-- Those are the menu bar entries left from the help-submenu. --> <ui:define name="furtherMenuBarEntries"> <p:submenu label="#{localizedMessages.file}"> <c:if test="#{sec:areAnyGranted('User, Administrator')}"> <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-save" value=" #{localizedMessages.saveProject}" ajax="true" onstart="preSaveProject(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/> <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}" onclick="closeConfirmation.show()" ajax="true" rendered="#{currentAnalysisEditorBean.unsavedModification}"/> <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-close" value=" #{localizedMessages.closeProject}" action="ProjectOverviewPage.xhtml?faces-redirect=true" ajax="false" rendered="#{not currentAnalysisEditorBean.unsavedModification}"/> </p:submenu> <p:submenu label="Graph"> <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-scaleToFitSmall" value=" #{localizedAnalysisEditorPageMessages.analysisEditorScaleToFit}" ajax="true" action="#{currentAnalysisEditorGraphBean.scaleToFit()}" /> <p:separator/> <p:menuitem styleClass="element-with-whitespace" icon="#{currentAnalysisEditorGraphBean.gridEnabled ? 'ui-icon-gridEnabledSmall' : 'ui-icon-gridDisabledSmall'}" value=" #{localizedAnalysisEditorPageMessages.grid} #{currentAnalysisEditorGraphBean.gridEnabled ? localizedAnalysisEditorPageMessages.disable : localizedAnalysisEditorPageMessages.enable}" ajax="true" action="#{currentAnalysisEditorGraphBean.switchGrid()}" update=":menuForm"/> <p:menuitem styleClass="element-with-whitespace" icon="#{currentAnalysisEditorGraphBean.snapEnabled ? 'ui-icon-snapEnabledSmall' : 'ui-icon-snapDisabledSmall'}" value=" #{localizedAnalysisEditorPageMessages.snap} #{currentAnalysisEditorGraphBean.snapEnabled ? localizedAnalysisEditorPageMessages.disable: localizedAnalysisEditorPageMessages.enable}" ajax="true" action="#{currentAnalysisEditorGraphBean.switchSnap()}" update=":menuForm"/> <p:separator/> <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-autoLayoutSmall" value=" #{localizedAnalysisEditorPageMessages.autoLayout}" ajax="true" /> </p:submenu> </ui:define> <ui:define name="furtherMenuBar"> <p:spacer height="5"/> <p:menubar> <p:menuitem id="btnScaleToFit" styleClass="element-with-whitespace" icon="ui-icon-scaleToFit" ajax="true" action="#{currentAnalysisEditorGraphBean.scaleToFit()}"/> <p:menuitem id="btnGrid" styleClass="element-with-whitespace" icon="#{currentAnalysisEditorGraphBean.gridEnabled ? 'ui-icon-gridEnabled' : 'ui-icon-gridDisabled'}" ajax="true" action="#{currentAnalysisEditorGraphBean.switchGrid()}" update=":menuForm"/> <p:menuitem id="btnSnap" styleClass="element-with-whitespace" icon="#{currentAnalysisEditorGraphBean.snapEnabled ? 'ui-icon-snapEnabled' : 'ui-icon-snapDisabled'}" ajax="true" action="#{currentAnalysisEditorGraphBean.switchSnap()}" update=":menuForm"/> <p:menuitem id="btnAutoLayout" styleClass="element-with-whitespace" icon="ui-icon-autoLayout" ajax="true" action="#{currentAnalysisEditorGraphBean.startAutoLayout()}" /> </p:menubar> <p:tooltip for="btnScaleToFit" value="#{localizedAnalysisEditorPageMessages.analysisEditorScaleToFit}"/> <p:tooltip for="btnGrid" value="#{localizedAnalysisEditorPageMessages.grid}"/> <p:tooltip for="btnSnap" value="#{localizedAnalysisEditorPageMessages.snap}"/> <p:tooltip for="btnAutoLayout" value="#{localizedAnalysisEditorPageMessages.autoLayout}"/> </ui:define> <ui:define name="centerContent"> <div id="center-container" style="width: 100%;height: 100%"> <div id="infovis"/> </div> </ui:define> <ui:define name="furtherLayoutUnits"> <p:ajax event="resize" onstart="graph.updateCanvasSize();"/> <!-- This is the component presenting the available properties. --> <p:layoutUnit style="font-size: 12px" position="south" size="150" header="#{localizedMessages.properties}" resizable="true" collapsible="true"> <h:form id="propertiesForm" > <p:dataTable editable="true" value="#{currentAnalysisEditorBean.advancedPluginProperties}" var="property" rowIndexVar="rowIndex" emptyMessage="#{localizedMessages.noPropertiesAvailable}" rendered="#{not empty currentAnalysisEditorBean.selectedPlugin}"> <p:column headerText="#{localizedMessages.property}" style="width:125px"> <!-- The first property is always the classname, the second one always the normal name. After that, other properties can follow. --> <h:outputText id="classNameProperty" value="#{localizedAnalysisEditorPageMessages.className}" rendered="#{rowIndex == 0 and not currentAnalysisEditorBean.globalConfigComponentSelected}"/> <h:outputText id="nameProperty" value="#{localizedAnalysisEditorPageMessages.name}" rendered="#{rowIndex == 1 and not currentAnalysisEditorBean.globalConfigComponentSelected}"/> <h:outputText id="normalProperty" value="#{property.name}" rendered="#{rowIndex > 1 or currentAnalysisEditorBean.globalConfigComponentSelected}"/> <p:tooltip for="classNameProperty" value="#{localizedAnalysisEditorPageMessages.tooltipClassName}" rendered="#{rowIndex == 0 and not currentAnalysisEditorBean.globalConfigComponentSelected}"/> <p:tooltip for="nameProperty" value="#{localizedAnalysisEditorPageMessages.tooltipName}" rendered="#{rowIndex == 1 and not currentAnalysisEditorBean.globalConfigComponentSelected}"/> <p:tooltip for="normalProperty" value="#{currentAnalysisEditorBean.getDescription(currentAnalysisEditorBean.selectedPlugin, property.name)}" rendered="#{rowIndex > 1 or currentAnalysisEditorBean.globalConfigComponentSelected}"/> </p:column> <!-- 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 and not currentAnalysisEditorBean.globalConfigComponentSelected}" 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 or currentAnalysisEditorBean.globalConfigComponentSelected}" disabled="#{not sec:areAnyGranted('User, Administrator')}"> <p:inputText value="#{property.value}" /> </p:inplace> <p:tooltip for="className" value="#{localizedAnalysisEditorPageMessages.tooltipClassName}" rendered="#{rowIndex == 0 and not currentAnalysisEditorBean.globalConfigComponentSelected}"/> <p:tooltip for="nameEditor" value="#{localizedAnalysisEditorPageMessages.tooltipName}" rendered="#{rowIndex == 1 and not currentAnalysisEditorBean.globalConfigComponentSelected}"/> <p:tooltip for="normalEditor" value="#{currentAnalysisEditorBean.getDescription(currentAnalysisEditorBean.selectedPlugin, property.name)}" rendered="#{rowIndex > 1 or currentAnalysisEditorBean.globalConfigComponentSelected}"/> </p:column> </p:dataTable> </h:form> </p:layoutUnit> <c:if test="#{sec:areAnyGranted('User, Administrator')}"> <!-- The following is the toolpalette, presenting the available plugins etc. --> <p:layoutUnit position="west" 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.name}" action="#{currentAnalysisEditorBean.addReader(reader)}" update=":messages" disabled="#{not reader.fullyInitialized}" /><br/> <p:tooltip for="readerLink"> <b> <div align="center"> <h:outputText value="#{reader.name}"/><br/> <h:outputText value="(#{reader.classname})"/> </div> </b> <br/> <b><h:outputText value="#{localizedAnalysisEditorPageMessages.description}:"/></b><br/> <ul> <li><h:outputText value="#{reader.description}"/></li> </ul> <ui:fragment rendered="#{not empty reader.outputPorts}"> <b><h:outputText value="#{localizedAnalysisEditorPageMessages.outputPorts}:"/></b> <p:dataList value="#{reader.outputPorts}" var="port"> #{port.name} </p:dataList> </ui:fragment> <ui:fragment rendered="#{not empty reader.repositories}"> <b><h:outputText value="#{localizedAnalysisEditorPageMessages.repositoryPorts}:" /></b> <p:dataList value="#{reader.repositories}" var="port"> #{port.name} </p:dataList> </ui:fragment> <ui:fragment rendered="#{not empty reader.properties}"> <b><h:outputText value="#{localizedAnalysisEditorPageMessages.configuration}:"/></b> <p:dataList value="#{reader.properties}" var="property"> #{property.name} </p:dataList> </ui:fragment> <ui:fragment rendered="#{not empty reader.dependency}"> <b><h:outputText value="#{localizedAnalysisEditorPageMessages.dependencies}:"/></b> <ul> <h:outputText value="#{reader.dependency}"/> </ul> </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.name}" action="#{currentAnalysisEditorBean.addFilter(filter)}" update=":messages"/><br/> <p:tooltip for="filterLink" > <b> <div align="center"> <h:outputText value="#{filter.name}"/><br/> <h:outputText value="(#{filter.classname})"/> </div> </b> <br/> <b><h:outputText value="#{localizedAnalysisEditorPageMessages.description}:"/></b><br/> <ul> <li><h:outputText value="#{filter.description}"/></li> </ul> <ui:fragment rendered="#{not empty filter.inputPorts}"> <b><h:outputText value="#{localizedAnalysisEditorPageMessages.inputPorts}:"/></b> <p:dataList value="#{filter.inputPorts}" var="port"> #{port.name} </p:dataList> </ui:fragment> <ui:fragment rendered="#{not empty filter.outputPorts}"> <b><h:outputText value="#{localizedAnalysisEditorPageMessages.outputPorts}:"/></b> <p:dataList value="#{filter.outputPorts}" var="port"> #{port.name} </p:dataList> </ui:fragment> <ui:fragment rendered="#{not empty filter.repositories}"> <b><h:outputText value="#{localizedAnalysisEditorPageMessages.repositoryPorts}:"/></b> <p:dataList value="#{filter.repositories}" var="port"> #{port.name} </p:dataList> </ui:fragment> <ui:fragment rendered="#{not empty filter.properties}"> <b><h:outputText value="#{localizedAnalysisEditorPageMessages.configuration}:"/></b> <p:dataList value="#{filter.properties}" var="property"> #{property.name} </p:dataList> </ui:fragment> <ui:fragment rendered="#{not empty filter.dependency}"> <b><h:outputText value="#{localizedAnalysisEditorPageMessages.dependencies}:"/></b> <ul> <h:outputText value="#{filter.dependency}"/> </ul> </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.name}" action="#{currentAnalysisEditorBean.addRepository(repository)}" update=":messages"/><br/> <p:tooltip for="repositoryLink"> <b> <div align="center"> <h:outputText value="#{repository.name}"/><br/> <h:outputText value="(#{repository.classname})"/> </div> </b> <br/> <b><h:outputText value="#{localizedAnalysisEditorPageMessages.description}:"/></b><br/> <ul> <li><h:outputText value="#{repository.description}"/></li> </ul> <ui:fragment rendered="#{not empty repository.properties}"> <b><h:outputText value="#{localizedAnalysisEditorPageMessages.configuration}:"/></b> <p:dataList value="#{repository.properties}" var="property"> #{property.name} </p:dataList> </ui:fragment> <ui:fragment rendered="#{not empty filter.dependency}"> <b><h:outputText value="#{localizedAnalysisEditorPageMessages.dependencies}:"/></b> <ul> <h:outputText value="#{repository.dependency}"/> </ul> </ui:fragment> </p:tooltip> </ui:repeat> </p:tab> </p:accordionPanel> </h:form> </p:layoutUnit> </c:if> </ui:define> <ui:define name="furtherDialogIncludes"> <p:confirmDialog id="confirmDialog" message="You have unsaved changed on your page. Do you really want to continue?" header="Unsaved Changes" severity="alert" widgetVar="closeConfirmation" > <h:form> <p:commandButton id="confirm" value="#{localizedMessages.yes}" ajax="false" oncomplete="closeConfirmation.hide()" action="ProjectOverviewPage.xhtml?faces-redirect=true" /> <p:commandButton id="decline" value="#{localizedMessages.cancel}" onclick="closeConfirmation.hide()" type="button" /> </h:form> </p:confirmDialog> <c:if test="#{sec:areAnyGranted('User, Administrator')}"> <ui:include src="../dialogs/AnalysisEditorPageDialogs.xhtml" /> </c:if> </ui:define> </ui:composition> </h:body> </html>