You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by je...@apache.org on 2018/03/30 14:15:26 UTC

[geode] branch develop updated: GEODE-2321: Pulse application works incorrectly in some locales (#1661)

This is an automated email from the ASF dual-hosted git repository.

jensdeppe pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/develop by this push:
     new 03f6d27  GEODE-2321: Pulse application works incorrectly in some locales (#1661)
03f6d27 is described below

commit 03f6d272b15c5757001664331c99947b7e6c6a1e
Author: Jens Deppe <jd...@pivotal.io>
AuthorDate: Fri Mar 30 07:15:21 2018 -0700

    GEODE-2321: Pulse application works incorrectly in some locales (#1661)
    
    - Ensure that all number formatting is consistent. Formatting, as it exists,
      will be according to the US locale.
    - This also fixes GEODE-1409
---
 .../geode/tools/pulse/internal/data/PulseConstants.java  | 16 +++++++++++++---
 .../pulse/internal/service/ClusterDetailsService.java    |  6 ++----
 .../internal/service/ClusterMembersRGraphService.java    | 13 ++++++-------
 .../pulse/internal/service/ClusterRegionService.java     |  7 +++----
 .../pulse/internal/service/ClusterRegionsService.java    |  7 +++----
 .../internal/service/ClusterSelectedRegionService.java   | 15 +++++++--------
 .../pulse/internal/service/MemberDetailsService.java     |  9 +++------
 .../pulse/internal/service/MemberRegionsService.java     |  7 ++-----
 .../org/apache/geode/tools/pulse/tests/ui/PulseBase.java |  7 +++----
 9 files changed, 42 insertions(+), 45 deletions(-)

diff --git a/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/data/PulseConstants.java b/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/data/PulseConstants.java
index 73c2f66..66a16ba 100644
--- a/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/data/PulseConstants.java
+++ b/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/data/PulseConstants.java
@@ -17,6 +17,10 @@
 
 package org.apache.geode.tools.pulse.internal.data;
 
+import java.text.DecimalFormat;
+import java.text.NumberFormat;
+import java.util.Locale;
+
 import org.apache.logging.log4j.Level;
 
 public class PulseConstants {
@@ -51,9 +55,15 @@ public class PulseConstants {
   // Date pattern to be used in log messages
   public static final String PULSE_QUERY_HISTORY_DATE_PATTERN = "EEE, MMM dd yyyy, HH:mm:ss z";
 
-  // Decimal format pattern "###.##" and "0.0000"
-  public static final String DECIMAL_FORMAT_PATTERN = "###.##";
-  public static final String DECIMAL_FORMAT_PATTERN_2 = "0.0000";
+  // Use US locale so that number formatting remains consistent in the UI
+  public static DecimalFormat TWO_PLACE_DECIMAL_FORMAT =
+      (DecimalFormat) NumberFormat.getNumberInstance(Locale.US);
+  public static DecimalFormat FOUR_PLACE_DECIMAL_FORMAT =
+      (DecimalFormat) NumberFormat.getNumberInstance(Locale.US);
+  static {
+    TWO_PLACE_DECIMAL_FORMAT.applyPattern("###.##");
+    FOUR_PLACE_DECIMAL_FORMAT.applyPattern("0.0000");
+  }
 
   // DEFAULT VALUES
   public static final String GEMFIRE_DEFAULT_HOST = "localhost";
diff --git a/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/service/ClusterDetailsService.java b/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/service/ClusterDetailsService.java
index b700b07..bdafc1f 100644
--- a/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/service/ClusterDetailsService.java
+++ b/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/service/ClusterDetailsService.java
@@ -17,7 +17,7 @@
 
 package org.apache.geode.tools.pulse.internal.service;
 
-import java.text.DecimalFormat;
+import static org.apache.geode.tools.pulse.internal.data.PulseConstants.TWO_PLACE_DECIMAL_FORMAT;
 
 import javax.servlet.http.HttpServletRequest;
 
@@ -28,7 +28,6 @@ import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Service;
 
 import org.apache.geode.tools.pulse.internal.data.Cluster;
-import org.apache.geode.tools.pulse.internal.data.PulseConstants;
 import org.apache.geode.tools.pulse.internal.data.Repository;
 
 /**
@@ -87,9 +86,8 @@ public class ClusterDetailsService implements PulseService {
     responseJSON.put("totalRegions", cluster.getTotalRegionCount());
     Long heapSize = cluster.getTotalHeapSize();
 
-    DecimalFormat df2 = new DecimalFormat(PulseConstants.DECIMAL_FORMAT_PATTERN);
     Double heapS = heapSize.doubleValue() / 1024;
-    responseJSON.put("totalHeap", Double.valueOf(df2.format(heapS)));
+    responseJSON.put("totalHeap", TWO_PLACE_DECIMAL_FORMAT.format(heapS));
     responseJSON.put("functions", cluster.getRunningFunctionCount());
     responseJSON.put("uniqueCQs", cluster.getRegisteredCQCount());
     responseJSON.put("subscriptions", cluster.getSubscriptionCount());
diff --git a/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/service/ClusterMembersRGraphService.java b/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/service/ClusterMembersRGraphService.java
index cbd8f25..73648da 100644
--- a/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/service/ClusterMembersRGraphService.java
+++ b/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/service/ClusterMembersRGraphService.java
@@ -17,7 +17,8 @@
 
 package org.apache.geode.tools.pulse.internal.service;
 
-import java.text.DecimalFormat;
+import static org.apache.geode.tools.pulse.internal.data.PulseConstants.TWO_PLACE_DECIMAL_FORMAT;
+
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -32,7 +33,6 @@ import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Service;
 
 import org.apache.geode.tools.pulse.internal.data.Cluster;
-import org.apache.geode.tools.pulse.internal.data.PulseConstants;
 import org.apache.geode.tools.pulse.internal.data.Repository;
 
 /**
@@ -122,7 +122,6 @@ public class ClusterMembersRGraphService implements PulseService {
     ObjectNode data1 = mapper.createObjectNode();
     clusterTopologyJSON.put(this.DATA, data1);
     ArrayNode childHostArray = mapper.createArrayNode();
-    DecimalFormat df2 = new DecimalFormat(PulseConstants.DECIMAL_FORMAT_PATTERN);
 
     updateAlertLists(cluster);
 
@@ -160,13 +159,13 @@ public class ClusterMembersRGraphService implements PulseService {
         if (usedHeapSize > 0) {
           double heapUsage = (currentHeap.doubleValue() / usedHeapSize.doubleValue()) * 100;
 
-          memberData.put(this.MEMORY_USAGE, Double.valueOf(df2.format(heapUsage)));
+          memberData.put(this.MEMORY_USAGE, TWO_PLACE_DECIMAL_FORMAT.format(heapUsage));
         } else
           memberData.put(this.MEMORY_USAGE, 0);
 
         double currentCPUUsage = member.getCpuUsage();
 
-        memberData.put(this.CPU_USAGE, Double.valueOf(df2.format(currentCPUUsage)));
+        memberData.put(this.CPU_USAGE, TWO_PLACE_DECIMAL_FORMAT.format(currentCPUUsage));
         memberData.put(this.REGIONS, member.getMemberRegions().size());
         memberData.put(this.HOST, member.getHost());
         if ((member.getMemberPort() == null) || (member.getMemberPort().equals(""))) {
@@ -226,10 +225,10 @@ public class ClusterMembersRGraphService implements PulseService {
       }
       ObjectNode data = mapper.createObjectNode();
 
-      data.put(this.LOAD_AVG, Double.valueOf(df2.format(hostLoadAvg)));
+      data.put(this.LOAD_AVG, TWO_PLACE_DECIMAL_FORMAT.format(hostLoadAvg));
       data.put(this.SOCKETS, hostSockets);
       data.put(this.THREADS, hostNumThreads);
-      data.put(this.CPU_USAGE, Double.valueOf(df2.format(hostCpuUsage)));
+      data.put(this.CPU_USAGE, TWO_PLACE_DECIMAL_FORMAT.format(hostCpuUsage));
       data.put(this.MEMORY_USAGE, hostMemoryUsage);
 
       String hostNodeType;
diff --git a/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/service/ClusterRegionService.java b/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/service/ClusterRegionService.java
index d00c0f4..5457f76 100644
--- a/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/service/ClusterRegionService.java
+++ b/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/service/ClusterRegionService.java
@@ -17,7 +17,8 @@
 
 package org.apache.geode.tools.pulse.internal.service;
 
-import java.text.DecimalFormat;
+import static org.apache.geode.tools.pulse.internal.data.PulseConstants.FOUR_PLACE_DECIMAL_FORMAT;
+
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
@@ -35,7 +36,6 @@ import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Service;
 
 import org.apache.geode.tools.pulse.internal.data.Cluster;
-import org.apache.geode.tools.pulse.internal.data.PulseConstants;
 import org.apache.geode.tools.pulse.internal.data.Repository;
 
 /**
@@ -181,8 +181,7 @@ public class ClusterRegionService implements PulseService {
           reg.getRegionStatisticTrend(Cluster.Region.REGION_STAT_DISK_WRITES_PER_SEC_TREND)));
       regionJSON.put("emptyNodes", reg.getEmptyNode());
       Long entrySize = reg.getEntrySize();
-      DecimalFormat form = new DecimalFormat(PulseConstants.DECIMAL_FORMAT_PATTERN_2);
-      String entrySizeInMB = form.format(entrySize / (1024f * 1024f));
+      String entrySizeInMB = FOUR_PLACE_DECIMAL_FORMAT.format(entrySize / (1024f * 1024f));
 
       if (entrySize < 0) {
         regionJSON.put(this.ENTRY_SIZE, VALUE_NA);
diff --git a/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/service/ClusterRegionsService.java b/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/service/ClusterRegionsService.java
index 027f9ff..f68cf0b 100644
--- a/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/service/ClusterRegionsService.java
+++ b/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/service/ClusterRegionsService.java
@@ -17,7 +17,8 @@
 
 package org.apache.geode.tools.pulse.internal.service;
 
-import java.text.DecimalFormat;
+import static org.apache.geode.tools.pulse.internal.data.PulseConstants.FOUR_PLACE_DECIMAL_FORMAT;
+
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
@@ -35,7 +36,6 @@ import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Service;
 
 import org.apache.geode.tools.pulse.internal.data.Cluster;
-import org.apache.geode.tools.pulse.internal.data.PulseConstants;
 import org.apache.geode.tools.pulse.internal.data.Repository;
 
 /**
@@ -176,8 +176,7 @@ public class ClusterRegionsService implements PulseService {
           reg.getRegionStatisticTrend(Cluster.Region.REGION_STAT_DISK_WRITES_PER_SEC_TREND)));
       regionJSON.put("emptyNodes", reg.getEmptyNode());
       Long entrySize = reg.getEntrySize();
-      DecimalFormat form = new DecimalFormat(PulseConstants.DECIMAL_FORMAT_PATTERN_2);
-      String entrySizeInMB = form.format(entrySize / (1024f * 1024f));
+      String entrySizeInMB = FOUR_PLACE_DECIMAL_FORMAT.format(entrySize / (1024f * 1024f));
 
       if (entrySize < 0) {
         regionJSON.put(this.ENTRY_SIZE, VALUE_NA);
diff --git a/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/service/ClusterSelectedRegionService.java b/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/service/ClusterSelectedRegionService.java
index 5052186..5163553 100644
--- a/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/service/ClusterSelectedRegionService.java
+++ b/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/service/ClusterSelectedRegionService.java
@@ -17,7 +17,9 @@
 
 package org.apache.geode.tools.pulse.internal.service;
 
-import java.text.DecimalFormat;
+import static org.apache.geode.tools.pulse.internal.data.PulseConstants.FOUR_PLACE_DECIMAL_FORMAT;
+import static org.apache.geode.tools.pulse.internal.data.PulseConstants.TWO_PLACE_DECIMAL_FORMAT;
+
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
@@ -37,7 +39,6 @@ import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Service;
 
 import org.apache.geode.tools.pulse.internal.data.Cluster;
-import org.apache.geode.tools.pulse.internal.data.PulseConstants;
 import org.apache.geode.tools.pulse.internal.data.Repository;
 import org.apache.geode.tools.pulse.internal.util.TimeUtils;
 
@@ -123,7 +124,6 @@ public class ClusterSelectedRegionService implements PulseService {
       regionJSON.put("putsRate", reg.getPutsRate());
       regionJSON.put("lruEvictionRate", reg.getLruEvictionRate());
 
-      DecimalFormat df2 = new DecimalFormat(PulseConstants.DECIMAL_FORMAT_PATTERN);
       Cluster.Member[] clusterMembersList = cluster.getMembers();
 
       // collect members of this region
@@ -156,19 +156,19 @@ public class ClusterSelectedRegionService implements PulseService {
         long currentHeap = member.getCurrentHeapSize();
         if (usedHeapSize > 0) {
           double heapUsage = ((double) currentHeap / (double) usedHeapSize) * 100;
-          regionMember.put("heapUsage", Double.valueOf(df2.format(heapUsage)));
+          regionMember.put("heapUsage", TWO_PLACE_DECIMAL_FORMAT.format(heapUsage));
         } else {
           regionMember.put("heapUsage", 0);
         }
         double currentCPUUsage = member.getCpuUsage();
         double loadAvg = member.getLoadAverage();
 
-        regionMember.put("cpuUsage", Double.valueOf(df2.format(currentCPUUsage)));
+        regionMember.put("cpuUsage", TWO_PLACE_DECIMAL_FORMAT.format(currentCPUUsage));
         regionMember.put("currentHeapUsage", member.getCurrentHeapSize());
         regionMember.put("isManager", member.isManager());
         regionMember.put("uptime", TimeUtils.convertTimeSecondsToHMS(member.getUptime()));
 
-        regionMember.put("loadAvg", Double.valueOf(df2.format(loadAvg)));
+        regionMember.put("loadAvg", TWO_PLACE_DECIMAL_FORMAT.format(loadAvg));
         regionMember.put("sockets", member.getTotalFileDescriptorOpen());
         regionMember.put("threads", member.getNumThreads());
 
@@ -209,8 +209,7 @@ public class ClusterSelectedRegionService implements PulseService {
 
       regionJSON.put("emptyNodes", reg.getEmptyNode());
       Long entrySize = reg.getEntrySize();
-      DecimalFormat form = new DecimalFormat(PulseConstants.DECIMAL_FORMAT_PATTERN_2);
-      String entrySizeInMB = form.format(entrySize / (1024f * 1024f));
+      String entrySizeInMB = FOUR_PLACE_DECIMAL_FORMAT.format(entrySize / (1024f * 1024f));
       if (entrySize < 0) {
         regionJSON.put(this.ENTRY_SIZE, PulseService.VALUE_NA);
       } else {
diff --git a/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/service/MemberDetailsService.java b/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/service/MemberDetailsService.java
index 52d5662..28cd2e4 100644
--- a/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/service/MemberDetailsService.java
+++ b/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/service/MemberDetailsService.java
@@ -17,10 +17,9 @@
 
 package org.apache.geode.tools.pulse.internal.service;
 
+import static org.apache.geode.tools.pulse.internal.data.PulseConstants.TWO_PLACE_DECIMAL_FORMAT;
 import static org.apache.geode.tools.pulse.internal.util.NameUtil.makeCompliantName;
 
-import java.text.DecimalFormat;
-
 import javax.servlet.http.HttpServletRequest;
 
 import com.fasterxml.jackson.databind.JsonNode;
@@ -31,7 +30,6 @@ import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Service;
 
 import org.apache.geode.tools.pulse.internal.data.Cluster;
-import org.apache.geode.tools.pulse.internal.data.PulseConstants;
 import org.apache.geode.tools.pulse.internal.data.Repository;
 
 /**
@@ -60,7 +58,6 @@ public class MemberDetailsService implements PulseService {
 
     JsonNode requestDataJSON = mapper.readTree(request.getParameter("pulseData"));
     String memberName = requestDataJSON.get("MemberDetails").get("memberName").textValue();
-    DecimalFormat df2 = new DecimalFormat(PulseConstants.DECIMAL_FORMAT_PATTERN);
 
     Cluster.Member clusterMember = cluster.getMember(makeCompliantName(memberName));
     if (clusterMember != null) {
@@ -71,7 +68,7 @@ public class MemberDetailsService implements PulseService {
       responseJSON.put("clusterName", cluster.getServerName());
       responseJSON.put("userName", userName);
       double loadAvg = clusterMember.getLoadAverage();
-      responseJSON.put("loadAverage", Double.valueOf(df2.format(loadAvg)));
+      responseJSON.put("loadAverage", TWO_PLACE_DECIMAL_FORMAT.format(loadAvg));
       responseJSON.put("sockets", clusterMember.getTotalFileDescriptorOpen());
       responseJSON.put("threads", clusterMember.getNumThreads());
       responseJSON.put("offHeapFreeSize", clusterMember.getOffHeapFreeSize());
@@ -84,7 +81,7 @@ public class MemberDetailsService implements PulseService {
       Long diskUsageVal = clusterMember.getTotalDiskUsage();
       Double diskUsage = diskUsageVal.doubleValue() / 1024;
 
-      responseJSON.put("diskStorageUsed", Double.valueOf(df2.format(diskUsage)));
+      responseJSON.put("diskStorageUsed", TWO_PLACE_DECIMAL_FORMAT.format(diskUsage));
 
       Cluster.Alert[] alertsList = cluster.getAlertsList();
 
diff --git a/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/service/MemberRegionsService.java b/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/service/MemberRegionsService.java
index bd1bdae..ee5dd62 100644
--- a/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/service/MemberRegionsService.java
+++ b/geode-pulse/src/main/java/org/apache/geode/tools/pulse/internal/service/MemberRegionsService.java
@@ -17,10 +17,9 @@
 
 package org.apache.geode.tools.pulse.internal.service;
 
+import static org.apache.geode.tools.pulse.internal.data.PulseConstants.FOUR_PLACE_DECIMAL_FORMAT;
 import static org.apache.geode.tools.pulse.internal.util.NameUtil.makeCompliantName;
 
-import java.text.DecimalFormat;
-
 import javax.servlet.http.HttpServletRequest;
 
 import com.fasterxml.jackson.databind.JsonNode;
@@ -33,7 +32,6 @@ import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Service;
 
 import org.apache.geode.tools.pulse.internal.data.Cluster;
-import org.apache.geode.tools.pulse.internal.data.PulseConstants;
 import org.apache.geode.tools.pulse.internal.data.Repository;
 
 /**
@@ -88,8 +86,7 @@ public class MemberRegionsService implements PulseService {
         regionJSON.put("entryCount", memberRegion.getSystemRegionEntryCount());
         Long entrySize = memberRegion.getEntrySize();
 
-        DecimalFormat form = new DecimalFormat(PulseConstants.DECIMAL_FORMAT_PATTERN_2);
-        String entrySizeInMB = form.format(entrySize / (1024f * 1024f));
+        String entrySizeInMB = FOUR_PLACE_DECIMAL_FORMAT.format(entrySize / (1024f * 1024f));
 
         if (entrySize < 0) {
           regionJSON.put(this.ENTRY_SIZE, VALUE_NA);
diff --git a/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/ui/PulseBase.java b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/ui/PulseBase.java
index 7cc49b0..4ad0e69 100644
--- a/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/ui/PulseBase.java
+++ b/geode-pulse/src/test/java/org/apache/geode/tools/pulse/tests/ui/PulseBase.java
@@ -15,6 +15,7 @@
  */
 package org.apache.geode.tools.pulse.tests.ui;
 
+import static org.apache.geode.tools.pulse.internal.data.PulseConstants.TWO_PLACE_DECIMAL_FORMAT;
 import static org.apache.geode.tools.pulse.tests.ui.PulseTestConstants.CLUSTER_CLIENTS_ID;
 import static org.apache.geode.tools.pulse.tests.ui.PulseTestConstants.CLUSTER_FUNCTIONS_ID;
 import static org.apache.geode.tools.pulse.tests.ui.PulseTestConstants.CLUSTER_GCPAUSES_ID;
@@ -320,8 +321,7 @@ public abstract class PulseBase {
     searchByIdAndClick("M1&M1");
     String LoadAvg = getWebDriver().findElement(By.id(MEMBER_VIEW_LOADAVG_ID)).getText();
     String memberLoadAvg = JMXProperties.getInstance().getProperty("member.M1.loadAverage");
-    assertEquals(new DecimalFormat(PulseConstants.DECIMAL_FORMAT_PATTERN)
-        .format(Double.valueOf(memberLoadAvg)), LoadAvg);
+    assertEquals(TWO_PLACE_DECIMAL_FORMAT.format(Double.valueOf(memberLoadAvg)), LoadAvg);
   }
 
   @Ignore("WIP") // May be useful in near future
@@ -743,8 +743,7 @@ public abstract class PulseBase {
               By.xpath("//div[@id='_tooltip']/div/div/div[2]/div[" + (j + 2) + "]/div[2]/div"))
           .getText();
       String loadAvgM1 = JMXProperties.getInstance().getProperty("member.M" + (i) + ".loadAverage");
-      assertEquals(new DecimalFormat(PulseConstants.DECIMAL_FORMAT_PATTERN)
-          .format(Double.valueOf(loadAvgM1)), LoadAvgM1);
+      assertEquals(TWO_PLACE_DECIMAL_FORMAT.format(Double.valueOf(loadAvgM1)), LoadAvgM1);
 
       String ThreadsM1 = getWebDriver()
           .findElement(

-- 
To stop receiving notification emails like this one, please contact
jensdeppe@apache.org.