changeset 173:b92aa059996a

Bug 3057: [JDK 9] HeapStats Analyzer could not start on JDK 9 Reviewed-by: ykubota http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=3057 Closes #29
author Yasumasa Suenaga <yasuenag@gmail.com>
date Fri, 01 Jul 2016 21:59:42 +0900
parents a77984fba64f
children 47922c6927e1
files ChangeLog analyzer/fx/heapstats.properties analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/jvmlive/jdp/JdpDecoder.java analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/log/ArchiveDataConverter.java analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/log/LogController.java analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/log/LogDataConverter.java analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/log/tabs/LogResourcesController.java analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/snapshot/SnapShotController.java analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/snapshot/SnapShotHeaderConverter.java analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/snapshot/tabs/HistogramController.java analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/snapshot/tabs/SnapshotController.java analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/snapshot/tabs/SummaryController.java analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/threadrecorder/ThreadRecorderController.java analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/utils/HeapStatsUtils.java analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/utils/LocalDateTimeConverter.java analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/utils/ThreadStatConverter.java
diffstat 16 files changed, 63 insertions(+), 106 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Fri Jul 01 10:07:50 2016 +0900
+++ b/ChangeLog	Fri Jul 01 21:59:42 2016 +0900
@@ -1,3 +1,7 @@
+2016-07-01  Yasumasa Suenaga <kubota.yuji@lab.ntt.co.jp>
+
+	* Bug 3057: [JDK 9] HeapStats Analyzer could not start on JDK 9
+
 2016-07-01  KUBOTA Yuji <kubota.yuji@lab.ntt.co.jp>
 
 	* Bug 3023: [JDK 9] Search JDK shared-library correctly
--- a/analyzer/fx/heapstats.properties	Fri Jul 01 10:07:50 2016 +0900
+++ b/analyzer/fx/heapstats.properties	Fri Jul 01 21:59:42 2016 +0900
@@ -10,4 +10,5 @@
 socketend=tcp,udp,tcp6,udp6
 heaporder_bottom_young=true
 language=en
+datetime_format=yyyy/MM/dd HH:mm:ss
 #plugins=
\ No newline at end of file
--- a/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/jvmlive/jdp/JdpDecoder.java	Fri Jul 01 10:07:50 2016 +0900
+++ b/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/jvmlive/jdp/JdpDecoder.java	Fri Jul 01 21:59:42 2016 +0900
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2014-2015 Yasumasa Suenaga
+ * Copyright (C) 2014-2016 Yasumasa Suenaga
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -42,7 +42,7 @@
 import jp.co.ntt.oss.heapstats.fx.lambda.EventHandlerWrapper;
 import jp.co.ntt.oss.heapstats.jmx.JMXHelper;
 import jp.co.ntt.oss.heapstats.lambda.RunnableWrapper;
