diff --git a/Kieker.WebGUI/bin/Kieker.WebGUI.bat b/Kieker.WebGUI/bin/Kieker.WebGUI.bat index 69dc07c7857d890a40eb09f7cb52295bc0c47f47..99ace6e5106b0d69aacbbc5ba811a7609a8d98b7 100644 --- a/Kieker.WebGUI/bin/Kieker.WebGUI.bat +++ b/Kieker.WebGUI/bin/Kieker.WebGUI.bat @@ -6,7 +6,7 @@ set BIN_PATH_ABS=%~dp0 cd %BIN_PATH_ABS% -java -XX:PermSize=256M -XX:MaxPermSize=512M -Xms128M -Xmx256M -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -jar ../lib/jetty-runner-8.1.9.v20130131.jar --path /Kieker.WebGUI ../target/Kieker.WebGUI-*.war +java -XX:PermSize=256M -XX:MaxPermSize=512M -Xms128M -Xmx512M -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -jar ../lib/jetty-runner-8.1.9.v20130131.jar --path /Kieker.WebGUI ../target/Kieker.WebGUI-*.war @echo on diff --git a/Kieker.WebGUI/bin/Kieker.WebGUI.sh b/Kieker.WebGUI/bin/Kieker.WebGUI.sh index d22b765670084e13207f9ae652db9a42597d6121..229a11e5609f647b3a4c681faa8fc44e50582b37 100644 --- a/Kieker.WebGUI/bin/Kieker.WebGUI.sh +++ b/Kieker.WebGUI/bin/Kieker.WebGUI.sh @@ -6,4 +6,4 @@ BINDIR=$(cd "$(dirname "$0")"; pwd)/ cd "${BINDIR}" -java -XX:PermSize=256M -XX:MaxPermSize=512M -Xms128M -Xmx256M -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -jar ../lib/jetty-runner-8.1.9.v20130131.jar --path /Kieker.WebGUI ../target/Kieker.WebGUI-*.war \ No newline at end of file +java -XX:PermSize=256M -XX:MaxPermSize=512M -Xms128M -Xmx512M -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -jar ../lib/jetty-runner-8.1.9.v20130131.jar --path /Kieker.WebGUI ../target/Kieker.WebGUI-*.war \ No newline at end of file diff --git a/Kieker.WebGUI/bin/monitoring/Kieker.WebGUI.bat b/Kieker.WebGUI/bin/monitoring/Kieker.WebGUI.bat index 11738008f19986630b76ed93464af571a36cfc74..bfac8d0fa3613266fd342f358095f9ee6097383a 100644 --- a/Kieker.WebGUI/bin/monitoring/Kieker.WebGUI.bat +++ b/Kieker.WebGUI/bin/monitoring/Kieker.WebGUI.bat @@ -6,7 +6,7 @@ set BIN_PATH_ABS=%~dp0 cd %BIN_PATH_ABS% -java -javaagent:lib/aspectjweaver-1.7.2.jar -Daj.weaving.verbose=true -Dorg.aspectj.weaver.showWeaveInfo=true -Dorg.aspectj.weaver.loadtime.configuration=aop.xml -XX:PermSize=256M -XX:MaxPermSize=512M -Xms128M -Xmx256M -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -jar ../../lib/jetty-runner-8.1.9.v20130131.jar --path /Kieker.WebGUI ../../target/Kieker.WebGUI-*.war +java -javaagent:lib/aspectjweaver-1.7.2.jar -Daj.weaving.verbose=true -Dorg.aspectj.weaver.showWeaveInfo=true -Dorg.aspectj.weaver.loadtime.configuration=aop.xml -XX:PermSize=256M -XX:MaxPermSize=512M -Xms128M -Xmx512M -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -jar ../../lib/jetty-runner-8.1.9.v20130131.jar --path /Kieker.WebGUI ../../target/Kieker.WebGUI-*.war @echo on diff --git a/Kieker.WebGUI/bin/monitoring/Kieker.WebGUI.sh b/Kieker.WebGUI/bin/monitoring/Kieker.WebGUI.sh index 6b23d851d45243a8a54cad3a5351ec9c22e1fcb9..5b9280d86d2a602b304cece627a9fb9de0c0302f 100644 --- a/Kieker.WebGUI/bin/monitoring/Kieker.WebGUI.sh +++ b/Kieker.WebGUI/bin/monitoring/Kieker.WebGUI.sh @@ -6,4 +6,4 @@ BINDIR=$(cd "$(dirname "$0")"; pwd)/ cd "${BINDIR}" -java -javaagent:lib/aspectjweaver-1.7.2.jar -Daj.weaving.verbose=true -Dorg.aspectj.weaver.showWeaveInfo=true -Dorg.aspectj.weaver.loadtime.configuration=aop.xml -XX:PermSize=256M -XX:MaxPermSize=512M -Xms128M -Xmx256M -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -jar ../../lib/jetty-runner-8.1.9.v20130131.jar --path /Kieker.WebGUI ../../target/Kieker.WebGUI-*.war \ No newline at end of file +java -javaagent:lib/aspectjweaver-1.7.2.jar -Daj.weaving.verbose=true -Dorg.aspectj.weaver.showWeaveInfo=true -Dorg.aspectj.weaver.loadtime.configuration=aop.xml -XX:PermSize=256M -XX:MaxPermSize=512M -Xms128M -Xmx512M -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -jar ../../lib/jetty-runner-8.1.9.v20130131.jar --path /Kieker.WebGUI ../../target/Kieker.WebGUI-*.war \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/impl/FSProjectDAOImpl.java b/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/impl/FSProjectDAOImpl.java index 1277422d3856e231884c39ecc3076dcf466520da..dd6d7afc78a9ebc9703da08fd83adaa1d4038a00 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/impl/FSProjectDAOImpl.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/persistence/impl/FSProjectDAOImpl.java @@ -35,6 +35,8 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Properties; +import java.util.Set; +import java.util.TreeSet; import java.util.concurrent.ConcurrentHashMap; import javax.annotation.Nullable; @@ -47,7 +49,15 @@ import com.google.common.io.Files; import kieker.analysis.AnalysisController; import kieker.analysis.model.analysisMetaModel.MIAnalysisMetaModelFactory; +import kieker.analysis.model.analysisMetaModel.MIDisplay; +import kieker.analysis.model.analysisMetaModel.MIDisplayConnector; +import kieker.analysis.model.analysisMetaModel.MIFilter; +import kieker.analysis.model.analysisMetaModel.MIInputPort; +import kieker.analysis.model.analysisMetaModel.MIOutputPort; +import kieker.analysis.model.analysisMetaModel.MIPlugin; import kieker.analysis.model.analysisMetaModel.MIProject; +import kieker.analysis.model.analysisMetaModel.MIRepository; +import kieker.analysis.model.analysisMetaModel.MIView; import kieker.common.logging.Log; import kieker.common.logging.LogFactory; import kieker.webgui.common.ClassContainer; @@ -307,6 +317,7 @@ public final class FSProjectDAOImpl implements IProjectDAO, ReleaseListener { } // Try to save it. + this.addMissingIDs(project); AnalysisController.saveToFile(FSProjectDAOImpl.assembleKaxFile(projectName), project); // Store the new meta data @@ -321,6 +332,121 @@ public final class FSProjectDAOImpl implements IProjectDAO, ReleaseListener { FSProjectDAOImpl.savePropertiesFile(properties, projectName); } + private void addMissingIDs(final MIProject project) { + this.addMissingIDs(project, this.collectUsedIDs(project)); + } + + private Set<String> collectUsedIDs(final MIProject project) { + final Set<String> usedIDs = new TreeSet<String>(); + + for (final MIPlugin plugin : project.getPlugins()) { + if (plugin.getId() != null) { + usedIDs.add(plugin.getId()); + } + for (final MIOutputPort outputPort : plugin.getOutputPorts()) { + if (outputPort.getId() != null) { + usedIDs.add(outputPort.getId()); + } + } + + if (plugin instanceof MIFilter) { + for (final MIInputPort inputPort : ((MIFilter) plugin).getInputPorts()) { + if (inputPort.getId() != null) { + usedIDs.add(inputPort.getId()); + } + } + } + + for (final MIDisplay display : plugin.getDisplays()) { + if (display.getId() != null) { + usedIDs.add(display.getId()); + } + } + } + for (final MIRepository repository : project.getRepositories()) { + if (repository.getId() != null) { + usedIDs.add(repository.getId()); + } + } + for (final MIView view : project.getViews()) { + if (view.getId() != null) { + usedIDs.add(view.getId()); + } + + for (final MIDisplayConnector displayConnector : view.getDisplayConnectors()) { + if (displayConnector.getId() != null) { + usedIDs.add(displayConnector.getId()); + } + } + } + + return usedIDs; + } + + private void addMissingIDs(final MIProject project, final Set<String> usedIDs) { + long idCounter = 0; + + for (final MIPlugin plugin : project.getPlugins()) { + if (plugin.getId() == null) { + while (usedIDs.contains(Long.toString(idCounter))) { + idCounter++; + } + plugin.setId(Long.toString(idCounter++)); + } + for (final MIOutputPort outputPort : plugin.getOutputPorts()) { + if (outputPort.getId() == null) { + while (usedIDs.contains(Long.toString(idCounter))) { + idCounter++; + } + outputPort.setId(Long.toString(idCounter++)); + } + } + if (plugin instanceof MIFilter) { + for (final MIInputPort inputPort : ((MIFilter) plugin).getInputPorts()) { + if (inputPort.getId() == null) { + while (usedIDs.contains(Long.toString(idCounter))) { + idCounter++; + } + inputPort.setId(Long.toString(idCounter++)); + } + } + } + for (final MIDisplay display : plugin.getDisplays()) { + if (display.getId() == null) { + while (usedIDs.contains(Long.toString(idCounter))) { + idCounter++; + } + display.setId(Long.toString(idCounter++)); + } + } + } + for (final MIRepository repository : project.getRepositories()) { + if (repository.getId() == null) { + while (usedIDs.contains(Long.toString(idCounter))) { + idCounter++; + } + repository.setId(Long.toString(idCounter++)); + } + } + for (final MIView view : project.getViews()) { + if (view.getId() == null) { + while (usedIDs.contains(Long.toString(idCounter))) { + idCounter++; + } + view.setId(Long.toString(idCounter++)); + } + + for (final MIDisplayConnector displayConnector : view.getDisplayConnectors()) { + if (displayConnector.getId() == null) { + while (usedIDs.contains(Long.toString(idCounter))) { + idCounter++; + } + displayConnector.setId(Long.toString(idCounter++)); + } + } + } + } + @Override public long getCurrTimeStamp(final String projectName) throws ProjectNotExistingException { this.assertProjectExistence(projectName); diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/AnalysisEditorBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/AnalysisEditorBean.java index fe4c16fbad8d58960a4f9a9d00eda4bef538cae1..ec7f6020c85405bc8f6b7801c3b1c183529c38ab 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/AnalysisEditorBean.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/AnalysisEditorBean.java @@ -101,9 +101,7 @@ public final class AnalysisEditorBean implements IGraphListener { private long timeStampFromLastSaving; @Autowired - private AnalysisEditorGraphBean currentAnalysisEditorGraphBean; - @Autowired - private AnalysisEditorHistoryBean currentAnalysisEditorHistoryBean; + private AnalysisEditorGraphBean analysisEditorGraphBean; @Autowired private GlobalPropertiesBean globalPropertiesBean; @Autowired @@ -153,32 +151,31 @@ public final class AnalysisEditorBean implements IGraphListener { public void initializeGraph() { try { // Initialize the graph - this.currentAnalysisEditorGraphBean.declareGraph(); + this.analysisEditorGraphBean.declareGraph(); // Initialize the component for the project configuration this.initializeGlobalConfigurationInstance(); - this.currentAnalysisEditorGraphBean.addGlobalConfigurationInstance(this.globalConfigurationInstance); + this.analysisEditorGraphBean.addGlobalConfigurationInstance(this.globalConfigurationInstance); - this.currentAnalysisEditorGraphBean.addProject(this.project); + this.analysisEditorGraphBean.addProject(this.project); // Now we have to set the default grid size and color of the user - this.currentAnalysisEditorGraphBean.setGridColor(this.userBean.getGridColor()); - this.currentAnalysisEditorGraphBean.setGridSize(this.userBean.getGridSize()); + this.analysisEditorGraphBean.setGridColor(this.userBean.getGridColor()); + this.analysisEditorGraphBean.setGridSize(this.userBean.getGridSize()); // Perform either an initial auto layout or use the saved layout - if it exists final String layout = this.projectService.getAnalysisLayout(this.projectName); if (layout != null) { - this.currentAnalysisEditorGraphBean.loadLayout(layout); + this.analysisEditorGraphBean.loadLayout(layout); } else { - this.currentAnalysisEditorGraphBean.startAutoLayout(); + this.analysisEditorGraphBean.startAutoLayout(); } // Make sure that the currentAnalysisEditorGraphBean knows "this" as well. - this.currentAnalysisEditorGraphBean.addGraphListener(this); - this.currentAnalysisEditorGraphBean.addGraphListener(this.currentAnalysisEditorHistoryBean); + this.analysisEditorGraphBean.addGraphListener(this); - this.currentAnalysisEditorGraphBean.initializeListeners(); + this.analysisEditorGraphBean.initializeListeners(); } catch (final NullPointerException ex) { // This exception can occur when a property has not been initialized LOG.error("An error occured while initializing the graph.", ex); @@ -323,7 +320,7 @@ public final class AnalysisEditorBean implements IGraphListener { // Add it to the project - and to the graph this.project.getRepositories().add(repository); - this.currentAnalysisEditorGraphBean.addComponent(repository); + this.analysisEditorGraphBean.addComponent(repository); this.setModificationsFlag(); } @@ -340,7 +337,7 @@ public final class AnalysisEditorBean implements IGraphListener { // Add it to the project - and to the graph this.project.getPlugins().add(plugin); - this.currentAnalysisEditorGraphBean.addComponent((MIReader) plugin); + this.analysisEditorGraphBean.addComponent((MIReader) plugin); this.setModificationsFlag(); } @@ -357,7 +354,7 @@ public final class AnalysisEditorBean implements IGraphListener { // Add it to the project - and to the graph this.project.getPlugins().add(plugin); - this.currentAnalysisEditorGraphBean.addComponent((MIFilter) plugin); + this.analysisEditorGraphBean.addComponent((MIFilter) plugin); this.setModificationsFlag(); } @@ -525,7 +522,7 @@ public final class AnalysisEditorBean implements IGraphListener { * The change event. */ public void gridColorListener(final ValueChangeEvent event) { - this.currentAnalysisEditorGraphBean.setGridColor((String) event.getNewValue()); + this.analysisEditorGraphBean.setGridColor((String) event.getNewValue()); } /** @@ -535,7 +532,7 @@ public final class AnalysisEditorBean implements IGraphListener { * The change event. */ public void gridSizeListener(final ValueChangeEvent event) { - this.currentAnalysisEditorGraphBean.setGridSize((Integer) event.getNewValue()); + this.analysisEditorGraphBean.setGridSize((Integer) event.getNewValue()); } public boolean isUnsavedModification() { diff --git a/Kieker.WebGUI/src/main/webapp/pages/AnalysisEditorPage.xhtml b/Kieker.WebGUI/src/main/webapp/pages/AnalysisEditorPage.xhtml index 2da70691a15e48474828e630339ec7474d16eb7a..88a267485c7716b5870f5b8baa33f5dc057ef208 100644 --- a/Kieker.WebGUI/src/main/webapp/pages/AnalysisEditorPage.xhtml +++ b/Kieker.WebGUI/src/main/webapp/pages/AnalysisEditorPage.xhtml @@ -114,8 +114,8 @@ <p:submenu label="Graph"> <c:if test="#{sec:areAnyGranted('User, Administrator')}"> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-undoSmall" value=" #{localizedMessages.lblUndo}" ajax="true" action="#{currentAnalysisEditorHistoryBean.undoLastCommand}" update=":menuForm" disabled="#{empty analysisEditorBean.project or currentAnalysisEditorHistoryBean.undoStackEmpty}" /> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-redoSmall" value=" #{localizedMessages.lblRedo}" ajax="true" action="#{currentAnalysisEditorHistoryBean.redoLastCommand}" update=":menuForm" disabled="#{empty analysisEditorBean.project or currentAnalysisEditorHistoryBean.redoStackEmpty}" /> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-undoSmall" value=" #{localizedMessages.lblUndo}" ajax="true" update=":menuForm" disabled="#{empty analysisEditorBean.project or true}" /> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-redoSmall" value=" #{localizedMessages.lblRedo}" ajax="true" update=":menuForm" disabled="#{empty analysisEditorBean.project or true}" /> <p:separator/> </c:if> <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-scaleToFitSmall" value=" #{localizedAnalysisEditorPageMessages.lblAnalysisEditorScaleToFit}" ajax="true" action="#{analysisEditorGraphBean.scaleToFit()}" disabled="#{empty analysisEditorBean.project}" /> @@ -139,8 +139,8 @@ <!-- A dummy item as a separator between the items. --> <p:menuitem style="width: 15px" disabled="true"/> - <p:menuitem id="btnUndo" styleClass="element-with-whitespace" icon="ui-icon-undo" action="#{currentAnalysisEditorHistoryBean.undoLastCommand}" update=":menuForm" disabled="#{empty analysisEditorBean.project or currentAnalysisEditorHistoryBean.undoStackEmpty}"/> - <p:menuitem id="btnRedo" styleClass="element-with-whitespace" icon="ui-icon-redo" action="#{currentAnalysisEditorHistoryBean.redoLastCommand}" update=":menuForm" disabled="#{empty analysisEditorBean.project or currentAnalysisEditorHistoryBean.redoStackEmpty}"/> + <p:menuitem id="btnUndo" styleClass="element-with-whitespace" icon="ui-icon-undo" update=":menuForm" disabled="#{empty analysisEditorBean.project or true}"/> + <p:menuitem id="btnRedo" styleClass="element-with-whitespace" icon="ui-icon-redo" update=":menuForm" disabled="#{empty analysisEditorBean.project or true}"/> <!-- A dummy item as a separator between the items. --> <p:menuitem style="width: 15px" disabled="true"/> </c:if>