diff --git a/build-monitor-acceptance/pom.xml b/build-monitor-acceptance/pom.xml
index 08a67e868..aefc67977 100644
--- a/build-monitor-acceptance/pom.xml
+++ b/build-monitor-acceptance/pom.xml
@@ -175,6 +175,26 @@
hamcrest-all
test
+
+ net.bytebuddy
+ byte-buddy
+ 1.9.10
+
+
+ org.eclipse.jetty.websocket
+ websocket-common
+ 9.4.10.v20180503
+
+
+ org.eclipse.jetty
+ jetty-io
+ 9.4.10.v20180503
+
+
+ org.eclipse.jetty
+ jetty-util
+ 9.4.10.v20180503
+
diff --git a/build-monitor-plugin/pom.xml b/build-monitor-plugin/pom.xml
index 024fa516a..f0b7c43aa 100644
--- a/build-monitor-plugin/pom.xml
+++ b/build-monitor-plugin/pom.xml
@@ -122,7 +122,7 @@
org.jenkins-ci.modules
instance-identity
- 2.1
+ 2.2
provided
@@ -236,7 +236,12 @@
commons-io
commons-io
- 2.4
+ 2.6
+
+
+ commons-beanutils
+ commons-beanutils
+ 1.9.3
com.github.detro.ghostdriver
diff --git a/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorDescriptor.java b/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorDescriptor.java
index b58a4931c..cdaae2983 100644
--- a/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorDescriptor.java
+++ b/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorDescriptor.java
@@ -35,6 +35,34 @@ public FormValidation doCheckIncludeRegex(@QueryParameter String value) {
return FormValidation.ok();
}
+ @SuppressWarnings("unused") // used in the configure-entries.jelly form
+ public FormValidation doCheckFontSize(@QueryParameter String value) {
+ try {
+ float val = Float.parseFloat(value);
+ if (val >= 0.3 && val <= 2) {
+ return FormValidation.ok();
+ } else {
+ return FormValidation.error("Must be >= 0.3 and <= 2");
+ }
+ } catch (NumberFormatException e) {
+ return FormValidation.error("Must be float");
+ }
+ }
+
+ @SuppressWarnings("unused") // used in the configure-entries.jelly form
+ public FormValidation doCheckNumberOfColumns(@QueryParameter String value) {
+ try {
+ int val = Integer.parseInt(value);
+ if (val >= 1 && val <= 8) {
+ return FormValidation.ok();
+ } else {
+ return FormValidation.error("Must be >= 1 and <= 8");
+ }
+ } catch (NumberFormatException e) {
+ return FormValidation.error("Must be integer");
+ }
+ }
+
@Override
public boolean configure(StaplerRequest req, JSONObject json) throws FormException {
req.bindJSON(this, json.getJSONObject("build-monitor"));
@@ -53,4 +81,4 @@ public boolean getPermissionToCollectAnonymousUsageStatistics() {
public void setPermissionToCollectAnonymousUsageStatistics(boolean collect) {
this.permissionToCollectAnonymousUsageStatistics = collect;
}
-}
\ No newline at end of file
+}
diff --git a/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorView.java b/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorView.java
index 12e065443..3364f07e4 100644
--- a/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorView.java
+++ b/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorView.java
@@ -85,7 +85,7 @@ public String getCsrfCrumbFieldName() {
public String currentOrder() {
return currentConfig().getOrder().getClass().getSimpleName();
}
-
+
@SuppressWarnings("unused") // used in the configure-entries.jelly form
public String currentbuildFailureAnalyzerDisplayedField() {
return currentConfig().getBuildFailureAnalyzerDisplayedField().getValue();
@@ -96,6 +96,26 @@ public boolean isDisplayCommitters() {
return currentConfig().shouldDisplayCommitters();
}
+ @SuppressWarnings("unused") // used in the configure-entries.jelly form
+ public String currentFontSize() {
+ return String.valueOf(currentConfig().getFontSize());
+ }
+
+ @SuppressWarnings("unused") // used in the configure-entries.jelly form
+ public String currentNumberOfColumns() {
+ return String.valueOf(currentConfig().getNumberOfColumns());
+ }
+
+ @SuppressWarnings("unused") // used in the configure-entries.jelly form
+ public boolean isColourBlindMode() {
+ return currentConfig().isColourBlindMode();
+ }
+
+ @SuppressWarnings("unused") // used in the configure-entries.jelly form
+ public String getColourBlindModeValue() {
+ return isColourBlindMode() ? "1" : "0";
+ }
+
private static final BuildMonitorInstallation installation = new BuildMonitorInstallation();
@SuppressWarnings("unused") // used in index.jelly
@@ -121,7 +141,9 @@ protected void submit(StaplerRequest req) throws ServletException, IOException,
currentConfig().setDisplayCommitters(json.optBoolean("displayCommitters", true));
currentConfig().setBuildFailureAnalyzerDisplayedField(req.getParameter("buildFailureAnalyzerDisplayedField"));
-
+ submitFontSize(req);
+ submitNumberOfColumns(req);
+ submitColourBlindMode(req);
try {
currentConfig().setOrder(orderIn(requestedOrdering));
} catch (Exception e) {
@@ -130,12 +152,42 @@ protected void submit(StaplerRequest req) throws ServletException, IOException,
}
}
+ private void submitFontSize(StaplerRequest req) throws FormException {
+ String fontSize = req.getParameter("fontSize");
+ try {
+ float val = Float.parseFloat(fontSize);
+ if (val >= 0.3 && val <= 2) {
+ currentConfig().setFontSize(val);
+ }
+ } catch (NumberFormatException e) {
+ throw new FormException("Font size must be float and not null", fontSize);
+ }
+ }
+
+
+ private void submitNumberOfColumns(StaplerRequest req) throws FormException {
+ String numberOfColumns = req.getParameter("numberOfColumns");
+ try {
+ int val = Integer.parseInt(numberOfColumns);
+ if (val >= 1 && val <= 8) {
+ currentConfig().setNumberOfColumns(val);
+ }
+ } catch (NumberFormatException e) {
+ throw new FormException("Number of columns must be integer and not null", numberOfColumns);
+ }
+ }
+
+ private void submitColourBlindMode(StaplerRequest req) throws FormException {
+ String colourBlindMode = req.getParameter("colourBlindMode");
+ currentConfig().setColourBlindMode(isGiven(colourBlindMode));
+ }
+
/**
* Because of how org.kohsuke.stapler.HttpResponseRenderer is implemented
* it can only work with net.sf.JSONObject in order to produce correct application/json output
*
* @return Json representation of JobViews
- * @throws Exception
+ * @throws Exception description
*/
@JavaScriptMethod
public JSONObject fetchJobViews() throws Exception {
@@ -196,7 +248,7 @@ private boolean deserailisingFromAnOlderFormat() {
// If an older version of config.xml is loaded, "config" field is missing, but "order" is present
private void migrateFromOldToNewConfigFormat() {
- Config c = new Config();
+ Config c = Config.defaultConfig();
c.setOrder(order);
config = c;
@@ -214,4 +266,4 @@ private void migrateFromOldToNewConfigFormat() {
@Deprecated // use Config instead
private Comparator> order; // note: this field can be removed when people stop using versions prior to 1.6+build.150
-}
\ No newline at end of file
+}
diff --git a/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/Config.java b/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/Config.java
index c10b3296f..2e1bbeb54 100644
--- a/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/Config.java
+++ b/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/Config.java
@@ -14,7 +14,11 @@ public class Config {
private BuildFailureAnalyzerDisplayedField buildFailureAnalyzerDisplayedField;
public static Config defaultConfig() {
- return new Config();
+ Config config = new Config();
+ config.setFontSize(1);
+ config.setNumberOfColumns(2);
+ config.setColourBlindMode(false);
+ return config;
}
public Comparator> getOrder() {
@@ -32,7 +36,31 @@ public static Config defaultConfig() {
public void setOrder(Comparator> order) {
this.order = order;
}
-
+
+ public float getFontSize() {
+ return fontSize;
+ }
+
+ public void setFontSize(float fontSize) {
+ this.fontSize = fontSize;
+ }
+
+ public int getNumberOfColumns() {
+ return numberOfColumns;
+ }
+
+ public void setNumberOfColumns(int numberOfColumns) {
+ this.numberOfColumns = numberOfColumns;
+ }
+
+ public boolean isColourBlindMode() {
+ return colourBlindMode;
+ }
+
+ public void setColourBlindMode(boolean colourBlindMode) {
+ this.colourBlindMode = colourBlindMode;
+ }
+
public BuildFailureAnalyzerDisplayedField getBuildFailureAnalyzerDisplayedField() {
return getOrElse(buildFailureAnalyzerDisplayedField, BuildFailureAnalyzerDisplayedField.Name);
}
@@ -75,4 +103,11 @@ public enum BuildFailureAnalyzerDisplayedField {
}
private Comparator> order;
-}
\ No newline at end of file
+
+ private float fontSize;
+
+ private int numberOfColumns;
+
+ private boolean colourBlindMode;
+
+}
diff --git a/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/functions/NullSafety.java b/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/functions/NullSafety.java
index 04eb55cef..02fb1e86b 100644
--- a/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/functions/NullSafety.java
+++ b/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/functions/NullSafety.java
@@ -5,6 +5,7 @@ public class NullSafety {
/**
* @param value a value that can be a potential null
* @param defaultValue a default to be returned if the value is null
+ * @param a type
*
* @return either value or defaultValue
*/
diff --git a/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/installation/BuildMonitorInstallation.java b/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/installation/BuildMonitorInstallation.java
index 672945b88..5d2dabff2 100644
--- a/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/installation/BuildMonitorInstallation.java
+++ b/build-monitor-plugin/src/main/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/installation/BuildMonitorInstallation.java
@@ -22,6 +22,7 @@ public BuildMonitorInstallation(StaticJenkinsAPIs jenkinsAPIs) {
/**
* Used to make sure that the anonymous Build Monitor stats are not double-counted,
* as in a typical setup there's one Jenkins, but multiple Build Monitors.
+ * @return anonymous Correlation Id
*/
public String anonymousCorrelationId() {
// we only need to calculate this once
@@ -48,4 +49,4 @@ public Audience audience() {
public String buildMonitorVersion() {
return buildProperties.get("version");
}
-}
\ No newline at end of file
+}
diff --git a/build-monitor-plugin/src/main/resources/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorView/configure-entries.jelly b/build-monitor-plugin/src/main/resources/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorView/configure-entries.jelly
index 3c39f5625..2e76a79ae 100644
--- a/build-monitor-plugin/src/main/resources/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorView/configure-entries.jelly
+++ b/build-monitor-plugin/src/main/resources/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorView/configure-entries.jelly
@@ -67,6 +67,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
@@ -98,4 +110,4 @@
}());
-
\ No newline at end of file
+
diff --git a/build-monitor-plugin/src/main/resources/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorView/index.jelly b/build-monitor-plugin/src/main/resources/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorView/index.jelly
index cff998f43..828632115 100644
--- a/build-monitor-plugin/src/main/resources/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorView/index.jelly
+++ b/build-monitor-plugin/src/main/resources/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorView/index.jelly
@@ -190,6 +190,9 @@
constant('BUILD_MONITOR_VERSION', '${it.installation.buildMonitorVersion()}').
constant('CSRF_CRUMB_FIELD_NAME', '${it.csrfCrumbFieldName}').
+ constant('DEFAULT_SETTINGS_FONTSIZE', '${it.currentFontSize()}').
+ constant('DEFAULT_SETTINGS_NUMBEROFCOLUMNS', '${it.currentNumberOfColumns()}').
+ constant('DEFAULT_SETTINGS_COLOURBLINDMODE', '${it.getColourBlindModeValue()}').
config(function(proxyProvider, cookieJarProvider, hashCodeProvider) {
var hashCodeOf = hashCodeProvider.hashCodeOf;
diff --git a/build-monitor-plugin/src/main/webapp/scripts/settings.js b/build-monitor-plugin/src/main/webapp/scripts/settings.js
index 39198a01c..4e6ba735d 100644
--- a/build-monitor-plugin/src/main/webapp/scripts/settings.js
+++ b/build-monitor-plugin/src/main/webapp/scripts/settings.js
@@ -2,12 +2,15 @@ angular.
module('buildMonitor.settings', [ 'buildMonitor.services', 'rzModule']).
controller('controlPanel', ['$scope', 'cookieJar', 'townCrier',
- function ($scope, cookieJar, townCrier) {
+ 'DEFAULT_SETTINGS_FONTSIZE', 'DEFAULT_SETTINGS_NUMBEROFCOLUMNS',
+ 'DEFAULT_SETTINGS_COLOURBLINDMODE',
+ function ($scope, cookieJar, townCrier, DEFAULT_SETTINGS_FONTSIZE,
+ DEFAULT_SETTINGS_NUMBEROFCOLUMNS, DEFAULT_SETTINGS_COLOURBLINDMODE) {
'use strict';
- $scope.settings.fontSize = cookieJar.get('fontSize', 1);
- $scope.settings.numberOfColumns = cookieJar.get('numberOfColumns', 2);
- $scope.settings.colourBlind = cookieJar.get('colourBlind', 0);
+ $scope.settings.fontSize = cookieJar.get('fontSize', DEFAULT_SETTINGS_FONTSIZE);
+ $scope.settings.numberOfColumns = cookieJar.get('numberOfColumns', DEFAULT_SETTINGS_NUMBEROFCOLUMNS);
+ $scope.settings.colourBlind = cookieJar.get('colourBlind', DEFAULT_SETTINGS_COLOURBLINDMODE);
$scope.settings.reduceMotion = cookieJar.get('reduceMotion', 0);
$scope.settings.showBadges = cookieJar.get('showBadges', 0);
@@ -21,4 +24,4 @@ angular.
townCrier.uponNewVersion(function() {
$scope.newVersionAvailable = true;
});
- }]);
\ No newline at end of file
+ }]);
diff --git a/build-monitor-plugin/src/test/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorDescriptorTest.java b/build-monitor-plugin/src/test/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorDescriptorTest.java
index 4d1028b16..73d842803 100644
--- a/build-monitor-plugin/src/test/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorDescriptorTest.java
+++ b/build-monitor-plugin/src/test/java/com/smartcodeltd/jenkinsci/plugins/buildmonitor/BuildMonitorDescriptorTest.java
@@ -40,6 +40,68 @@ public void form_validator_should_advise_how_a_regex_could_be_improved() throws
assertThat(htmlDecoded(result.getMessage()), containsString("Unmatched closing ')'"));
}
+ @Test
+ public void form_validator_should_allow_fontsize_in_good_range() throws Exception {
+ FormValidation result = validator.doCheckFontSize("1.0");
+
+ assertThat(result.kind, is(OK));
+ }
+
+ @Test
+ public void form_validator_should_refuse_fontsize_under_0_3() throws Exception {
+ FormValidation result = validator.doCheckFontSize("0");
+
+ assertThat(result.kind, is(ERROR));
+ assertThat(htmlDecoded(result.getMessage()), containsString("Must be >= 0.3 and <= 2"));
+ }
+
+ @Test
+ public void form_validator_should_refuse_fontsize_over_2() throws Exception {
+ FormValidation result = validator.doCheckFontSize("2.1");
+
+ assertThat(result.kind, is(ERROR));
+ assertThat(htmlDecoded(result.getMessage()), containsString("Must be >= 0.3 and <= 2"));
+ }
+
+ @Test
+ public void form_validator_should_refuse_fontsize_not_float() throws Exception {
+ FormValidation result = validator.doCheckFontSize("a");
+
+ assertThat(result.kind, is(ERROR));
+ assertThat(htmlDecoded(result.getMessage()), containsString("Must be float"));
+ }
+
+ @Test
+ public void form_validator_should_allow_numberofcolumns_in_good_range() throws Exception {
+ FormValidation result = validator.doCheckNumberOfColumns("1");
+
+ assertThat(result.kind, is(OK));
+ }
+
+ @Test
+ public void form_validator_should_refuse_numberofcolumns_under_1() throws Exception {
+ FormValidation result = validator.doCheckNumberOfColumns("0");
+
+ assertThat(result.kind, is(ERROR));
+ assertThat(htmlDecoded(result.getMessage()), containsString("Must be >= 1 and <= 8"));
+ }
+
+ @Test
+ public void form_validator_should_refuse_numberofcolumns_over_8() throws Exception {
+ FormValidation result = validator.doCheckNumberOfColumns("10");
+
+ assertThat(result.kind, is(ERROR));
+ assertThat(htmlDecoded(result.getMessage()), containsString("Must be >= 1 and <= 8"));
+ }
+
+ @Test
+ public void form_validator_should_refuse_numberofcolumns_not_integer() throws Exception {
+ FormValidation result = validator.doCheckNumberOfColumns("a");
+
+ assertThat(result.kind, is(ERROR));
+ assertThat(htmlDecoded(result.getMessage()), containsString("Must be integer"));
+ }
+
private String htmlDecoded(String message) {
return StringEscapeUtils.unescapeHtml(message);
}
@@ -47,4 +109,4 @@ private String htmlDecoded(String message) {
private String itShouldAllow(String regex) {
return "should allow " + regex;
}
-}
\ No newline at end of file
+}
diff --git a/pom.xml b/pom.xml
index 0505ba3d6..b5fd520d8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,8 +4,8 @@
4.0.0
- 2.46.3
- 2.38
+ 2.164.3
+ 2.53
8
UTF-8
1.8
@@ -15,7 +15,7 @@
org.jenkins-ci.plugins
plugin
- 3.8
+ 3.47
build-monitor