-import jp.co.ntt.oss.heapstats.utils.LocalDateTimeConverter;
+import jp.co.ntt.oss.heapstats.utils.HeapStatsUtils;
 
 
 /**
@@ -172,7 +172,7 @@
     private void setJdpTableKeyValue(JdpTableKeyValue val, Labeled jmxURL){
         switch(val.keyProperty().get()){
             case "Received Time":
-                val.valueProperty().set((new LocalDateTimeConverter()).toString(receivedTime));
+                val.valueProperty().set(receivedTime.format(HeapStatsUtils.getDateTimeFormatter()));
                 break;
 
             case "Address":
@@ -222,7 +222,7 @@
             jmxProcPool.submit(new RunnableWrapper(() -> heapstatsValue.valueProperty().set(new JMXHelper(jmxServiceURL))));
             
             jdpTableKeyValue.set(FXCollections.observableArrayList(
-                    new JdpTableKeyValue("Received Time", (new LocalDateTimeConverter()).toString(receivedTime)),
+                    new JdpTableKeyValue("Received Time", receivedTime.format(HeapStatsUtils.getDateTimeFormatter())),
                     new JdpTableKeyValue("Address", sourceAddr.getAddress().getHostAddress()),
                     new JdpTableKeyValue("JDP Instance Name", instanceName),
                     new JdpTableKeyValue("Main Class", mainClass),
--- a/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/log/ArchiveDataConverter.java	Fri Jul 01 10:07:50 2016 +0900
+++ b/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/log/ArchiveDataConverter.java	Fri Jul 01 21:59:42 2016 +0900
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2014-2015 Yasumasa Suenaga
+ * Copyright (C) 2014-2016 Yasumasa Suenaga
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -18,9 +18,10 @@
 
 package jp.co.ntt.oss.heapstats.plugin.builtin.log;
 
+import java.util.Optional;
 import javafx.util.StringConverter;
 import jp.co.ntt.oss.heapstats.container.log.ArchiveData;
-import jp.co.ntt.oss.heapstats.utils.LocalDateTimeConverter;
+import jp.co.ntt.oss.heapstats.utils.HeapStatsUtils;
 
 /**
  * This class converts LocalDateTime in ArchiveData to String.
@@ -32,8 +33,9 @@
 
     @Override
     public String toString(ArchiveData object) {
-        LocalDateTimeConverter dateTimeConv = new LocalDateTimeConverter();
-        return dateTimeConv.toString(object.getDate());
+        return Optional.ofNullable(object)
+                       .map(o -> o.getDate().format(HeapStatsUtils.getDateTimeFormatter()))
+                       .orElse(null);
     }
 
     @Override
--- a/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/log/LogController.java	Fri Jul 01 10:07:50 2016 +0900
+++ b/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/log/LogController.java	Fri Jul 01 21:59:42 2016 +0900
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2014-2015 Yasumasa Suenaga
+ * Copyright (C) 2014-2016 Yasumasa Suenaga
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -42,6 +42,7 @@
 import javafx.scene.control.TextField;
 import javafx.stage.FileChooser;
 import javafx.stage.FileChooser.ExtensionFilter;
+import javafx.util.converter.LocalDateTimeStringConverter;
 import jp.co.ntt.oss.heapstats.WindowController;
 import jp.co.ntt.oss.heapstats.container.log.ArchiveData;
 import jp.co.ntt.oss.heapstats.container.log.DiffData;
@@ -53,7 +54,6 @@
 import jp.co.ntt.oss.heapstats.plugin.builtin.log.tabs.LogResourcesController;
 import jp.co.ntt.oss.heapstats.task.ParseLogFile;
 import jp.co.ntt.oss.heapstats.utils.HeapStatsUtils;
-import jp.co.ntt.oss.heapstats.utils.LocalDateTimeConverter;
 import jp.co.ntt.oss.heapstats.utils.TaskAdapter;
 
 /**
@@ -94,8 +94,9 @@
     public void initialize(URL url, ResourceBundle rb) {
         super.initialize(url, rb);
 
-        startCombo.setConverter(new LocalDateTimeConverter());
-        endCombo.setConverter(new LocalDateTimeConverter());
+        LocalDateTimeStringConverter converter = new LocalDateTimeStringConverter(HeapStatsUtils.getDateTimeFormatter(), null);
+        startCombo.setConverter(converter);
+        endCombo.setConverter(converter);
 
         okBtn.disableProperty().bind(startCombo.getSelectionModel().selectedIndexProperty().greaterThanOrEqualTo(endCombo.getSelectionModel().selectedIndexProperty()));
         archiveList = new SimpleObjectProperty<>(FXCollections.emptyObservableList());
--- a/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/log/LogDataConverter.java	Fri Jul 01 10:07:50 2016 +0900
+++ b/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/log/LogDataConverter.java	Fri Jul 01 21:59:42 2016 +0900
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2014-2015 Yasumasa Suenaga
+ * Copyright (C) 2014-2016 Yasumasa Suenaga
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -19,7 +19,7 @@
 
 import javafx.util.StringConverter;
 import jp.co.ntt.oss.heapstats.container.log.LogData;
-import jp.co.ntt.oss.heapstats.utils.LocalDateTimeConverter;
+import jp.co.ntt.oss.heapstats.utils.HeapStatsUtils;
 
 /**
  * StringConverter for LogData. This class provides method to convert
@@ -27,12 +27,12 @@
  *
  * @author Yasumasa Suenaga.
  */
