diff --git a/Kieker.WebGUI/bin/data/Advanced Example/meta.dat b/Kieker.WebGUI/bin/data/Advanced Example/meta.dat deleted file mode 100644 index f46da07d8b5039c4f521a49becfa932d1968263f..0000000000000000000000000000000000000000 --- a/Kieker.WebGUI/bin/data/Advanced Example/meta.dat +++ /dev/null @@ -1,5 +0,0 @@ -# -#Sun May 19 16:38:30 CEST 2013 -owner=admin -last\ user=admin -analysis\ layout=id0 -593 -253 348 72;id1 -611 -32 312 72;id2 -243 -32 336 72;id3 133 -38 288 132;id4 479 -26 276 108;id5 1187 -41 468 96;id6 2055 -23 816 144;id7 1119 213 876 84;id8 2033 365 804 84;id9 2051 201 840 144;id10 2817 44 564 72;id11 2919 -71 360 72;id12 3349 -50 372 72;\#id2.2 id3.6 -43.5 -20 -43.5 10;id2.2 id3.5 -43.5 -20 -43.5 -14;id4.12 id5.14 648.5 -26 648.5 -29;id4.12 id7.20 648.5 -26 648.5 225;id5.0 id12.R 1588.5 -47 1588.5 -177 3130.5 -177 3130.5 -38;id6.1 id12.R 2502.5 -53 2502.5 -38;id6.17 id10.29 2502.5 -17 2502.5 56;id7.21 id8.23 1598.5 213 1598.5 365;id7.22 id8.24 1588.5 237 1588.5 389;id9.2 id12.R 3130.5 171 3130.5 -38;id9.27 id10.29 2502.5 231 2502.5 56;id10.3 id12.R 3130.5 56 3130.5 -38;id11.4 id12.R 3130.5 -59 3130.5 -38; diff --git a/Kieker.WebGUI/bin/data/Bookstore-Example/Bookstore-Example.kax b/Kieker.WebGUI/bin/data/Bookstore-Example/Bookstore-Example.kax index cd65e801f0a39042773c67d3f8150dce082d72ec..a4892db17b95e62177fc7fef902c355b11394c35 100644 --- a/Kieker.WebGUI/bin/data/Bookstore-Example/Bookstore-Example.kax +++ b/Kieker.WebGUI/bin/data/Bookstore-Example/Bookstore-Example.kax @@ -48,12 +48,6 @@ </plugins> <dependencies filePath="BookstoreApplication.jar"/> <dependencies filePath="commons-cli-1.2.jar"/> - <views name="Counter View" description="Shows the available counters"> - <displayConnectors name="Invalid Counter" display="//@plugins.3/@displays.2"/> - <displayConnectors name="Valid Counter" display="//@plugins.4/@displays.2"/> - <displayConnectors name="Global Counter" display="//@plugins.5/@displays.2"/> - <displayConnectors name="Global Counter (Meter Gauge)" display="//@plugins.5/@displays.3"/> - </views> <properties name="recordsTimeUnit" value="NANOSECONDS"/> <properties name="projectName" value="AnalysisProject"/> </Project> diff --git a/Kieker.WebGUI/bin/data/Bookstore-Example/meta.dat b/Kieker.WebGUI/bin/data/Bookstore-Example/meta.dat index 684ae968f8d801b960eaee58ef1c1e943d5af0eb..30e4b3f59a52064515e3141b7c71bb3c9f47bbe1 100644 --- a/Kieker.WebGUI/bin/data/Bookstore-Example/meta.dat +++ b/Kieker.WebGUI/bin/data/Bookstore-Example/meta.dat @@ -1,6 +1,6 @@ # -#Tue Jun 04 10:45:34 CEST 2013 +#Thu Jun 06 21:28:46 CEST 2013 owner=admin -cockpit\ layout=0 0 0 1 1 0 1 1 last\ user=user +cockpit\ layout= analysis\ layout=id0 -593 -253 348 72;id1 -671 -51 192 72;id2 -55 -63 336 84;id3 655 35 276 72;id4 315 47 276 84;id5 315 -93 252 84;id6 -399 -51 264 84;id7 643 -97 252 72;\#id2.2 id5.8 144.5 -63 144.5 -81;id2.3 id4.5 144.5 -39 144.5 59;id5.9 id7.14 484.5 -93 484.5 -85; diff --git a/Kieker.WebGUI/bin/data/CPU-and-Memory-Example/CPU-and-Memory-Example.kax b/Kieker.WebGUI/bin/data/CPU-and-Memory-Example/CPU-and-Memory-Example.kax index 298e2d4fb2e735be14174ad5764d60e009cd218a..fba9424ab2cfeca6abf02b2c4f9557e8d8fb8ed9 100644 --- a/Kieker.WebGUI/bin/data/CPU-and-Memory-Example/CPU-and-Memory-Example.kax +++ b/Kieker.WebGUI/bin/data/CPU-and-Memory-Example/CPU-and-Memory-Example.kax @@ -10,12 +10,22 @@ <plugins xsi:type="Reader" name="FSReader" classname="kieker.analysis.plugin.reader.filesystem.FSReader"> <properties name="inputDirs" value="data/CPU-and-Memory-Example/testdata"/> <properties name="ignoreUnknownRecordTypes" value="false"/> - <outputPorts name="monitoringRecords" subscribers="//@plugins.0/@inputPorts.0"/> + <outputPorts name="monitoringRecords" subscribers="//@plugins.2/@inputPorts.0"/> </plugins> - <views name="View" description="No description available."> + <plugins xsi:type="Filter" name="RealtimeRecordDelayFilter" classname="kieker.analysis.plugin.filter.forward.RealtimeRecordDelayFilter"> + <properties name="numWorkers" value="1"/> + <properties name="additionalShutdownDelaySeconds" value="5"/> + <properties name="warnOnNegativeSchedTimeSeconds" value="2"/> + <properties name="timerPrecision" value="MILLISECONDS"/> + <outputPorts name="outputRecords" subscribers="//@plugins.0/@inputPorts.0"/> + <inputPorts name="inputRecords"/> + </plugins> + <views name="CPU View" description="No description available."> <displayConnectors name="XYPlot CPU utilization Display" display="//@plugins.0/@displays.0"/> <displayConnectors name="Meter Gauge CPU total utilization Display" display="//@plugins.0/@displays.1"/> </views> + <views name="Memory View" description="No description available."> + </views> <properties name="recordsTimeUnit" value="NANOSECONDS"/> <properties name="projectName" value="AnalysisProject"/> </Project> diff --git a/Kieker.WebGUI/bin/data/CPU-and-Memory-Example/meta.dat b/Kieker.WebGUI/bin/data/CPU-and-Memory-Example/meta.dat index 68896c1dd59724818a8091061ad4ddbc972f0772..366b9e189d60aafb3c9e98e53c1109707a537ca5 100644 --- a/Kieker.WebGUI/bin/data/CPU-and-Memory-Example/meta.dat +++ b/Kieker.WebGUI/bin/data/CPU-and-Memory-Example/meta.dat @@ -1,6 +1,6 @@ # -#Thu Jun 06 09:16:16 CEST 2013 +#Thu Jun 06 12:48:33 CEST 2013 owner=admin +last\ user=user cockpit\ layout=0 0 1 0 0 1 -last\ user=admin -analysis\ layout=id0 -1418 -586 336 72;id1 -1140 -428 420 72;id2 -1490 -428 192 72;\#; +analysis\ layout=id0 -495 -241 336 72;id1 223 -83 420 72;id2 -567 -83 192 72;id3 -229 -83 396 72;\#; diff --git a/Kieker.WebGUI/bin/data/Timer-Counter-Example/Timer-Counter-Example.kax b/Kieker.WebGUI/bin/data/Timer-Counter-Example/Timer-Counter-Example.kax index ac222a4412ec8a6ef778e5d3eb4aa30c90c1f91d..15e805d13054043d1e82392e46ba45ce49318012 100644 --- a/Kieker.WebGUI/bin/data/Timer-Counter-Example/Timer-Counter-Example.kax +++ b/Kieker.WebGUI/bin/data/Timer-Counter-Example/Timer-Counter-Example.kax @@ -47,9 +47,6 @@ <displayConnectors name="Timestamp Records (Meter Gauge)" display="//@plugins.3/@displays.3"/> <displayConnectors name="Timestamps (Meter Gauge)" display="//@plugins.4/@displays.3"/> </views> - <views name="Only Records View" description="No description available."> - <displayConnectors name="Timestamp Records" display="//@plugins.3/@displays.1"/> - </views> <properties name="recordsTimeUnit" value="NANOSECONDS"/> <properties name="projectName" value="AnalysisProject"/> </Project> diff --git a/Kieker.WebGUI/bin/data/Timer-Counter-Example/meta.dat b/Kieker.WebGUI/bin/data/Timer-Counter-Example/meta.dat index 8fbfbb649bfcd74e76450042dc2738e675ba2ce0..3b4da79246a453bf48e413c8452b059ef7a5f79a 100644 --- a/Kieker.WebGUI/bin/data/Timer-Counter-Example/meta.dat +++ b/Kieker.WebGUI/bin/data/Timer-Counter-Example/meta.dat @@ -1,6 +1,6 @@ # -#Sun Jun 02 11:24:25 CEST 2013 +#Thu Jun 06 21:29:55 CEST 2013 owner=admin -last\ user=admin -cockpit\ layout=0 0 0 1 0 2 1 0 1 1 1 2 0 3 1 3 0 0 +cockpit\ layout=0 0 0 1 0 2 1 0 1 1 1 2 0 3 1 3 +last\ user=user analysis\ layout=id0 -2221 -900 336 72;id1 -2281 -618 216 84;id2 -1547 -748 204 72;id3 -1547 -618 204 72;id4 -1911 -606 396 84;id5 -1911 -740 312 84;\#id1.0 id5.9 -2142.5 -619.5 -2142.5 -729.5;id5.10 id2.2 -1682.5 -741.5 -1682.5 -737.5; diff --git a/Kieker.WebGUI/bin/data/Advanced Example/Advanced Example.kax b/Kieker.WebGUI/bin/data/Trace-Reconstruction-Example/Trace-Reconstruction-Example.kax similarity index 100% rename from Kieker.WebGUI/bin/data/Advanced Example/Advanced Example.kax rename to Kieker.WebGUI/bin/data/Trace-Reconstruction-Example/Trace-Reconstruction-Example.kax diff --git a/Kieker.WebGUI/bin/data/Trace-Reconstruction-Example/meta.dat b/Kieker.WebGUI/bin/data/Trace-Reconstruction-Example/meta.dat new file mode 100644 index 0000000000000000000000000000000000000000..a4c86b3b02adab8c2ffaf4f7969f410484784999 --- /dev/null +++ b/Kieker.WebGUI/bin/data/Trace-Reconstruction-Example/meta.dat @@ -0,0 +1,5 @@ +# +#Thu Jun 06 21:28:29 CEST 2013 +owner=admin +last\ user=user +analysis\ layout=id0 -495 -241 336 72;id1 -507 -20 312 72;id2 -139 -20 336 72;id3 237 -26 288 132;id4 583 -14 276 108;id5 1291 -29 468 96;id6 2159 -11 816 144;id7 1223 225 876 84;id8 2137 377 804 84;id9 2155 213 840 144;id10 2921 56 564 72;id11 3023 -59 360 72;id12 3453 -38 372 72;\#id2.2 id3.6 60.5 -8.5 60.5 21.5;id2.2 id3.5 60.5 -8.5 60.5 -2.5;id4.12 id5.15 752.5 -14.5 752.5 -17.5;id4.12 id7.22 752.5 -14.5 752.5 236.5;id5.14 id12.R 1692.5 -35.5 1692.5 -165.5 3234.5 -165.5 3234.5 -26.5;id6.17 id12.R 2606.5 -41.5 2606.5 -26.5;id6.19 id10.33 2606.5 -5.5 2606.5 67.5;id7.23 id8.25 1702.5 224.5 1702.5 376.5;id7.24 id8.26 1692.5 248.5 1692.5 400.5;id9.27 id12.R 3234.5 182.5 3234.5 -26.5;id9.30 id10.33 2606.5 242.5 2606.5 67.5;id10.32 id12.R 3234.5 67.5 3234.5 -26.5;id11.34 id12.R 3234.5 -47.5 3234.5 -26.5; diff --git a/Kieker.WebGUI/bin/data/Advanced Example/testdata/kieker-20100830-082225582-UTC-Thread-2.dat b/Kieker.WebGUI/bin/data/Trace-Reconstruction-Example/testdata/kieker-20100830-082225582-UTC-Thread-2.dat similarity index 100% rename from Kieker.WebGUI/bin/data/Advanced Example/testdata/kieker-20100830-082225582-UTC-Thread-2.dat rename to Kieker.WebGUI/bin/data/Trace-Reconstruction-Example/testdata/kieker-20100830-082225582-UTC-Thread-2.dat diff --git a/Kieker.WebGUI/bin/data/Advanced Example/testdata/kieker.map b/Kieker.WebGUI/bin/data/Trace-Reconstruction-Example/testdata/kieker.map similarity index 100% rename from Kieker.WebGUI/bin/data/Advanced Example/testdata/kieker.map rename to Kieker.WebGUI/bin/data/Trace-Reconstruction-Example/testdata/kieker.map diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/common/ClassContainer.java b/Kieker.WebGUI/src/main/java/kieker/webgui/common/ClassContainer.java index fecc5c8d58795fbae96a0391da707d9b8b034454..b821548264ba1a682f9b07eb12d5d9d19ebe2ddd 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/common/ClassContainer.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/common/ClassContainer.java @@ -24,6 +24,7 @@ import kieker.analysis.display.HtmlText; import kieker.analysis.display.Image; import kieker.analysis.display.MeterGauge; import kieker.analysis.display.PlainText; +import kieker.analysis.display.TagCloud; import kieker.analysis.display.XYPlot; import kieker.analysis.display.annotation.Display; import kieker.analysis.plugin.AbstractPlugin; @@ -66,6 +67,7 @@ public class ClassContainer { private Class<?> htmlTextClass; private Class<?> xyPlotClass; private Class<?> meterGaugeClass; + private Class<?> tagCloudClass; private Class<? extends Annotation> pluginAnnotationClass; private Class<? extends Annotation> repositoryAnnotationClass; @@ -101,6 +103,7 @@ public class ClassContainer { this.imageClass = classLoader.loadClass(Image.class.getName()); this.xyPlotClass = classLoader.loadClass(XYPlot.class.getName()); this.meterGaugeClass = classLoader.loadClass(MeterGauge.class.getName()); + this.tagCloudClass = classLoader.loadClass(TagCloud.class.getName()); // Now we load the more specific annotation classes this.pluginAnnotationClass = (Class<? extends Annotation>) classLoader.loadClass(Plugin.class.getName()); @@ -197,4 +200,8 @@ public class ClassContainer { return this.meterGaugeClass; } + public Class<?> getTagCloudClass() { + return this.tagCloudClass; + } + } diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/domain/DisplayType.java b/Kieker.WebGUI/src/main/java/kieker/webgui/domain/DisplayType.java index d9f486695c06c980f05c599542d9f5b75213fda4..a3fd472e9eec9562b89ca8334b2647035a8741e8 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/domain/DisplayType.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/domain/DisplayType.java @@ -32,6 +32,7 @@ public enum DisplayType { /** Represents the image display type. */ IMAGE, /** Represents the meter gauge display type. */ - METER_GAUGE - + METER_GAUGE, + /** Represents the tag cloud display type. */ + TAG_CLOUD } diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/service/impl/utility/Analysis.java b/Kieker.WebGUI/src/main/java/kieker/webgui/service/impl/utility/Analysis.java index 1707f71cf97548af2c200f95672922cdb94dbf73..66c411ec2ed600e82a4026cd31c946c61d578ea7 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/service/impl/utility/Analysis.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/service/impl/utility/Analysis.java @@ -186,6 +186,9 @@ public class Analysis { if (STATE.TERMINATED.toString().equals(state.toString())) { retState = STATE.TERMINATED; } + if (STATE.TERMINATING.toString().equals(state.toString())) { + retState = STATE.TERMINATING; + } } return retState; } catch (final MirrorException ex) { @@ -267,6 +270,8 @@ public class Analysis { return DisplayType.XY_PLOT; } else if (parameter == this.classContainer.getMeterGaugeClass()) { return DisplayType.METER_GAUGE; + } else if (parameter == this.classContainer.getTagCloudClass()) { + return DisplayType.TAG_CLOUD; } else { return null; } diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentCockpitBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentCockpitBean.java index 831d78e1bf07b7a0a49a7bdb0169f31edd8268b1..cac899a96e29d175a17cd2aecb090f45a2c21305 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentCockpitBean.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentCockpitBean.java @@ -20,12 +20,15 @@ import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.atomic.AtomicLong; import javax.faces.application.Application; import javax.faces.application.FacesMessage; import javax.faces.component.UIComponent; +import javax.faces.component.UISelectItem; import javax.faces.component.html.HtmlOutputText; import javax.faces.context.FacesContext; +import javax.faces.model.SelectItem; import kieker.analysis.AnalysisController; import kieker.analysis.model.analysisMetaModel.MIDisplayConnector; @@ -48,6 +51,7 @@ import org.primefaces.component.chart.metergauge.MeterGaugeChart; import org.primefaces.component.dashboard.Dashboard; import org.primefaces.component.panel.Panel; import org.primefaces.component.selectcheckboxmenu.SelectCheckboxMenu; +import org.primefaces.component.tagcloud.TagCloud; import org.primefaces.model.DashboardColumn; import org.primefaces.model.DashboardModel; import org.primefaces.model.DefaultDashboardColumn; @@ -55,6 +59,9 @@ import org.primefaces.model.DefaultDashboardModel; import org.primefaces.model.chart.CartesianChartModel; import org.primefaces.model.chart.LineChartSeries; import org.primefaces.model.chart.MeterGaugeChartModel; +import org.primefaces.model.tagcloud.DefaultTagCloudItem; +import org.primefaces.model.tagcloud.DefaultTagCloudModel; +import org.primefaces.model.tagcloud.TagCloudModel; import net.vidageek.mirror.dsl.Mirror; import net.vidageek.mirror.exception.MirrorException; @@ -234,6 +241,16 @@ public class CurrentCockpitBean { return false; } + public boolean isAnalysisTerminating() { + try { + return this.projectService.getCurrentState(this.projectName) == AnalysisController.STATE.TERMINATING; + } catch (final NullPointerException ex) { + // This exception can occur, when the projectsBean has not been initialized + LOG.warn("A null pointer exception occured.", ex); + } + return false; + } + /** * Checks whether the analysis is currently in the failed state. * @@ -280,6 +297,9 @@ public class CurrentCockpitBean { case METER_GAUGE: this.updateMeterGaugeDisplay(component, displayConnector.getName()); break; + case TAG_CLOUD: + this.updateTagCloudDisplay(component, displayConnector.getName()); + break; default: // Unknown type this.updateDisplayWithDefaultContent(component); @@ -435,6 +455,54 @@ public class CurrentCockpitBean { } } + @SuppressWarnings("unchecked") + private void updateTagCloudDisplay(final UIComponent component, final String displayConnectorName) { + final boolean isAlreadyCorrectlyInitialized = (component.getChildCount() == 1) && (component.getChildren().get(0) instanceof MeterGaugeChart); + + final TagCloudModel tagCloudModel; + + // Avoid unnecessary component creation. Use the existing components if they are already existing and from the correct type. + if (isAlreadyCorrectlyInitialized) { + final TagCloud tagCloud = (TagCloud) component.getChildren().get(0); + tagCloudModel = tagCloud.getModel(); + } else { + final FacesContext facesContext = FacesContext.getCurrentInstance(); + final Application application = facesContext.getApplication(); + + // Create the Primefaces chart component + final TagCloud tagCloud = (TagCloud) application.createComponent(facesContext, "org.primefaces.component.TagCloud", + "org.primefaces.component.TagCloudRenderer"); + + // Add the corresponding model + tagCloudModel = new DefaultTagCloudModel(); + tagCloud.setModel(tagCloudModel); + + component.getChildren().clear(); + component.getChildren().add(tagCloud); + } + + try { + final Object displayObj = this.projectService.getDisplay(this.projectName, this.activeView.getName(), displayConnectorName); + + final Map<String, AtomicLong> counters = (Map<String, AtomicLong>) new Mirror().on(displayObj).invoke().method("getCounters").withoutArgs(); + System.out.println(counters); + tagCloudModel.clear(); + for (final Map.Entry<String, AtomicLong> counter : counters.entrySet()) { + tagCloudModel.addTag(new DefaultTagCloudItem(counter.getKey(), (int) counter.getValue().get())); + } + + } catch (final DisplayNotFoundException ex) { + CurrentCockpitBean.LOG.warn("Display not found.", ex); + this.updateDisplayWithDefaultContent(component); + } catch (final MirrorException ex) { + CurrentCockpitBean.LOG.warn("Reflection exception.", ex); + this.updateDisplayWithDefaultContent(component); + } catch (final InvalidAnalysisStateException ex) { + CurrentCockpitBean.LOG.info("Project is in invalid state.", ex); + this.updateDisplayWithDefaultContent(component); + } + } + @SuppressWarnings("unchecked") private void updateMeterGaugeDisplay(final UIComponent component, final String displayConnectorName) { final boolean isAlreadyCorrectlyInitialized = (component.getChildCount() == 1) && (component.getChildren().get(0) instanceof MeterGaugeChart); @@ -472,6 +540,7 @@ public class CurrentCockpitBean { meterGaugeChartModel.setValue(0); } else { final List<Number> intervals = (List<Number>) new Mirror().on(displayObj).invoke().method("getIntervals").withArgs(keys.iterator().next()); + final List<String> colors = (List<String>) new Mirror().on(displayObj).invoke().method("getIntervalColors").withArgs(keys.iterator().next()); final Number value = (Number) new Mirror().on(displayObj).invoke().method("getValue").withArgs(keys.iterator().next()); if (intervals.isEmpty()) { @@ -480,7 +549,7 @@ public class CurrentCockpitBean { } else { meterGaugeChartModel.setIntervals(intervals); meterGaugeChart.setShadow(true); - meterGaugeChart.setSeriesColors("66cc66, 93b75f, E7E658, cc6666"); + meterGaugeChart.setSeriesColors(colors.toString().replace("[", "").replace("]", "")); final Number maxInterval = intervals.get(intervals.size() - 1); if (value.doubleValue() <= maxInterval.doubleValue()) { meterGaugeChartModel.setValue(value); @@ -543,6 +612,13 @@ public class CurrentCockpitBean { final Object displayObj = this.projectService.getDisplay(this.projectName, this.activeView.getName(), displayConnectorName); final Set<String> keys = (Set<String>) new Mirror().on(displayObj).invoke().method("getKeys").withoutArgs(); + selectCheckboxMenu.getChildren().clear(); + for (final String key : keys) { + final UISelectItem item = new UISelectItem(); + item.setValue(new SelectItem(key)); + selectCheckboxMenu.getChildren().add(item); + } + if (keys.isEmpty()) { lineChartSeries.set(0, 0); } else { @@ -566,5 +642,4 @@ public class CurrentCockpitBean { } } - } diff --git a/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentControllerBean.java b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentControllerBean.java index 33c53437c808aa95455a58dd34f895ac89849340..1c345b02d61cec6f80693453ff8aea2e2fff7dbb 100644 --- a/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentControllerBean.java +++ b/Kieker.WebGUI/src/main/java/kieker/webgui/web/beans/view/CurrentControllerBean.java @@ -158,6 +158,16 @@ public class CurrentControllerBean { return false; } + public boolean isAnalysisTerminating() { + try { + return this.projectService.getCurrentState(this.projectName) == AnalysisController.STATE.TERMINATING; + } catch (final NullPointerException ex) { + // This exception can occur, when the projectsBean has not been initialized + CurrentControllerBean.LOG.warn("A null pointer exception occured.", ex); + } + return false; + } + /** * Checks whether the analysis is currently in the ready state. * diff --git a/Kieker.WebGUI/src/main/resources/lang/CockpitEditorPage_de.properties b/Kieker.WebGUI/src/main/resources/lang/CockpitEditorPage_de.properties index 2cbc58d6fd7916c2deb814f66db414a7d0faf9d5..870ad76d39c513189c616565f1d905186f7c3777 100644 --- a/Kieker.WebGUI/src/main/resources/lang/CockpitEditorPage_de.properties +++ b/Kieker.WebGUI/src/main/resources/lang/CockpitEditorPage_de.properties @@ -10,7 +10,4 @@ copyView = Ansicht Kopieren renameView = Ansicht Umbenennen deleteView = Ansicht L�schen -name = Name - -msgCockpitEditorWelcomeShort = Entwicklungsphase -msgCockpitEditorWelcome = Der Cockpit Editor befindet sich zur Zeit noch in der Entwicklungsphase. \ No newline at end of file +name = Name \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/resources/lang/CockpitEditorPage_en.properties b/Kieker.WebGUI/src/main/resources/lang/CockpitEditorPage_en.properties index 55dadc86057a2c0861c1d8e078f944a1cae9ceee..71f62abfbd817358cd99d65b3c419f8bf7e69f67 100644 --- a/Kieker.WebGUI/src/main/resources/lang/CockpitEditorPage_en.properties +++ b/Kieker.WebGUI/src/main/resources/lang/CockpitEditorPage_en.properties @@ -10,7 +10,4 @@ copyView = Copy View renameView = Rename View deleteView = Delete View -name = Name - -msgCockpitEditorWelcomeShort = Development Stage -msgCockpitEditorWelcome = The cockpit editor is still in the development stage. \ No newline at end of file +name = Name \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/resources/lang/CockpitPage_de.properties b/Kieker.WebGUI/src/main/resources/lang/CockpitPage_de.properties index 629ae3d31db19b1ab081be39a7a83516c7b0d1e7..1476d0e5380fe4e98fa94d90c7e9f064cee71c31 100644 --- a/Kieker.WebGUI/src/main/resources/lang/CockpitPage_de.properties +++ b/Kieker.WebGUI/src/main/resources/lang/CockpitPage_de.properties @@ -4,6 +4,3 @@ # welche innerhalb des Cockpits benutzt werden. # #------------------------------------------------------------------------------ - -msgCockpitWelcomeShort = Entwicklungsphase -msgCockpitWelcome = Das Cockpit befindet sich zur Zeit noch in der Entwicklungsphase. \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/resources/lang/CockpitPage_en.properties b/Kieker.WebGUI/src/main/resources/lang/CockpitPage_en.properties index 868dd2a1f872ade5acaf34fb00a8a8ed3e8875d7..0836a7cfca1631a0e62b6a817c9aec90901673f5 100644 --- a/Kieker.WebGUI/src/main/resources/lang/CockpitPage_en.properties +++ b/Kieker.WebGUI/src/main/resources/lang/CockpitPage_en.properties @@ -3,7 +3,4 @@ # This file contains all messages, button captions etc. which are used within # the cockpit page. # -#------------------------------------------------------------------------------ - -msgCockpitWelcomeShort = Development Stage -msgCockpitWelcome = The cockpit is still in the development stage. \ No newline at end of file +#------------------------------------------------------------------------------ \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/resources/lang/Common_de.properties b/Kieker.WebGUI/src/main/resources/lang/Common_de.properties index e1738aca166b7cc0dbe6eff8eb640e5cb0f566a0..efe5c8b572723e548cc587185923af5129ca9002 100644 --- a/Kieker.WebGUI/src/main/resources/lang/Common_de.properties +++ b/Kieker.WebGUI/src/main/resources/lang/Common_de.properties @@ -48,6 +48,7 @@ stateReady = Bereit stateRunning = L�uft stateTerminated = Beendet stateFailed = Absturz +stateTerminating = Beim Beenden #------------------------------------------------------------------------------ # diff --git a/Kieker.WebGUI/src/main/resources/lang/Common_en.properties b/Kieker.WebGUI/src/main/resources/lang/Common_en.properties index badbab4a2aab662c7152958b9118d477962e8d38..3124574cdd9fabb3002444fb4d534a39f6c6eec9 100644 --- a/Kieker.WebGUI/src/main/resources/lang/Common_en.properties +++ b/Kieker.WebGUI/src/main/resources/lang/Common_en.properties @@ -48,6 +48,7 @@ stateReady = Ready stateRunning = Running stateTerminated = Terminated stateFailed = Failed +stateTerminating = Terminating #------------------------------------------------------------------------------ # diff --git a/Kieker.WebGUI/src/main/resources/lang/LoginPage_de.properties b/Kieker.WebGUI/src/main/resources/lang/LoginPage_de.properties index 185013d240746842c77a9699ad1f6287d8bdec82..270f895c76a451c767435161cf37ea743c9cd590 100644 --- a/Kieker.WebGUI/src/main/resources/lang/LoginPage_de.properties +++ b/Kieker.WebGUI/src/main/resources/lang/LoginPage_de.properties @@ -1,18 +1,17 @@ -#------------------------------------------------------------------------------ +#---------------------------------------------------------------------------------------------------------------- # -# Diese Datei beinhaltet s\u00e4mtliche Nachrichten, Buttonbeschriftungen etc., -# welche innerhalb der Anmeldeseite benutzt werden. +# Diese Datei beinhaltet s\u00e4mtliche lokalisierten Texte, welche innerhalb der Anmeldeseite benutzt werden. # -#------------------------------------------------------------------------------ +#---------------------------------------------------------------------------------------------------------------- msgWelcomeShort = Willkommen bei der Kieker.WebGUI -msgWelcome = Dies ist eine fr\u00fche Beta Version der Kieker Web GUI. Deshalb kann diese noch Bugs enthalten und einige Funktionalit\u00e4ten sind m\u00f6glicherweise noch nicht implementiert. Benutzen sie den Benutzer "admin" mit dem Passwort "kieker" um sich anzumelden und fortzufahren. +msgWelcome = Dies ist eine Beta Version der Kieker Web GUI. Deshalb kann diese noch Bugs enthalten und einige Funktionalit\u00e4ten sind m\u00f6glicherweise noch nicht implementiert. Benutzen sie den Benutzer "admin" mit dem Passwort "kieker" um sich anzumelden und fortzufahren. + username = Benutzername password = Passwort - login = Anmelden -loginFailed = Login fehlgeschlagen. +loginFailed = Login fehlgeschlagen. logout = Sie haben sich erfolgreich ausgeloggt. hint = Hinweis: Die Kieker.WebGUI ben\u00f6tigt Cookies und JavaScript, um korrekt zu funktionieren. Bitte stellen Sie sicher, dass beides aktiviert ist. \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/resources/lang/LoginPage_en.properties b/Kieker.WebGUI/src/main/resources/lang/LoginPage_en.properties index 00fc5c59e176e2b6560aa74ee6036d36ef54d222..f53495971efbd943bf54c8640e8294d55a40d0d3 100644 --- a/Kieker.WebGUI/src/main/resources/lang/LoginPage_en.properties +++ b/Kieker.WebGUI/src/main/resources/lang/LoginPage_en.properties @@ -1,19 +1,17 @@ -#------------------------------------------------------------------------------ +#---------------------------------------------------------------------------------------------------------------- # -# This file contains all messages, button captions etc. which are used within -# the login page. +# This file contains all localized texts, which are used within the login page. # -#------------------------------------------------------------------------------ +#---------------------------------------------------------------------------------------------------------------- msgWelcomeShort = Welcome to the Kieker.WebGUI -msgWelcome = This is an early beta version of the Kieker Web GUI. Therefore it may contain bugs and some functionality may have not been implemented yet. Use the user "admin" with the password "kieker" to login and continue. +msgWelcome = This is a beta version of the Kieker Web GUI. Therefore it may contain bugs and some functionality may have not been implemented yet. Use the user "admin" with the password "kieker" to login and continue. username = Username password = Password - login = Login -loginFailed = Login failed. +loginFailed = Login failed. logout = You have logged out successfully. -hint = Hint: The Kieker.WebGUI requires Cookies and JavaScript in order to work correctly. Please make sure that both is enabled. \ No newline at end of file +hint = Hint: The Kieker.WebGUI requires cookies and JavaScript in order to work correctly. Please make sure that both is enabled. \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/resources/lang/ProjectOverviewPage_de.properties b/Kieker.WebGUI/src/main/resources/lang/ProjectOverviewPage_de.properties index f26b740566f94e89239009c6cc6eb437c222de81..7234f9e8435ee9191ec3dd53647ed951c53cd947 100644 --- a/Kieker.WebGUI/src/main/resources/lang/ProjectOverviewPage_de.properties +++ b/Kieker.WebGUI/src/main/resources/lang/ProjectOverviewPage_de.properties @@ -1,17 +1,22 @@ -#------------------------------------------------------------------------------ +#---------------------------------------------------------------------------------------------------------------- # -# Diese Datei beinhaltet s\u00e4mtliche Nachrichten, Buttonbeschriftungen etc., -# welche innerhalb der Projekt\u00fcbersichtsseite benutzt werden. +# Diese Datei beinhaltet s\u00e4mtliche Texte, welche innerhalb der Projekt\u00fcbersichtsseite benutzt werden. # -#------------------------------------------------------------------------------ +#---------------------------------------------------------------------------------------------------------------- + +msgReallyDeleteProject = M\u00f6chten Sie das ausgew\u00e4hlte Projekt wirklich l\u00f6schen? + +tooltipNewProject = Erstellt ein neues Projekt +tooltipImportProject = Importiert ein bereits existentes Projekt in die Anwendung +tooltipReloadProjectsList = Aktualisiert die Liste von verfügbaren Projekten newProject = Neues Projekt importProject = Projekt Importieren refreshProjectsList = Projektliste Aktualisieren projectName = Projektname -state = Status -lastModification = Letzte \u00c4nderung +state = Status der Analyse +lastModification = \u00c4nderungsdatum owner = Besitzer lastEditor = Letzter Bearbeiter @@ -20,6 +25,5 @@ renameProject = Projekt Umbenennen deleteProject = Projekt L\u00f6schen name = Name -newName = Neuer Name - -msgReallyDeleteProject = M\u00f6chten Sie wirklich das ausgew\u00e4hlte Projekt l\u00f6schen? \ No newline at end of file +file = Datei +newName = Neuer Name \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/resources/lang/ProjectOverviewPage_en.properties b/Kieker.WebGUI/src/main/resources/lang/ProjectOverviewPage_en.properties index b915b322536e735dbe708e374cef169166bb39ab..100d37ee912e43db2dae0e5a208b94f5d5ac518b 100644 --- a/Kieker.WebGUI/src/main/resources/lang/ProjectOverviewPage_en.properties +++ b/Kieker.WebGUI/src/main/resources/lang/ProjectOverviewPage_en.properties @@ -1,17 +1,22 @@ -#------------------------------------------------------------------------------ +#---------------------------------------------------------------------------------------------------------------- # -# This file contains all messages, button captions etc. which are used within -# the project overview page. +# This file contains all texts, which are used within the project overview page. # -#------------------------------------------------------------------------------ +#---------------------------------------------------------------------------------------------------------------- + +msgReallyDeleteProject = Do you really want to delete the selected project? + +tooltipNewProject = Creates a new project +tooltipImportProject = Imports an already existing project into the application +tooltipReloadProjectsList = Refreshes the list of available projects newProject = New Project importProject = Import Project refreshProjectsList = Refresh Projects List projectName = Project Name -state = State -lastModification = Last Modification +state = State of the Analysis +lastModification = Date of Change owner = Owner lastEditor = Last Editor @@ -20,6 +25,5 @@ renameProject = Rename Project deleteProject = Delete Project name = Name -newName = New Name - -msgReallyDeleteProject = Do you really want to delete the selected project? \ No newline at end of file +file = File +newName = New Name \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/webapp/LoginPage.xhtml b/Kieker.WebGUI/src/main/webapp/LoginPage.xhtml index c6b6a1ee49d6c79083c072eca04921399954304d..85faf4ac69b516e51013f6cb0c5e0650ea2dcde1 100644 --- a/Kieker.WebGUI/src/main/webapp/LoginPage.xhtml +++ b/Kieker.WebGUI/src/main/webapp/LoginPage.xhtml @@ -8,71 +8,81 @@ xmlns:c="http://java.sun.com/jsp/jstl/core"> <h:head/> - + <h:body> <ui:composition template="#{root}/templates/DefaultTemplate.xhtml"> + <!-- We use a view parameter named "state" here. It defines whether a login failed or whether the user just logged out. --> <ui:define name="metadata"> - <f:metadata> + <f:metadata> <f:viewParam id="state" name="state"/> </f:metadata> </ui:define> + <!-- Import the localized strings. --> <ui:define name="bundleIncludes"> <f:loadBundle var="localizedLoginMessages" basename="lang.LoginPage"/> </ui:define> + <!-- Import the CSS file for this page. --> <ui:define name="additionalCssIncludes"> <link rel="stylesheet" type="text/css" href="#{root}/css/LoginPage.css" /> </ui:define> + <!-- This JavaScript code will be executed in the onload-part of the body. It shows a localized welcome message using the growl component. --> <ui:define name="js"> - <!-- This javascript code will be executed in the onload-part of the body and shows a localized welcome message via the growl-component. --> <script> bodyLoaded = function() { - msgs.renderMessage({summary : '#{localizedLoginMessages.msgWelcomeShort}', detail : '#{localizedLoginMessages.msgWelcome}', severity: 'info'}); - } + msgs.renderMessage({ + summary : '#{localizedLoginMessages.msgWelcomeShort}', + detail : '#{localizedLoginMessages.msgWelcome}', + severity: 'info'}); + }; </script> </ui:define> + <!-- This definition contains the login form. It uses the Spring framework to perform the actual login. --> <ui:define name="inner-content"> <form id="loginForm" action="#{root}/j_spring_security_check" method="post"> - <p:panel header="#{localizedLoginMessages.msgWelcomeShort}" styleClass="login-panel"> - <h:panelGrid columnClasses="col1 , col2" styleClass="grid" columns="2" cellpadding="5" > + <p:panel header="#{localizedLoginMessages.msgWelcomeShort}" styleClass="login-form-panel"> + <h:panelGrid columnClasses="login-form-col-1, login-form-col-2" styleClass="login-form-grid" columns="2" cellpadding="5" > <h:outputLabel for="j_username" value="#{localizedLoginMessages.username}:" /> - <p:inputText styleClass="input" id="j_username" required="true" label="username" /> + <p:inputText styleClass="login-form-input" id="j_username" required="true" /> <h:outputLabel for="j_password" value="#{localizedLoginMessages.password}:" /> - <p:password styleClass="input" id="j_password" required="false" label="password" /> + <p:password styleClass="login-form-input" id="j_password" required="false" /> </h:panelGrid> <hr/> <div align="right"> + <!-- There are problems with the button and the command button of Primefaces. We therefore use a default button and add some additional + skins. --> <button type="submit" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"> <span class="ui-button-text">#{localizedLoginMessages.login}</span> </button> </div> </p:panel> + <!-- This code shows a hint panel depending on the given view parameter. --> <c:if test="#{state == 'logout'}"> - <div class="hint-panel"> + <div class="login-form-hint-panel"> <p:spacer width="0" height="25"/> <h:outputText value="#{localizedLoginMessages.logout}"/><br/> </div> </c:if> <c:if test="#{state == 'fail'}"> - <div class="hint-panel"> + <div class="login-form-hint-panel"> <p:spacer width="0" height="25" /> <h:outputText style="color: red" value="#{localizedLoginMessages.loginFailed}"/><br/> </div> </c:if> <p:spacer width="0" height="40"/> - <div class="hint-panel"> + <div class="login-form-hint-panel"> <h:outputText value="#{localizedLoginMessages.hint}"/> </div> </form> </ui:define> </ui:composition> - + </h:body> </html> \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/webapp/css/AnalysisEditorPage.css b/Kieker.WebGUI/src/main/webapp/css/AnalysisEditorPage.css index 1889c5a7f121f75d7f0751e5c42c3ef13f268434..8ad1e4b7b7777087e1629af726ba746018ad5cb4 100644 --- a/Kieker.WebGUI/src/main/webapp/css/AnalysisEditorPage.css +++ b/Kieker.WebGUI/src/main/webapp/css/AnalysisEditorPage.css @@ -32,4 +32,18 @@ font-size:10px; font-family:Verdana, Geneva, Arial, Helvetica, sans-serif; padding:7px; +} + +/* The following code is for icon definition. */ + +.ui-icon-manageLibraries { + background: url('../img/icons/ManageLibraries.png') no-repeat !important; + height:32px; + width:32px; +} + +.ui-icon-manageLibrariesSmall { + background: url('../img/icons/ManageLibrariesSmall.png') no-repeat !important; + height:16px; + width:16px; } \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/webapp/css/Common.css b/Kieker.WebGUI/src/main/webapp/css/Common.css index 6cf1da116c6c6b858067ca4c0ef2302eb0a2c61c..6f59699eedfbc8e8d6fa3d6dba2442806e29a00b 100644 --- a/Kieker.WebGUI/src/main/webapp/css/Common.css +++ b/Kieker.WebGUI/src/main/webapp/css/Common.css @@ -1,11 +1,11 @@ @charset "UTF-8"; .ui-growl { - width: 500px + width: 35% !important; } .ui-growl-message { - width: 400px; + width: 90% !important; text-align: justify; } @@ -15,6 +15,7 @@ .ui-layout-north { z-index: 20 !important; overflow: visible !important; + border-style: none !important; } .ui-layout-north .ui-layout-unit-content { diff --git a/Kieker.WebGUI/src/main/webapp/css/Icons.css b/Kieker.WebGUI/src/main/webapp/css/Icons.css index 88818fe721d047fccd248ffd3153b0956902ecd4..fdf90f2c7e3af0931b8407dee326fe0ee5859246 100644 --- a/Kieker.WebGUI/src/main/webapp/css/Icons.css +++ b/Kieker.WebGUI/src/main/webapp/css/Icons.css @@ -6,12 +6,6 @@ width:16px; } -.ui-icon-reload { - background: url('../img/icons/Reload.png') no-repeat !important; - height:16px; - width:16px; -} - .ui-icon-settings { background: url('../img/icons/Settings.png') no-repeat !important; height:16px; @@ -141,24 +135,24 @@ .ui-icon-save { background: url('../img/icons/Save.png') no-repeat !important; - height:16px; - width:16px; + height:32px; + width:32px; } .ui-icon-saveAs { background: url('../img/icons/SaveAs.png') no-repeat !important; - height:16px; - width:16px; + height:32px; + width:32px; } -.ui-icon-newProject { - background: url('../img/icons/NewProject.png') no-repeat !important; +.ui-icon-saveSmall { + background: url('../img/icons/SaveSmall.png') no-repeat !important; height:16px; width:16px; } -.ui-icon-importProject { - background: url('../img/icons/ImportProject.png') no-repeat !important; +.ui-icon-saveAsSmall { + background: url('../img/icons/SaveAsSmall.png') no-repeat !important; height:16px; width:16px; } @@ -175,12 +169,6 @@ width:16px; } -.ui-icon-manageLibraries { - background: url('../img/icons/ManageLibraries.png') no-repeat !important; - height:16px; - width:16px; -} - .ui-icon-copy { background: url('../img/icons/Copy.png') no-repeat !important; height:16px; @@ -197,4 +185,17 @@ background: url('../img/icons/Delete.png') no-repeat !important; height:16px; width:16px; -} \ No newline at end of file +} + +.ui-icon-reload { + background: url('../img/icons/Reload.png') no-repeat !important; + height:32px; + width:32px; +} + +.ui-icon-reloadSmall { + background: url('../img/icons/ReloadSmall.png') no-repeat !important; + height:16px; + width:16px; +} + diff --git a/Kieker.WebGUI/src/main/webapp/css/LoginPage.css b/Kieker.WebGUI/src/main/webapp/css/LoginPage.css index ad91576c9380660aed452a07de58117c4e296bfb..d6febd73c41c12edb1818376cf9424e5ebb5c2c5 100644 --- a/Kieker.WebGUI/src/main/webapp/css/LoginPage.css +++ b/Kieker.WebGUI/src/main/webapp/css/LoginPage.css @@ -1,37 +1,37 @@ @charset "UTF-8"; -.ui-panel { - font-size: 12px; -} - -.col1 { +.login-form-col-1 { width: fit-content !important; text-align: right; } -.col2 { +.login-form-col-2 { width: 100% !important; } -.input { +.login-form-input { width: 100% !important; } -.grid { +.login-form-grid { width: 100% !important; } -.login-panel { +.login-form-panel { width: 50%; text-align: center; } -.hint-panel { +.login-form-hint-panel { width: 50%; text-align: center; font-size: 11px; } +.ui-panel { + font-size: 12px; +} + .ui-growl { width: 500px } diff --git a/Kieker.WebGUI/src/main/webapp/css/ProjectOverviewPage.css b/Kieker.WebGUI/src/main/webapp/css/ProjectOverviewPage.css index f506fa1678f29f8b3f45185ef6bcaff2a5c686f4..babbf995cea84bc253495ad4a68adc9b64d2df8c 100644 --- a/Kieker.WebGUI/src/main/webapp/css/ProjectOverviewPage.css +++ b/Kieker.WebGUI/src/main/webapp/css/ProjectOverviewPage.css @@ -1,9 +1,66 @@ @charset "UTF-8"; +.import-dialog-col-1 { + width: fit-content !important; + text-align: right; +} + +.import-dialog-col-2 { + +} + .ui-datatable-header { font-size: 12px; } .ui-datatable-footer { - font-size: 12px; + font-size: 12px; +} + +.ui-layout-center { + border-style: none !important; +} + +/* The following code is for icon definition. */ + +.ui-icon-newProjectSmall { + background: url('../img/icons/NewProjectSmall.png') no-repeat !important; + height:16px; + width:16px; +} + +.ui-icon-newProject { + background: url('../img/icons/NewProject.png') no-repeat !important; + height:32px; + width:32px; +} + +.ui-icon-importProject { + background: url('../img/icons/ImportProject.png') no-repeat !important; + height:32px; + width:32px; +} + +.ui-icon-importProjectSmall { + background: url('../img/icons/ImportProjectSmall.png') no-repeat !important; + height:16px; + width:16px; +} + +.ui-icon-copyProject { + background: url('../img/icons/CopyProject.png') no-repeat !important; + height:16px; + width:16px; +} + +.ui-icon-renameProject { + background: url('../img/icons/RenameProject.png') no-repeat !important; + height:16px; + width:16px; +} + +.ui-icon-deleteProject { + background: url('../img/icons/DeleteProject.png') no-repeat !important; + height:16px; + width:16px; } \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/webapp/dialogs/ProjectOverviewPageDialogs.xhtml b/Kieker.WebGUI/src/main/webapp/dialogs/ProjectOverviewPageDialogs.xhtml index 99ea950a06fa19bfa7eebabbdcb51299135eff0b..1e41117ee535cc0ecaa06e249709b5cd19fcf2a0 100644 --- a/Kieker.WebGUI/src/main/webapp/dialogs/ProjectOverviewPageDialogs.xhtml +++ b/Kieker.WebGUI/src/main/webapp/dialogs/ProjectOverviewPageDialogs.xhtml @@ -24,6 +24,8 @@ </p:dialog> <!-- ******************************************************************************** --> + <!-- ******************************************************************************** --> + <!-- This is the dialog to rename a project. --> <p:dialog id="renameProjectDlg" header="#{localizedProjectOverviewMessages.renameProject}" resizable="false" modal="true" widgetVar="renameProjectDialog"> <!-- Make sure that closing of the dialog also clears the input field. --> <p:ajax event="close" update="renameProjectDialogForm:renameProjectInputText" /> @@ -40,7 +42,10 @@ </div> </h:form> </p:dialog> + <!-- ******************************************************************************** --> + <!-- ******************************************************************************** --> + <!-- This is the dialog to delete a project. --> <p:dialog id="deleteProjectDlg" header="#{localizedProjectOverviewMessages.deleteProject}" resizable="false" modal="true" widgetVar="deleteProjectDialog"> <h:form id="deleteProjectDialogForm"> @@ -54,7 +59,10 @@ </div> </h:form> </p:dialog> + <!-- ******************************************************************************** --> + <!-- ******************************************************************************** --> + <!-- This is the dialog to copy a project. --> <p:dialog id="copyProjectDlg" header="#{localizedProjectOverviewMessages.copyProject}" resizable="false" modal="true" widgetVar="copyProjectDialog"> <!-- Make sure that closing of the dialog also clears the input field. --> <p:ajax event="close" update="copyProjectDialogForm:copyProjectDialogInputText" /> @@ -71,37 +79,28 @@ </div> </h:form> </p:dialog> + <!-- ******************************************************************************** --> - <p:dialog header="Save Project" resizable="false" modal="true" widgetVar="forceSaveDlg"> - <h:form> - <div style="text-align: center"> - <h:outputText value="The project has been modified externally in the meanwhile. Do you want to overwrite the changes?" /> - </div> - <hr/> - <div style="text-align: right"> - <p:commandButton value="Yes" action="#{currentCockpitEditorBean.saveProject(true)}" oncomplete="forceSaveDlg.hide()" update=":messages" /> - <p:spacer width="10px" height="10" /> - <p:commandButton value="Cancel" onclick="forceSaveDlg.hide()" /> - </div> - </h:form> - </p:dialog> - + <!-- ******************************************************************************** --> + <!-- This is the dialog to import a project. --> <p:dialog id="importProjectDlg" header="#{localizedProjectOverviewMessages.importProject}" resizable="false" modal="true" widgetVar="importProjectDialog"> <!-- Make sure that closing of the dialog also clears the input field. --> <p:ajax event="close" update="importProjectDialogForm:newProjectInputText" /> <h:form id="importProjectDialogForm" enctype="multipart/form-data"> - <div style="text-align: left"> + <h:panelGrid columnClasses="import-dialog-col-1, import-dialog-col-2" styleClass="login-form-grid" columns="2" cellpadding="5" > <h:outputText value="#{localizedProjectOverviewMessages.name}: " /> - <p:inputText id="newProjectInputText" value="#{stringBean.string}" style="width: 95%" /> - <br/> <br/> - <p:fileUpload allowTypes="kax" mode="simple" value="#{uploadFileBean.file}"/> - </div> + <p:inputText id="newProjectInputText" value="#{stringBean.string}" /> + <h:outputText value="#{localizedProjectOverviewMessages.file}: " /> + <p:fileUpload allowTypes="kax" mode="simple" value="#{uploadFileBean.file}"/> + </h:panelGrid> <hr/> <div style="text-align: right"> <p:commandButton value="#{localizedMessages.ok}" update=":projectsListForm :messages" action="#{projectsBean.uploadProject(stringBean.string, uploadFileBean.file, currentProjectOverviewBean, userBean)}" ajax="false" oncomplete="importProjectDialog.hide()" /> </div> </h:form> </p:dialog> + <!-- ******************************************************************************** --> + </ui:composition> \ No newline at end of file diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/CopyProject.png b/Kieker.WebGUI/src/main/webapp/img/icons/CopyProject.png new file mode 100644 index 0000000000000000000000000000000000000000..c7f287c47e2e4f05b95781f0059212e25ecc4f73 Binary files /dev/null and b/Kieker.WebGUI/src/main/webapp/img/icons/CopyProject.png differ diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/DeleteProject.png b/Kieker.WebGUI/src/main/webapp/img/icons/DeleteProject.png new file mode 100644 index 0000000000000000000000000000000000000000..a546aad5eab4f6668e5daefabc07e11e6a483484 Binary files /dev/null and b/Kieker.WebGUI/src/main/webapp/img/icons/DeleteProject.png differ diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/ImportProject.png b/Kieker.WebGUI/src/main/webapp/img/icons/ImportProject.png index 1279be4f8df032f4f93395f70ef9fa87fd001920..a29d2103e2793e548afd5ee04f3a502ad034af9a 100644 Binary files a/Kieker.WebGUI/src/main/webapp/img/icons/ImportProject.png and b/Kieker.WebGUI/src/main/webapp/img/icons/ImportProject.png differ diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/ImportProjectSmall.png b/Kieker.WebGUI/src/main/webapp/img/icons/ImportProjectSmall.png new file mode 100644 index 0000000000000000000000000000000000000000..f97a121d48058e85664303edf0aac817028b5a30 Binary files /dev/null and b/Kieker.WebGUI/src/main/webapp/img/icons/ImportProjectSmall.png differ diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/ManageLibraries.png b/Kieker.WebGUI/src/main/webapp/img/icons/ManageLibraries.png index 7f06b149360c48b1aeada49f841fcf87db0c20fd..38cc1ddc88f4fc351980786048489cded4016ce0 100644 Binary files a/Kieker.WebGUI/src/main/webapp/img/icons/ManageLibraries.png and b/Kieker.WebGUI/src/main/webapp/img/icons/ManageLibraries.png differ diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/ManageLibrariesSmall.png b/Kieker.WebGUI/src/main/webapp/img/icons/ManageLibrariesSmall.png new file mode 100644 index 0000000000000000000000000000000000000000..7f06b149360c48b1aeada49f841fcf87db0c20fd Binary files /dev/null and b/Kieker.WebGUI/src/main/webapp/img/icons/ManageLibrariesSmall.png differ diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/NewProject.png b/Kieker.WebGUI/src/main/webapp/img/icons/NewProject.png index 2ddf3bf9c96c5e53d5531866cfef0766fbb5b39f..c39a62f447089f3c7c95bce9a1d69152d7c95cc3 100644 Binary files a/Kieker.WebGUI/src/main/webapp/img/icons/NewProject.png and b/Kieker.WebGUI/src/main/webapp/img/icons/NewProject.png differ diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/NewProjectSmall.png b/Kieker.WebGUI/src/main/webapp/img/icons/NewProjectSmall.png new file mode 100644 index 0000000000000000000000000000000000000000..2ddf3bf9c96c5e53d5531866cfef0766fbb5b39f Binary files /dev/null and b/Kieker.WebGUI/src/main/webapp/img/icons/NewProjectSmall.png differ diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/Reload.png b/Kieker.WebGUI/src/main/webapp/img/icons/Reload.png index 494964cc71d2c52576356eaf6fb74f4c7f166990..620b3233cd2c2df95541599efb0d1ef4df651ca8 100644 Binary files a/Kieker.WebGUI/src/main/webapp/img/icons/Reload.png and b/Kieker.WebGUI/src/main/webapp/img/icons/Reload.png differ diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/ReloadSmall.png b/Kieker.WebGUI/src/main/webapp/img/icons/ReloadSmall.png new file mode 100644 index 0000000000000000000000000000000000000000..494964cc71d2c52576356eaf6fb74f4c7f166990 Binary files /dev/null and b/Kieker.WebGUI/src/main/webapp/img/icons/ReloadSmall.png differ diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/RenameProject.png b/Kieker.WebGUI/src/main/webapp/img/icons/RenameProject.png new file mode 100644 index 0000000000000000000000000000000000000000..2d223bb3063ba8c5736ce788519d664a399dc107 Binary files /dev/null and b/Kieker.WebGUI/src/main/webapp/img/icons/RenameProject.png differ diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/Save.png b/Kieker.WebGUI/src/main/webapp/img/icons/Save.png index 76613eca1233548d23d83e418273aaf0c65b299e..599a230e3b01595874c8cbd969d7cf7405c87d94 100644 Binary files a/Kieker.WebGUI/src/main/webapp/img/icons/Save.png and b/Kieker.WebGUI/src/main/webapp/img/icons/Save.png differ diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/SaveAs.png b/Kieker.WebGUI/src/main/webapp/img/icons/SaveAs.png index 76613eca1233548d23d83e418273aaf0c65b299e..599a230e3b01595874c8cbd969d7cf7405c87d94 100644 Binary files a/Kieker.WebGUI/src/main/webapp/img/icons/SaveAs.png and b/Kieker.WebGUI/src/main/webapp/img/icons/SaveAs.png differ diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/SaveAsSmall.png b/Kieker.WebGUI/src/main/webapp/img/icons/SaveAsSmall.png new file mode 100644 index 0000000000000000000000000000000000000000..76613eca1233548d23d83e418273aaf0c65b299e Binary files /dev/null and b/Kieker.WebGUI/src/main/webapp/img/icons/SaveAsSmall.png differ diff --git a/Kieker.WebGUI/src/main/webapp/img/icons/SaveSmall.png b/Kieker.WebGUI/src/main/webapp/img/icons/SaveSmall.png new file mode 100644 index 0000000000000000000000000000000000000000..76613eca1233548d23d83e418273aaf0c65b299e Binary files /dev/null and b/Kieker.WebGUI/src/main/webapp/img/icons/SaveSmall.png differ diff --git a/Kieker.WebGUI/src/main/webapp/pages/AnalysisEditorPage.xhtml b/Kieker.WebGUI/src/main/webapp/pages/AnalysisEditorPage.xhtml index bf71a7c53eebf2c28e77230c00fde30f50c0b4eb..5b59138313b029b53b4f392c6313f9309ade07ee 100644 --- a/Kieker.WebGUI/src/main/webapp/pages/AnalysisEditorPage.xhtml +++ b/Kieker.WebGUI/src/main/webapp/pages/AnalysisEditorPage.xhtml @@ -96,14 +96,14 @@ <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:menuitem styleClass="element-with-whitespace" icon="ui-icon-saveSmall" value=" #{localizedMessages.saveProject}" ajax="true" onstart="preSaveProject(false)" disabled="#{empty currentAnalysisEditorBean.project}"/> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-saveAsSmall" 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:menuitem styleClass="element-with-whitespace" icon="ui-icon-reloadSmall" 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:menuitem styleClass="element-with-whitespace" icon="ui-icon-manageLibrariesSmall" 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"/> @@ -128,6 +128,14 @@ <ui:define name="furtherMenuBar"> <p:spacer height="5"/> <p:menubar> + <p:menuitem id="b1" styleClass="element-with-whitespace" icon="ui-icon-save" ajax="true" onstart="preSaveProject(false)" disabled="#{empty currentAnalysisEditorBean.project}"/> + <!-- A dummy item as a separator between the items. --> + <p:menuitem style="width: 15px" disabled="true"/> + + <p:menuitem id="b2" styleClass="element-with-whitespace" icon="ui-icon-manageLibraries" onclick="manageLibrariesDialog.show()" ajax="true" disabled="#{empty currentAnalysisEditorBean.project}"/> + <!-- A dummy item as a separator between the items. --> + <p:menuitem style="width: 15px" disabled="true"/> + <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"/> diff --git a/Kieker.WebGUI/src/main/webapp/pages/CockpitEditorPage.xhtml b/Kieker.WebGUI/src/main/webapp/pages/CockpitEditorPage.xhtml index 594ed95d7ea1cd95f63901cb81bbdea006c062df..50bb316ac26c8c34f34f2c20a2a87509efacb1e9 100644 --- a/Kieker.WebGUI/src/main/webapp/pages/CockpitEditorPage.xhtml +++ b/Kieker.WebGUI/src/main/webapp/pages/CockpitEditorPage.xhtml @@ -37,15 +37,6 @@ </h:form> </ui:define> - <ui:define name="js"> - <!-- This javascript code will be executed in the onload-part of the body and shows a localized message via the growl-component. --> - <script> - bodyLoaded = function() { - msgs.renderMessage({summary: '#{localizedCockpitEditorPageMessages.msgCockpitEditorWelcomeShort}', detail: '#{localizedCockpitEditorPageMessages.msgCockpitEditorWelcome}', severity: 'info'}); - } - </script> - </ui:define> - <!-- Those are the menu bar entries left from the help-submenu. --> <ui:define name="furtherMenuBarEntries"> <p:submenu label="#{localizedMessages.file}"> diff --git a/Kieker.WebGUI/src/main/webapp/pages/CockpitPage.xhtml b/Kieker.WebGUI/src/main/webapp/pages/CockpitPage.xhtml index 9a311551aecf3b608f9e71c2bf21e7033c919e58..814f33f2b9c63208b5393bf6f2c510637e96b089 100644 --- a/Kieker.WebGUI/src/main/webapp/pages/CockpitPage.xhtml +++ b/Kieker.WebGUI/src/main/webapp/pages/CockpitPage.xhtml @@ -31,15 +31,6 @@ <link rel="stylesheet" type="text/css" href="#{root}/css/CockpitPage.css" /> </ui:define> - <ui:define name="js"> - <!-- This javascript code will be executed in the onload-part of the body and shows a localized message via the growl-component. --> - <script> - bodyLoaded = function() { - msgs.renderMessage({summary : '#{localizedCockpitPageMessages.msgCockpitWelcomeShort}', detail : '#{localizedCockpitPageMessages.msgCockpitWelcome}', severity: 'info'}); - } - </script> - </ui:define> - <!-- Those are the menu bar entries left from the help-submenu. --> <ui:define name="furtherMenuBarEntries"> <p:submenu label="#{localizedMessages.file}"> @@ -90,6 +81,9 @@ <h:graphicImage url="#{currentCockpitBean.isAnalysisRunning() ? '../img/LEDs/Icon_LED_Green.png' : '../img/LEDs/Icon_LED_Gray.png'}" height="50px"/> <h:outputText value="#{localizedMessages.stateRunning}"/> + <h:graphicImage url="#{currentCockpitBean.isAnalysisTerminating() ? '../img/LEDs/Icon_LED_Yellow.png' : '../img/LEDs/Icon_LED_Gray.png'}" height="50px"/> + <h:outputText value="#{localizedMessages.stateTerminating}"/> + <h:graphicImage url="#{currentCockpitBean.isAnalysisTerminated() ? '../img/LEDs/Icon_LED_Red.png' : '../img/LEDs/Icon_LED_Gray.png'}" height="50px"/> <h:outputText value="#{localizedMessages.stateTerminated}"/> diff --git a/Kieker.WebGUI/src/main/webapp/pages/ControllerPage.xhtml b/Kieker.WebGUI/src/main/webapp/pages/ControllerPage.xhtml index f2a20143a19af5be9f05681a978f2a577ddfe9b5..8db919a9f2862f11e5613a59c6a5ffaf763aa847 100644 --- a/Kieker.WebGUI/src/main/webapp/pages/ControllerPage.xhtml +++ b/Kieker.WebGUI/src/main/webapp/pages/ControllerPage.xhtml @@ -96,6 +96,9 @@ <h:graphicImage url="#{currentControllerBean.isAnalysisRunning() ? '../img/LEDs/Icon_LED_Green.png' : '../img/LEDs/Icon_LED_Gray.png'}" height="50px"/> <h:outputText value="#{localizedMessages.stateRunning}"/> + <h:graphicImage url="#{currentControllerBean.isAnalysisTerminating() ? '../img/LEDs/Icon_LED_Yellow.png' : '../img/LEDs/Icon_LED_Gray.png'}" height="50px"/> + <h:outputText value="#{localizedMessages.stateTerminating}"/> + <h:graphicImage url="#{currentControllerBean.isAnalysisTerminated() ? '../img/LEDs/Icon_LED_Red.png' : '../img/LEDs/Icon_LED_Gray.png'}" height="50px"/> <h:outputText value="#{localizedMessages.stateTerminated}"/> diff --git a/Kieker.WebGUI/src/main/webapp/pages/ProjectOverviewPage.xhtml b/Kieker.WebGUI/src/main/webapp/pages/ProjectOverviewPage.xhtml index fe10ce65233cba6e9574835cc695637cfa3c8466..ef884c85cf88d24dc9a1d0ce1f079f07af98bf6a 100644 --- a/Kieker.WebGUI/src/main/webapp/pages/ProjectOverviewPage.xhtml +++ b/Kieker.WebGUI/src/main/webapp/pages/ProjectOverviewPage.xhtml @@ -12,33 +12,51 @@ <h:body> <ui:composition template="/templates/PagesTemplate.xhtml"> - <ui:param name="unsavedModifications" value="false"/> + <!-- Those are parameters of the page. They are mostly used by the underlying template pages. --> <ui:param name="projectName" value="#{currentProjectOverviewBean.projectName}"/> + <ui:param name="unsavedModifications" value="false"/> <ui:param name="pagename" value="projectOverview"/> <ui:param name="showProjectName" value="false"/> + <!-- Import the localized strings. --> <ui:define name="bundleIncludes"> <f:loadBundle var="localizedProjectOverviewMessages" basename="lang.ProjectOverviewPage"/> </ui:define> + <!-- Import the CSS file for this page. --> <ui:define name="cssIncludes"> <link rel="stylesheet" type="text/css" href="#{root}/css/ProjectOverviewPage.css" /> </ui:define> - <!-- Those are the menu bar entries left from the help-submenu. --> + <!-- Those are the menu bar entries left from the help menu. --> <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-newProject" value=" #{localizedProjectOverviewMessages.newProject}" onclick="newProjectDialog.show()" ajax="true"/> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-importProject" value=" #{localizedProjectOverviewMessages.importProject}" onclick="importProjectDialog.show()" ajax="true"/> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-newProjectSmall" value=" #{localizedProjectOverviewMessages.newProject}" onclick="newProjectDialog.show()" ajax="true"/> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-importProjectSmall" value=" #{localizedProjectOverviewMessages.importProject}" onclick="importProjectDialog.show()" ajax="true"/> <p:separator/> </c:if> - <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-reload" value=" #{localizedProjectOverviewMessages.refreshProjectsList}" update=":projectsListForm" action="#{currentProjectOverviewBean.updateAvailableProjects()}" ajax="true"/> + <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-reloadSmall" value=" #{localizedProjectOverviewMessages.refreshProjectsList}" update=":projectsListForm" action="#{currentProjectOverviewBean.updateAvailableProjects()}" ajax="true"/> <p:separator/> <p:menuitem styleClass="element-with-whitespace" icon="ui-icon-settings" value=" #{localizedMessages.settings}" onclick="settingsDlg.show()" ajax="true"/> </p:submenu> </ui:define> + <ui:define name="furtherMenuBar"> + <p:spacer height="5"/> + <p:menubar> + <p:menuitem id="btnNewProject" styleClass="element-with-whitespace" icon="ui-icon-newProject" onclick="newProjectDialog.show()" ajax="true" /> + <p:menuitem id="btnImportProject" styleClass="element-with-whitespace" icon="ui-icon-importProject" onclick="importProjectDialog.show()" ajax="true" /> + <!-- A dummy item as a separator between the items. --> + <p:menuitem style="width: 15px" disabled="true"/> + <p:menuitem id="btnReloadProjectList" styleClass="element-with-whitespace" icon="ui-icon-reload" update=":projectsListForm" action="#{currentProjectOverviewBean.updateAvailableProjects()}" ajax="true" /> + </p:menubar> + <p:tooltip for="btnNewProject" value="#{localizedProjectOverviewMessages.tooltipNewProject}"/> + <p:tooltip for="btnImportProject" value="#{localizedProjectOverviewMessages.tooltipImportProject}"/> + <p:tooltip for="btnReloadProjectList" value="#{localizedProjectOverviewMessages.tooltipReloadProjectsList}"/> + </ui:define> + + <!-- The central component contains the currently available projects. --> <ui:define name="centerContent"> <h:form id="projectsListForm"> <p:dataTable emptyMessage="#{localizedMessages.noRecordsFound}" rows="15" paginator="true" paginatorPosition="both" var="project" rowsPerPageTemplate="5,10,15,25,50" value="#{currentProjectOverviewBean.projects}" paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" selection="#{currentProjectOverviewBean.projectName}" rowKey="#{project}" selectionMode="single"> @@ -68,12 +86,13 @@ </p:menuitem> <c:if test="#{sec:areAnyGranted('User, Administrator')}"> <p:separator/> - <p:menuitem id="copyButton" icon="ui-icon-copy" styleClass="element-with-whitespace" value=" #{localizedProjectOverviewMessages.copyProject}" action="#{currentProjectOverviewBean.setProjectName(project)}" onclick="copyProjectDialog.show()" update=":messages"/> - <p:menuitem id="renameButton" icon="ui-icon-edit" styleClass="element-with-whitespace" value=" #{localizedProjectOverviewMessages.renameProject}" action="#{currentProjectOverviewBean.setProjectName(project)}" onclick="renameProjectDialog.show()" disabled="true" update=":messages"/> - <p:menuitem id="deleteButton" icon="ui-icon-delete" styleClass="element-with-whitespace" value=" #{localizedProjectOverviewMessages.deleteProject}" action="#{currentProjectOverviewBean.setProjectName(project)}" onclick="deleteProjectDialog.show()" update=":messages"/> + <p:menuitem id="copyButton" icon="ui-icon-copyProject" styleClass="element-with-whitespace" value=" #{localizedProjectOverviewMessages.copyProject}" action="#{currentProjectOverviewBean.setProjectName(project)}" onclick="copyProjectDialog.show()" update=":messages"/> + <p:menuitem id="renameButton" icon="ui-icon-renameProject" styleClass="element-with-whitespace" value=" #{localizedProjectOverviewMessages.renameProject}" action="#{currentProjectOverviewBean.setProjectName(project)}" onclick="renameProjectDialog.show()" disabled="true" update=":messages"/> + <p:menuitem id="deleteButton" icon="ui-icon-deleteProject" styleClass="element-with-whitespace" value=" #{localizedProjectOverviewMessages.deleteProject}" action="#{currentProjectOverviewBean.setProjectName(project)}" onclick="deleteProjectDialog.show()" update=":messages"/> </c:if> </p:menu> </p:column> + <p:column headerText="#{localizedProjectOverviewMessages.state}" style="text-align: center" sortBy="#{projectsBean.getAnalysisControllerState(project)}"> <h:outputText value="#{projectsBean.getAnalysisControllerState(project)}"/> </p:column>