+
 public class LogDataConverter extends StringConverter<LogData> {
 
     @Override
     public String toString(LogData object) {
-        LocalDateTimeConverter dateTimeConv = new LocalDateTimeConverter();
-        return dateTimeConv.toString(object.getDateTime());
+        return object.getDateTime().format(HeapStatsUtils.getDateTimeFormatter());
     }
 
     /**
--- a/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/log/tabs/LogResourcesController.java	Fri Jul 01 10:07:50 2016 +0900
+++ b/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/log/tabs/LogResourcesController.java	Fri Jul 01 21:59:42 2016 +0900
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2015 Nippon Telegraph and Telephone Corporation
+ * Copyright (C) 2015-2016 Nippon Telegraph and Telephone Corporation
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -53,7 +53,6 @@
 import jp.co.ntt.oss.heapstats.container.log.LogData;
 import jp.co.ntt.oss.heapstats.container.log.SummaryData;
 import jp.co.ntt.oss.heapstats.utils.HeapStatsUtils;
-import jp.co.ntt.oss.heapstats.utils.LocalDateTimeConverter;
 
 /**
  * FXML Controller class for "Resource Data" tab in LogData plugin.
@@ -322,9 +321,8 @@
             return;
         }
 
-        LocalDateTimeConverter converter = new LocalDateTimeConverter();
         List<String> archiveDateList = archiveList.get().stream()
-                .map(a -> converter.toString(a.getDate()))
+                .map(a -> a.getDate().format(HeapStatsUtils.getDateTimeFormatter()))
                 .collect(Collectors.toList());
         chartGrid.getChildren().stream()
                 .filter(n -> n instanceof StackPane)
@@ -342,9 +340,8 @@
             return;
         }
 
-        LocalDateTimeConverter converter = new LocalDateTimeConverter();
         List<String> suspectRebootDateList = suspectList.stream()
-                .map(d -> converter.toString(d))
+                .map(d -> d.format(HeapStatsUtils.getDateTimeFormatter()))
                 .collect(Collectors.toList());
         chartGrid.getChildren().stream()
                 .filter(n -> n instanceof StackPane)
@@ -393,8 +390,6 @@
         /* Monitor contantion */
         private final ObservableList<XYChart.Data<String, Long>> monitorsBuf;
 
-        private final LocalDateTimeConverter converter;
-
         private final List<LogData> targetLogData;
 
         private final List<DiffData> targetDiffData;
@@ -422,14 +417,13 @@
             threadsBuf = FXCollections.observableArrayList();
             monitorsBuf = FXCollections.observableArrayList();
 
-            converter = new LocalDateTimeConverter();
             this.targetLogData = targetLogData;
             this.targetDiffData = targetDiffData;
             totalLoopCount = targetDiffData.size() + targetLogData.size();
         }
 
         private void addDiffData(DiffData data) {
-            String time = converter.toString(data.getDateTime());
+            String time = data.getDateTime().format(HeapStatsUtils.getDateTimeFormatter());
 
             javaUserUsageBuf.add(new XYChart.Data<>(time, data.getJavaUserUsage()));
             javaSysUsageBuf.add(new XYChart.Data<>(time, data.getJavaSysUsage()));
@@ -450,7 +444,7 @@
         }
 
         private void addLogData(LogData data) {
-            String time = converter.toString(data.getDateTime());
+            String time = data.getDateTime().format(HeapStatsUtils.getDateTimeFormatter());
 
             javaVSZUsageBuf.add(new XYChart.Data<>(time, data.getJavaVSSize() / 1024 / 1024));
             javaRSSUsageBuf.add(new XYChart.Data<>(time, data.getJavaRSSize() / 1024 / 1024));
--- a/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/snapshot/SnapShotController.java	Fri Jul 01 10:07:50 2016 +0900
+++ b/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/snapshot/SnapShotController.java	Fri Jul 01 21:59:42 2016 +0900
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2014-2015 Yasumasa Suenaga
+ * Copyright (C) 2014-2016 Yasumasa Suenaga
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -75,7 +75,6 @@
 import jp.co.ntt.oss.heapstats.task.CSVDumpHeap;
 import jp.co.ntt.oss.heapstats.task.ParseHeader;
 import jp.co.ntt.oss.heapstats.utils.HeapStatsUtils;
-import jp.co.ntt.oss.heapstats.utils.LocalDateTimeConverter;
 import jp.co.ntt.oss.heapstats.utils.TaskAdapter;
 
 /**
@@ -399,10 +398,9 @@
 
         double startX = xAxis.getLayoutX() + xAxis.getStartMargin() - 1.0d;
         double yPos = yAxis.getLayoutY() + chartTitle.getLayoutY() + chartTitle.getHeight();
-        LocalDateTimeConverter converter = new LocalDateTimeConverter();
         List<Rectangle> rectList = summaryData.get().getRebootSuspectList()
                 .stream()
-                .map(d -> converter.toString(d))
+                .map(d -> d.format(HeapStatsUtils.getDateTimeFormatter()))
                 .map(s -> new Rectangle(xAxis.getDisplayPosition(s) + startX, yPos, 4d, yAxis.getHeight()))
                 .peek(r -> ((Rectangle) r).setStyle("-fx-fill: yellow;"))
                 .collect(Collectors.toList());
--- a/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/snapshot/SnapShotHeaderConverter.java	Fri Jul 01 10:07:50 2016 +0900
+++ b/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/snapshot/SnapShotHeaderConverter.java	Fri Jul 01 21:59:42 2016 +0900
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2014-2015 Yasumasa Suenaga
+ * Copyright (C) 2014-2016 Yasumasa Suenaga
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -20,7 +20,7 @@
 import java.util.Optional;
 import javafx.util.StringConverter;
 import jp.co.ntt.oss.heapstats.container.snapshot.SnapShotHeader;
-import jp.co.ntt.oss.heapstats.utils.*;
+import jp.co.ntt.oss.heapstats.utils.HeapStatsUtils;
 
 /**
  * StringConverter for LocalDateTime of SnapShotHeader. <br/>
@@ -33,8 +33,8 @@
     @Override
     public String toString(SnapShotHeader object) {
         return Optional.ofNullable(object)
-                .map(o -> (new LocalDateTimeConverter()).toString(o.getSnapShotDate()))
-                .orElse("");
+                       .map(o -> o.getSnapShotDate().format(HeapStatsUtils.getDateTimeFormatter()))
+                       .orElse(null);
     }
 
     @Override
--- a/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/snapshot/tabs/HistogramController.java	Fri Jul 01 10:07:50 2016 +0900
+++ b/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/snapshot/tabs/HistogramController.java	Fri Jul 01 21:59:42 2016 +0900
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2015 Nippon Telegraph and Telephone Corporation
+ * Copyright (C) 2015-2016 Nippon Telegraph and Telephone Corporation
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -75,7 +75,6 @@
 import jp.co.ntt.oss.heapstats.plugin.builtin.snapshot.ChartColorManager;
 import jp.co.ntt.oss.heapstats.task.DiffCalculator;
 import jp.co.ntt.oss.heapstats.utils.HeapStatsUtils;
-import jp.co.ntt.oss.heapstats.utils.LocalDateTimeConverter;
 import jp.co.ntt.oss.heapstats.utils.TaskAdapter;
 import jp.co.ntt.oss.heapstats.xml.binding.Filter;
 import jp.co.ntt.oss.heapstats.xml.binding.Filters;
@@ -234,8 +233,7 @@
             seriesMap.put(objData.getName(), series);
         }
 
-        LocalDateTimeConverter converter = new LocalDateTimeConverter();
-        String time = converter.toString(header.getSnapShotDate());
+        String time = header.getSnapShotDate().format(HeapStatsUtils.getDateTimeFormatter());
         long yValue = instanceGraph.get() ? objData.getCount()
                 : objData.getTotalSize() / 1024 / 1024;
         XYChart.Data<String, Long> data = new XYChart.Data<>(time, yValue);
--- a/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/snapshot/tabs/SnapshotController.java	Fri Jul 01 10:07:50 2016 +0900
+++ b/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/snapshot/tabs/SnapshotController.java	Fri Jul 01 21:59:42 2016 +0900
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2015 Nippon Telegraph and Telephone Corporation
+ * Copyright (C) 2015-2016 Nippon Telegraph and Telephone Corporation
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -51,7 +51,6 @@
 import jp.co.ntt.oss.heapstats.plugin.builtin.snapshot.ChartColorManager;
 import jp.co.ntt.oss.heapstats.plugin.builtin.snapshot.SnapShotHeaderConverter;
 import jp.co.ntt.oss.heapstats.utils.HeapStatsUtils;
-import jp.co.ntt.oss.heapstats.utils.LocalDateTimeConverter;
 
 /**
  * FXML Controller class for "SnapShot Data" tab in SnapShot plugin.
@@ -159,7 +158,7 @@
         ResourceBundle resource = ResourceBundle.getBundle("snapshotResources", new Locale(HeapStatsUtils.getLanguage()));
 
         summaryList.addAll(
-                new AbstractMap.SimpleEntry<>(resource.getString("snapshot.date"), (new LocalDateTimeConverter()).toString(header.getSnapShotDate())),
+                new AbstractMap.SimpleEntry<>(resource.getString("snapshot.date"), header.getSnapShotDate().format(HeapStatsUtils.getDateTimeFormatter())),
                 new AbstractMap.SimpleEntry<>(resource.getString("snapshot.hasreftree"), header.hasReferenceData() ? "Yes" : "N/A"),
                 new AbstractMap.SimpleEntry<>(resource.getString("snapshot.entries"), Long.toString(header.getNumEntries())),
                 new AbstractMap.SimpleEntry<>(resource.getString("snapshot.instances"), Long.toString(header.getNumInstances())),
--- a/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/snapshot/tabs/SummaryController.java	Fri Jul 01 10:07:50 2016 +0900
+++ b/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/snapshot/tabs/SummaryController.java	Fri Jul 01 21:59:42 2016 +0900
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2015 Nippon Telegraph and Telephone Corporation
+ * Copyright (C) 2015-2016 Nippon Telegraph and Telephone Corporation
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -43,7 +43,6 @@
 import jp.co.ntt.oss.heapstats.container.snapshot.SnapShotHeader;
 import jp.co.ntt.oss.heapstats.container.snapshot.SummaryData;
 import jp.co.ntt.oss.heapstats.utils.HeapStatsUtils;
-import jp.co.ntt.oss.heapstats.utils.LocalDateTimeConverter;
 
 /**
  * FXML Controller class for "Summary Data" tab in SnapShot plugin.
@@ -182,8 +181,6 @@
 
         private int processedIndex;
 
-        private final LocalDateTimeConverter converter;
-
         private final Consumer<XYChart<String, ? extends Number>> drawRebootSuspectLine;
 
         /* Java Heap Usage Chart */
@@ -209,7 +206,6 @@
          */
         public CalculateGCSummaryTask(Consumer<XYChart<String, ? extends Number>> drawRebootSuspectLine) {
             this.drawRebootSuspectLine = drawRebootSuspectLine;
-            converter = new LocalDateTimeConverter();
 
             youngUsageBuf = FXCollections.observableArrayList();
             oldUsageBuf = FXCollections.observableArrayList();
@@ -221,7 +217,7 @@
         }
 
         private void processSnapShotHeader(SnapShotHeader header) {
-            String time = converter.toString(header.getSnapShotDate());
+            String time = header.getSnapShotDate().format(HeapStatsUtils.getDateTimeFormatter());
 
             youngUsageBuf.add(new XYChart.Data<>(time, header.getNewHeap() / 1024 / 1024));
             oldUsageBuf.add(new XYChart.Data<>(time, header.getOldHeap() / 1024 / 1024));
--- a/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/threadrecorder/ThreadRecorderController.java	Fri Jul 01 10:07:50 2016 +0900
+++ b/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/plugin/builtin/threadrecorder/ThreadRecorderController.java	Fri Jul 01 21:59:42 2016 +0900
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2015 Yasumasa Suenaga
+ * Copyright (C) 2015-2016 Yasumasa Suenaga
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -47,7 +47,6 @@
 import javafx.beans.property.ObjectProperty;
 import javafx.beans.property.SimpleObjectProperty;
 
-import jp.co.ntt.oss.heapstats.utils.LocalDateTimeConverter;
 
 /**
  * FXML Controller class
@@ -113,8 +112,7 @@
                 rangeEnd.set(newTime);
             }
             
-            LocalDateTimeConverter converter = new LocalDateTimeConverter();
-            target.setText(converter.toString(newTime));
+            target.setText(newTime.format(HeapStatsUtils.getDateTimeFormatter()));
         }
     }
 
--- a/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/utils/HeapStatsUtils.java	Fri Jul 01 10:07:50 2016 +0900
+++ b/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/utils/HeapStatsUtils.java	Fri Jul 01 21:59:42 2016 +0900
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2014-2015 Yasumasa Suenaga
+ * Copyright (C) 2014-2016 Yasumasa Suenaga
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -28,6 +28,7 @@
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.nio.file.StandardOpenOption;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -61,6 +62,9 @@
 
     /* Resource bundle for HeapStats Analyzer. */
     private static ResourceBundle resource;
+    
+    /* Cached DatetTimeFormatter */
+    private static DateTimeFormatter formatter;
 
     public static Path getHeapStatsHomeDirectory() {
 
@@ -168,6 +172,10 @@
         if (heapOrder == null) {
             prop.setProperty("heaporder", "true");
         }
+        
+        /* DateTime format */
+        prop.putIfAbsent("datetime_format", "yyyy/MM/dd HH:mm:ss");
+        formatter = DateTimeFormatter.ofPattern(prop.getProperty("datetime_format"));
 
         /* Add shutdown hook for saving current settings. */
         Runnable savePropImpl = () -> {
@@ -294,6 +302,14 @@
     public static ResourceBundle getResourceBundle() {
         return ResourceBundle.getBundle("HeapStatsResources", new Locale(getLanguage()));
     }
+    
+    /**
+     * Get DataTimeFormatter which is initialized by datetime_format value in heapstats.properties.
+     * @return Instance of DateTimeFormatter.
+     */
+    public static DateTimeFormatter getDateTimeFormatter(){
+        return formatter;
+    }
 
     /**
      * Convert stack trace to String.
--- a/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/utils/LocalDateTimeConverter.java	Fri Jul 01 10:07:50 2016 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2014-2015 Yasumasa Suenaga
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-
-package jp.co.ntt.oss.heapstats.utils;
-
-import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
-import javafx.util.StringConverter;
-
-/**
- * StringConverter for LocalDateTime. <br/>
- * This class is used at JavaFX controls.
- * 
- * @author Yasumasa Suenaga
- */
-public class LocalDateTimeConverter extends StringConverter<LocalDateTime>{
-    
-    private static final DateTimeFormatter formatter;
-    
-    static{
-        formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
-    }
-    
-    @Override
-    public String toString(LocalDateTime object) {
-        return formatter.format(object);
-    }
-
-    @Override
-    public LocalDateTime fromString(String string) {
-        return LocalDateTime.parse(string, formatter);
-    }
-    
-}
--- a/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/utils/ThreadStatConverter.java	Fri Jul 01 10:07:50 2016 +0900
+++ b/analyzer/fx/src/main/java/jp/co/ntt/oss/heapstats/utils/ThreadStatConverter.java	Fri Jul 01 21:59:42 2016 +0900
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2015 Yasumasa Suenaga
+ * Copyright (C) 2015-2016 Yasumasa Suenaga
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -27,11 +27,10 @@
  * @author Yasumasa Suenaga
  */
 public class ThreadStatConverter extends StringConverter<ThreadStat>{
-
+    
     @Override
     public String toString(ThreadStat object) {
-        LocalDateTimeConverter converter = new LocalDateTimeConverter();
-        return converter.toString(object.getTime());
+        return object.getTime().format(HeapStatsUtils.getDateTimeFormatter());
     }
 
     @Override