diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/comments/CommentHistoryPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/comments/CommentHistoryPanel.java index e43d749a91..22b7668490 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/comments/CommentHistoryPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/comments/CommentHistoryPanel.java @@ -17,7 +17,6 @@ package ghidra.app.plugin.core.comments; import java.awt.BorderLayout; import java.awt.Color; -import java.text.SimpleDateFormat; import javax.swing.JPanel; import javax.swing.JTextPane; @@ -26,6 +25,7 @@ import javax.swing.text.*; import ghidra.program.model.address.Address; import ghidra.program.model.listing.CommentHistory; import ghidra.program.model.listing.Program; +import ghidra.util.DateUtils; import ghidra.util.Msg; /** @@ -44,7 +44,6 @@ class CommentHistoryPanel extends JPanel { private StyledDocument doc; private JTextPane textPane; - private SimpleDateFormat formatter; private int commentType; /** @@ -56,7 +55,6 @@ class CommentHistoryPanel extends JPanel { super(new BorderLayout()); setUpAttributes(); this.commentType = commentType; - formatter = new SimpleDateFormat("yyyy MMM dd hh:mm aaa"); create(); } @@ -105,8 +103,8 @@ class CommentHistoryPanel extends JPanel { doc.insertString(offset, userName, userAttrSet); offset = doc.getLength(); - doc.insertString(offset, "\t" + formatter.format(history.getModificationDate()), - dateAttrSet); + doc.insertString(offset, + "\t" + DateUtils.formatDateTimestamp(history.getModificationDate()), dateAttrSet); doc.setParagraphAttributes(offset, 1, tabAttrSet, false); offset = doc.getLength(); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/DataTypeSyncInfo.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/DataTypeSyncInfo.java index 7550be0307..3e4fb55ce8 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/DataTypeSyncInfo.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/DataTypeSyncInfo.java @@ -15,18 +15,16 @@ */ package ghidra.app.plugin.core.datamgr; -import java.text.DateFormat; -import java.text.SimpleDateFormat; import java.util.Date; import org.apache.commons.lang3.StringUtils; import ghidra.program.model.data.DataType; import ghidra.program.model.data.DataTypeManager; +import ghidra.util.DateUtils; import ghidra.util.UniversalID; public class DataTypeSyncInfo { - private static DateFormat dateFormat; private final DataType refDt; private final DataType sourceDt; @@ -106,7 +104,7 @@ public class DataTypeSyncInfo { /** * Commits the data type to the source archive. * Call canCommit() to check the state before calling this. - * @see canCommit() + * @see #canCommit() */ public void commit() { DataTypeSynchronizer.commitAssumingTransactionsOpen(sourceDTM, refDt); @@ -115,7 +113,7 @@ public class DataTypeSyncInfo { /** * Updates the data type from the one in the source archive. * Call canUpdate() to check the state before calling this. - * @see canUpdate() + * @see #canUpdate() */ public void update() { DataTypeSynchronizer.updateAssumingTransactionsOpen(refDt.getDataTypeManager(), sourceDt); @@ -124,7 +122,7 @@ public class DataTypeSyncInfo { /** * Reverts the data type to match the one in the source archive. * Call canRevert() to check the state before calling this. - * @see canRevert() + * @see #canRevert() */ public void revert() { DataTypeSynchronizer.updateAssumingTransactionsOpen(refDt.getDataTypeManager(), sourceDt); @@ -177,10 +175,7 @@ public class DataTypeSyncInfo { if (date == 0) { return ""; } - if (dateFormat == null) { - dateFormat = new SimpleDateFormat("MM/dd/yy HH:mm:ss"); - } - return dateFormat.format(new Date(date)); + return DateUtils.formatDateTimestamp(new Date(date)); } public DataType getRefDataType() { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/label/LabelHistoryPanel.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/label/LabelHistoryPanel.java index 9692509704..cd60813c14 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/label/LabelHistoryPanel.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/label/LabelHistoryPanel.java @@ -18,7 +18,6 @@ package ghidra.app.plugin.core.label; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.text.SimpleDateFormat; import java.util.List; import javax.swing.*; @@ -42,13 +41,14 @@ class LabelHistoryPanel extends JPanel { private LabelHistoryTableModel tableModel; private JTable historyTable; - private SimpleDateFormat dateFormatter; private LabelHistoryListener listener; private boolean showAddresses; private final Program program; /** - * Construct a new history panel. + * Construct a new history panel + * + * @param program the program * @param list list of LabelHistory objects * @param listener listener that is notified when the user clicks on a * row in the table; null if only label history at a specific address @@ -60,13 +60,9 @@ class LabelHistoryPanel extends JPanel { showAddresses = listener != null; this.listener = listener; - dateFormatter = new SimpleDateFormat("yyyy MMM dd hh:mm aaa"); create(list); } - /** - * Show the label history for the given address. - */ void setCurrentAddress(java.util.List list) { tableModel = new LabelHistoryTableModel(list, true); } @@ -91,7 +87,7 @@ class LabelHistoryPanel extends JPanel { TableColumn column = columnModel.getColumn(i); String name = (String) column.getIdentifier(); if (name.equals(LabelHistoryTableModel.DATE)) { - column.setCellRenderer(new GenericDateCellRenderer(dateFormatter)); + column.setCellRenderer(new GenericDateCellRenderer()); column.setPreferredWidth(190); } else if (name.equals(LabelHistoryTableModel.LABEL)) { @@ -131,8 +127,8 @@ class LabelHistoryPanel extends JPanel { private Font monoFont; LabelCellRenderer() { - Font defaultFont = getFont(); - monoFont = new Font("monospaced", defaultFont.getStyle(), defaultFont.getSize()); + Font f = getFont(); + monoFont = new Font("monospaced", f.getStyle(), f.getSize()); } @Override diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/printing/CodeUnitPrintable.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/printing/CodeUnitPrintable.java index 22c93f89bd..8a6a2115e9 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/printing/CodeUnitPrintable.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/printing/CodeUnitPrintable.java @@ -19,8 +19,6 @@ import java.awt.*; import java.awt.geom.AffineTransform; import java.awt.print.*; import java.math.BigInteger; -import java.text.DateFormat; -import java.text.SimpleDateFormat; import java.util.Date; import docking.util.GraphicsUtils; @@ -29,6 +27,7 @@ import docking.widgets.fieldpanel.LayoutModel; import docking.widgets.fieldpanel.internal.EmptyLayoutBackgroundColorManager; import docking.widgets.fieldpanel.internal.LayoutBackgroundColorManager; import docking.widgets.fieldpanel.internal.PaintContext; +import ghidra.util.DateUtils; import ghidra.util.Msg; import ghidra.util.task.TaskMonitor; @@ -60,7 +59,8 @@ public class CodeUnitPrintable implements Printable { } public CodeUnitPrintable(LayoutModel lm, int startIndex, int endIndex, double scaleAmount, - TaskMonitor monitor, PrintOptionsDialog pod, Book book, PrinterJob job, Date startDate) { + TaskMonitor monitor, PrintOptionsDialog pod, Book book, PrinterJob job, + Date startDate) { this.lm = lm; this.startIndex = startIndex; this.endIndex = endIndex; @@ -71,14 +71,17 @@ public class CodeUnitPrintable implements Printable { this.job = job; this.startDate = startDate; - if (pod.getMonochrome()) + if (pod.getMonochrome()) { PAINT_CONTEXT.setPrintColor(Color.BLACK); - else + } + else { PAINT_CONTEXT.setPrintColor(null); + } } public CodeUnitPrintable(LayoutModel lm, java.util.List layouts, double scaleAmount, - TaskMonitor monitor, PrintOptionsDialog pod, Book book, PrinterJob job, Date startDate) { + TaskMonitor monitor, PrintOptionsDialog pod, Book book, PrinterJob job, + Date startDate) { this.lm = lm; this.layouts = layouts; this.scaleAmount = scaleAmount; @@ -88,10 +91,12 @@ public class CodeUnitPrintable implements Printable { this.job = job; this.startDate = startDate; - if (pod.getMonochrome()) + if (pod.getMonochrome()) { PAINT_CONTEXT.setPrintColor(Color.BLACK); - else + } + else { PAINT_CONTEXT.setPrintColor(null); + } } @Override @@ -107,13 +112,12 @@ public class CodeUnitPrintable implements Printable { return NO_SUCH_PAGE; } - Rectangle rect = - new Rectangle((int) pageFormat.getImageableWidth(), - (int) pageFormat.getImageableHeight()); - if (scaleAmount < 1.0) - rect = - new Rectangle((int) (pageFormat.getImageableWidth() / scaleAmount), - (int) (pageFormat.getImageableHeight() / scaleAmount)); + Rectangle rect = new Rectangle((int) pageFormat.getImageableWidth(), + (int) pageFormat.getImageableHeight()); + if (scaleAmount < 1.0) { + rect = new Rectangle((int) (pageFormat.getImageableWidth() / scaleAmount), + (int) (pageFormat.getImageableHeight() / scaleAmount)); + } LayoutBackgroundColorManager ls = new EmptyLayoutBackgroundColorManager(PAINT_CONTEXT.getBackground()); @@ -128,8 +132,7 @@ public class CodeUnitPrintable implements Printable { GraphicsUtils.drawString(null, g2, job.getJobName(), 0, metrics.getMaxAscent()); } if (pod.getPrintDate()) { - DateFormat format = new SimpleDateFormat("MM/dd/yy h:mm:ss a"); - String dateTime = format.format(startDate); + String dateTime = DateUtils.formatDateTimestamp(startDate); GraphicsUtils.drawString(null, g2, dateTime, 0, (int) bottomPos); } if (pod.getPrintPageNum()) { @@ -139,16 +142,19 @@ public class CodeUnitPrintable implements Printable { (int) bottomPos); } g2.setFont(originalFont); - if (pod.showHeader()) + if (pod.showHeader()) { g2.translate(0, pod.getHeaderHeight()); + } - if (scaleAmount < 1.0) + if (scaleAmount < 1.0) { g2.transform(AffineTransform.getScaleInstance(scaleAmount, scaleAmount)); + } if (layouts != null) { //If no layouts, ignore blank page - if (layouts.size() == 0) + if (layouts.size() == 0) { return NO_SUCH_PAGE; + } for (int i = 0; i < layouts.size(); i++) { Layout layout = layouts.get(i); try { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/program/flatapi/FlatProgramAPI.java b/Ghidra/Features/Base/src/main/java/ghidra/program/flatapi/FlatProgramAPI.java index 3fd74f1a4a..dfcb898367 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/program/flatapi/FlatProgramAPI.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/program/flatapi/FlatProgramAPI.java @@ -16,8 +16,8 @@ package ghidra.program.flatapi; import java.io.*; -import java.util.ArrayList; -import java.util.List; +import java.text.SimpleDateFormat; +import java.util.*; import java.util.stream.Collectors; import ghidra.app.cmd.comments.SetCommentCmd; @@ -42,7 +42,6 @@ import ghidra.program.model.util.CodeUnitInsertionException; import ghidra.program.util.AddressEvaluator; import ghidra.program.util.string.*; import ghidra.util.Conv; -import ghidra.util.SystemUtilities; import ghidra.util.ascii.AsciiCharSetRecognizer; import ghidra.util.datastruct.Accumulator; import ghidra.util.datastruct.ListAccumulator; @@ -2456,8 +2455,9 @@ public class FlatProgramAPI { folder.createFile(program.getName(), program, monitor); } catch (DuplicateFileException e) { - folder.createFile(program.getName() + "_" + SystemUtilities.currentTimeStamp(), program, - monitor); + SimpleDateFormat formatter = new SimpleDateFormat("dd.MMM.yyyy_HH.mm.ss"); + String time = formatter.format(new Date()); + folder.createFile(program.getName() + "_" + time, program, monitor); } finally { if (program == currentProgram) { diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/GenericDateCellRenderer.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/GenericDateCellRenderer.java index 7a65b1d9a0..61ebedb432 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/GenericDateCellRenderer.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/GenericDateCellRenderer.java @@ -16,13 +16,13 @@ package docking.widgets; import java.awt.Component; -import java.text.DateFormat; import java.util.Date; import javax.swing.JComponent; import docking.widgets.table.GTableCellRenderer; import docking.widgets.table.GTableCellRenderingData; +import ghidra.util.DateUtils; /** * The JDK-provided DateRenderer does not inherit the backgrounds and such properly. @@ -30,16 +30,15 @@ import docking.widgets.table.GTableCellRenderingData; * column does not have the correct background. This fixes that. */ public class GenericDateCellRenderer extends GTableCellRenderer { - private DateFormat format; + private String toolTip; - public GenericDateCellRenderer(DateFormat format, String toolTip) { - this.format = format; - this.toolTip = toolTip; + public GenericDateCellRenderer() { + this(null); } - public GenericDateCellRenderer(DateFormat format) { - this(format, null); + public GenericDateCellRenderer(String toolTip) { + this.toolTip = toolTip; } @Override @@ -47,7 +46,8 @@ public class GenericDateCellRenderer extends GTableCellRenderer { Date value = (Date) data.getValue(); - GTableCellRenderingData newData = data.copyWithNewValue(format.format(value)); + GTableCellRenderingData newData = + data.copyWithNewValue(DateUtils.formatDateTimestamp(value)); JComponent c = (JComponent) super.getTableCellRendererComponent(newData); if (toolTip != null) { diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/DirectoryTable.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/DirectoryTable.java index 21d621073c..c60565593f 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/DirectoryTable.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/DirectoryTable.java @@ -134,7 +134,7 @@ class DirectoryTable extends GTable implements GhidraFileChooserDirectoryModelIf column.setCellRenderer(new FileSizeRenderer()); column = columnModel.getColumn(DirectoryTableModel.TIME_COL); - column.setCellRenderer(new GenericDateCellRenderer(GhidraFileChooser.format)); + column.setCellRenderer(new GenericDateCellRenderer()); } private void maybeSelectItem(MouseEvent e) { diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/FileDropDownSelectionDataModel.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/FileDropDownSelectionDataModel.java index ba2197b301..fa6accee34 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/FileDropDownSelectionDataModel.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/FileDropDownSelectionDataModel.java @@ -25,6 +25,7 @@ import javax.swing.filechooser.FileSystemView; import docking.widgets.DropDownSelectionTextField; import docking.widgets.DropDownTextFieldDataModel; import docking.widgets.list.GListCellRenderer; +import ghidra.util.DateUtils; import ghidra.util.HTMLUtilities; import ghidra.util.exception.AssertException; @@ -130,7 +131,7 @@ public class FileDropDownSelectionDataModel implements DropDownTextFieldDataMode "" + HTMLUtilities.escapeHTML(file.getName()) + "" + "" + "Size:" + (isDir ? "0" : file.length()) + " bytes" + "" + "Last modified:" + - GhidraFileChooser.format.format(new Date(file.lastModified())) + "" + + DateUtils.formatDateTimestamp(new Date(file.lastModified())) + "" + ""; } diff --git a/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/GhidraFileChooser.java b/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/GhidraFileChooser.java index 602a2d11da..3a9d5a40a3 100644 --- a/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/GhidraFileChooser.java +++ b/Ghidra/Framework/Docking/src/main/java/docking/widgets/filechooser/GhidraFileChooser.java @@ -19,7 +19,6 @@ import java.awt.*; import java.awt.event.*; import java.io.File; import java.io.FileFilter; -import java.text.SimpleDateFormat; import java.util.*; import java.util.List; import java.util.regex.Matcher; @@ -126,8 +125,6 @@ public class GhidraFileChooser extends DialogComponentProvider return null; } - static final SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy hh:mm aaa"); - /** Instruction to display only files. */ public static final int FILES_ONLY = 0; /** Instruction to display only directories. */ diff --git a/Ghidra/Framework/Generic/src/main/java/ghidra/util/DateUtils.java b/Ghidra/Framework/Generic/src/main/java/ghidra/util/DateUtils.java index c138cedbdd..ecbcdfb569 100644 --- a/Ghidra/Framework/Generic/src/main/java/ghidra/util/DateUtils.java +++ b/Ghidra/Framework/Generic/src/main/java/ghidra/util/DateUtils.java @@ -24,8 +24,20 @@ import java.util.*; import ghidra.util.exception.AssertException; public class DateUtils { - private static final String DATEFORMAT_STR = "MM/dd/yyyy"; - private static final String TIMEFORMAT_STR = "h:mm"; + + /** Example: Oct 31, 2019 03:24 PM */ + private static final String DATE_TIME_FORMAT_STRING = "MMM dd, yyyy hh:mm aaa"; + private static final String DATE_FORMAT_STRING = "MM/dd/yyyy"; + private static final String TIME_FORMAT_STRING = "h:mm"; + + private static final ThreadLocal DATE_TIME_FORMAT = + ThreadLocal.withInitial(() -> new SimpleDateFormat(DATE_TIME_FORMAT_STRING)); + + private static final ThreadLocal DATE_FORMAT = + ThreadLocal.withInitial(() -> new SimpleDateFormat(DATE_FORMAT_STRING)); + + private static final ThreadLocal TIME_FORMAT = + ThreadLocal.withInitial(() -> new SimpleDateFormat(TIME_FORMAT_STRING)); public static final long MS_PER_SEC = 1000; public static final long MS_PER_MIN = MS_PER_SEC * 60; @@ -172,7 +184,7 @@ public class DateUtils { public static Date normalizeDate(Date date) { try { - SimpleDateFormat sdf = new SimpleDateFormat(DATEFORMAT_STR); + SimpleDateFormat sdf = DATE_FORMAT.get(); return sdf.parse(sdf.format(date)); } catch (ParseException e) { @@ -201,19 +213,35 @@ public class DateUtils { return dayOfWeek == SATURDAY || dayOfWeek == SUNDAY; } + /** + * Formats the given date into a string. This is in contrast to + * {@link #formatDateTimestamp(Date)}, which will also return the time portion of the date. + * + * @param date the date to format + * @return the date string + */ public static String formatDate(Date date) { - SimpleDateFormat sdf = new SimpleDateFormat(DATEFORMAT_STR); - return sdf.format(date); + return DATE_FORMAT.get().format(date); } /** - * Returns the current local timezone time-of-day as an HOUR:MIN string. + * Formats the given date into a string that contains the date and time. This is in + * contrast to {@link #formatDate(Date)}, which only returns a date string. + * + * @param date the date to format + * @return the date and time string + */ + public static String formatDateTimestamp(Date date) { + return DATE_TIME_FORMAT.get().format(date); + } + + /** + * Returns the current local time zone time-of-day as an HOUR:MIN string. * * @return current time-of-day as "HOUR:MIN" */ public static String getTimeNow() { - SimpleDateFormat sdf = new SimpleDateFormat(TIMEFORMAT_STR); - return sdf.format(new Date()); + return TIME_FORMAT.get().format(new Date()); } public static Date getDate(int year, int month, int day) { @@ -230,7 +258,7 @@ public class DateUtils { int days = 0; while (cal.getTime().compareTo(date2) < 0) { cal.add(Calendar.DAY_OF_MONTH, 1); - if (!DateUtils.isWeekend(cal) && !DateUtils.isHoliday(cal)) { + if (!isWeekend(cal) && !isHoliday(cal)) { days++; } } @@ -239,8 +267,8 @@ public class DateUtils { /** * Formats a millisecond duration as a English string expressing the number of - * hours, minutes and seconds in the duration. - *

+ * hours, minutes and seconds in the duration + * * @param millis Count of milliseconds of an elapsed duration. * @return String such as "5 hours, 3 mins, 22 secs". */ diff --git a/Ghidra/Framework/Generic/src/test/java/ghidra/util/DateUtilsTest.java b/Ghidra/Framework/Generic/src/test/java/ghidra/util/DateUtilsTest.java index cad272cc66..691ee10c62 100644 --- a/Ghidra/Framework/Generic/src/test/java/ghidra/util/DateUtilsTest.java +++ b/Ghidra/Framework/Generic/src/test/java/ghidra/util/DateUtilsTest.java @@ -15,49 +15,41 @@ */ package ghidra.util; -import java.util.Date; -import java.util.List; +import static org.junit.Assert.*; + +import java.util.Date; -import org.junit.Assert; import org.junit.Test; -import generic.test.AbstractGenericTest; +public class DateUtilsTest { -public class DateUtilsTest extends AbstractGenericTest { - - public DateUtilsTest() { - // nada + @Test + public void testFormatDate() { + Date date = new Date(1572896586687L); + assertEquals("11/04/2019", DateUtils.formatDate(date)); } - /** - * This test was moved here from DateUtils.main() - */ - //@Test - public void testHolidays() { - for (int year = 2012; year < 2020; year++) { - List holidays = DateUtils.getHolidays(year); - for (Date date : holidays) { - System.out.println(DateUtils.formatDate(date)); - } - } + @Test + public void testFormatDateTime() { + Date date = new Date(1572896586687L); + assertEquals("Nov 04, 2019 02:43 PM", DateUtils.formatDateTimestamp(date)); } @Test public void testFormatDuration() { - Assert.assertEquals("0 secs", DateUtils.formatDuration(100)); - Assert.assertEquals("0 secs", DateUtils.formatDuration(DateUtils.MS_PER_SEC - 1)); - Assert.assertEquals("1 secs", DateUtils.formatDuration(DateUtils.MS_PER_SEC)); - Assert.assertEquals("1 secs", DateUtils.formatDuration(DateUtils.MS_PER_SEC + 1)); - Assert.assertEquals("59 secs", DateUtils.formatDuration(DateUtils.MS_PER_MIN - 1)); - Assert.assertEquals("1 mins, 0 secs", DateUtils.formatDuration(DateUtils.MS_PER_MIN)); - Assert.assertEquals("1 mins, 1 secs", + assertEquals("0 secs", DateUtils.formatDuration(100)); + assertEquals("0 secs", DateUtils.formatDuration(DateUtils.MS_PER_SEC - 1)); + assertEquals("1 secs", DateUtils.formatDuration(DateUtils.MS_PER_SEC)); + assertEquals("1 secs", DateUtils.formatDuration(DateUtils.MS_PER_SEC + 1)); + assertEquals("59 secs", DateUtils.formatDuration(DateUtils.MS_PER_MIN - 1)); + assertEquals("1 mins, 0 secs", DateUtils.formatDuration(DateUtils.MS_PER_MIN)); + assertEquals("1 mins, 1 secs", DateUtils.formatDuration(DateUtils.MS_PER_MIN + DateUtils.MS_PER_SEC)); - Assert.assertEquals("23 hours, 59 mins, 59 secs", + assertEquals("23 hours, 59 mins, 59 secs", DateUtils.formatDuration(DateUtils.MS_PER_DAY - 1)); - Assert.assertEquals("1 days, 0 hours, 0 mins, 0 secs", + assertEquals("1 days, 0 hours, 0 mins, 0 secs", DateUtils.formatDuration(DateUtils.MS_PER_DAY)); - Assert.assertEquals("1 days, 0 hours, 0 mins, 0 secs", + assertEquals("1 days, 0 hours, 0 mins, 0 secs", DateUtils.formatDuration(DateUtils.MS_PER_DAY + 1)); } - } diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatable/ProjectDataTablePanel.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatable/ProjectDataTablePanel.java index 88843e5632..12814d9c0f 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatable/ProjectDataTablePanel.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatable/ProjectDataTablePanel.java @@ -18,8 +18,6 @@ package ghidra.framework.main.datatable; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.text.DateFormat; -import java.text.SimpleDateFormat; import java.util.*; import java.util.List; @@ -35,8 +33,7 @@ import docking.widgets.table.threaded.*; import ghidra.framework.main.FrontEndPlugin; import ghidra.framework.model.*; import ghidra.framework.plugintool.PluginTool; -import ghidra.util.HelpLocation; -import ghidra.util.SystemUtilities; +import ghidra.util.*; import ghidra.util.bean.GGlassPane; import ghidra.util.bean.GGlassPanePainter; @@ -117,16 +114,12 @@ public class ProjectDataTablePanel extends JPanel { table.dispose(); // this will dispose the gTable as well } - /** - * Set the help location for the data tree. - */ public void setHelpLocation(HelpLocation helpLocation) { HelpService help = Help.getHelpService(); help.registerHelp(table, helpLocation); } private class DateCellRenderer extends GTableCellRenderer { - DateFormat formatter = new SimpleDateFormat("MMM dd, yyyy HH:mm"); @Override public Component getTableCellRendererComponent(GTableCellRenderingData data) { @@ -136,7 +129,7 @@ public class ProjectDataTablePanel extends JPanel { Object value = data.getValue(); if (value != null) { - renderer.setText(formatter.format((Date) value)); + renderer.setText(DateUtils.formatDateTimestamp((Date) value)); } else { renderer.setText(""); diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/CheckoutsPanel.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/CheckoutsPanel.java index 3aecd4941d..90ad4f0a74 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/CheckoutsPanel.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/CheckoutsPanel.java @@ -17,7 +17,6 @@ package ghidra.framework.main.datatree; import java.awt.*; import java.io.IOException; -import java.text.SimpleDateFormat; import java.util.HashSet; import java.util.Set; @@ -52,7 +51,6 @@ public class CheckoutsPanel extends JPanel { private DomainFile domainFile; private CheckoutsTableModel tableModel; private GTable table; - private SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy MMM dd hh:mm aaa"); private MyFolderListener listener; private User user; @@ -62,8 +60,8 @@ public class CheckoutsPanel extends JPanel { * @param parent parent dialog * @param tool tool to get project data for adding a listener * @param user user that is logged in - * @param domainFile domain file to view checkouts - * @throws IOException + * @param domainFile domain file to view checkouts + * @param checkouts the checkouts to show */ public CheckoutsPanel(Component parent, PluginTool tool, User user, DomainFile domainFile, ItemCheckoutStatus[] checkouts) { @@ -115,8 +113,7 @@ public class CheckoutsPanel extends JPanel { column = columnModel.getColumn(CheckoutsTableModel.DATE_COL); column.setPreferredWidth(120); - column.setCellRenderer( - new GenericDateCellRenderer(dateFormatter, "Date when file was checked out")); + column.setCellRenderer(new GenericDateCellRenderer("Date when file was checked out")); columnModel.getColumn(CheckoutsTableModel.VERSION_COL).setPreferredWidth(50); columnModel.getColumn(CheckoutsTableModel.USER_COL).setPreferredWidth(80); columnModel.getColumn(CheckoutsTableModel.HOST_COL).setPreferredWidth(120); @@ -127,8 +124,8 @@ public class CheckoutsPanel extends JPanel { private void terminateCheckout(int[] rows) { Set toTerminate = new HashSet<>(); - for (int i = 0; i < rows.length; i++) { - ItemCheckoutStatus item = tableModel.getRowObject(rows[i]); + for (int row : rows) { + ItemCheckoutStatus item = tableModel.getRowObject(row); toTerminate.add(item); } diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/FindCheckoutsDialog.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/FindCheckoutsDialog.java index 145e20fd1f..8ca8e238da 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/FindCheckoutsDialog.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/FindCheckoutsDialog.java @@ -18,7 +18,6 @@ package ghidra.framework.main.datatree; import java.awt.Component; import java.awt.Dimension; import java.awt.event.MouseEvent; -import java.text.SimpleDateFormat; import java.util.*; import javax.swing.BorderFactory; @@ -38,8 +37,7 @@ import ghidra.framework.main.projectdata.actions.VersionControlUndoCheckOutActio import ghidra.framework.model.DomainFile; import ghidra.framework.model.DomainFolder; import ghidra.framework.plugintool.Plugin; -import ghidra.util.HelpLocation; -import ghidra.util.Msg; +import ghidra.util.*; /** * Dialog that shows all checkouts in a specific folder and all of its subfolders. @@ -51,7 +49,6 @@ public class FindCheckoutsDialog extends DialogComponentProvider { private Plugin plugin; private DomainFolder folder; private JTable table; - private SimpleDateFormat formatter; private VersionControlCheckInAction checkInAction; private VersionControlUndoCheckOutAction undoCheckOutAction; private boolean showMessage = true; @@ -61,7 +58,6 @@ public class FindCheckoutsDialog extends DialogComponentProvider { super("Find Checkouts"); this.plugin = plugin; this.folder = folder; - formatter = new SimpleDateFormat("yyyy MMM dd hh:mm aaa"); create(); setHelpLocation(new HelpLocation("VersionControl", "Find_Checkouts")); } @@ -165,7 +161,7 @@ public class FindCheckoutsDialog extends DialogComponentProvider { Object value = data.getValue(); if (value instanceof Date) { - setText(formatter.format((Date) value)); + setText(DateUtils.formatDateTimestamp((Date) value)); } setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0)); diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/VersionHistoryPanel.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/VersionHistoryPanel.java index a36a39fa3d..b57b691bdd 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/VersionHistoryPanel.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/VersionHistoryPanel.java @@ -21,7 +21,6 @@ import java.awt.dnd.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.IOException; -import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -59,7 +58,6 @@ public class VersionHistoryPanel extends JPanel implements Draggable { private String domainFilePath; private VersionHistoryTableModel tableModel; private GTable table; - private SimpleDateFormat formatter; private DragSource dragSource; private DragGestureAdapter dragGestureAdapter; @@ -87,7 +85,6 @@ public class VersionHistoryPanel extends JPanel implements Draggable { super(new BorderLayout()); this.tool = tool; create(); - formatter = new SimpleDateFormat("yyyy MMM dd hh:mm aaa"); if (enableUserInteraction) { setUpDragSite(); table.addMouseListener(new MyMouseListener()); @@ -389,7 +386,7 @@ public class VersionHistoryPanel extends JPanel implements Draggable { int col = data.getColumnModelIndex(); if (value instanceof Date) { - setText(formatter.format((Date) value)); + setText(DateUtils.formatDateTimestamp((Date) value)); } setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0)); diff --git a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/VersionHistoryTableModel.java b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/VersionHistoryTableModel.java index bc2bb88188..b75171d500 100644 --- a/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/VersionHistoryTableModel.java +++ b/Ghidra/Framework/Project/src/main/java/ghidra/framework/main/datatree/VersionHistoryTableModel.java @@ -75,9 +75,6 @@ class VersionHistoryTableModel extends AbstractSortedTableModel { return columnNames[column]; } - /** - * Refresh the table model. - */ void refresh(Version[] newVersions) { List newVersionList = new ArrayList<>(); for (Version version : newVersions) { @@ -98,7 +95,7 @@ class VersionHistoryTableModel extends AbstractSortedTableModel { public Object getColumnValueForRow(Version version, int columnIndex) { switch (columnIndex) { case VERSION_COL: - return new Integer(version.getVersion()); + return version.getVersion(); case DATE_COL: return new Date(version.getCreateTime()); case USER_COL: diff --git a/Ghidra/Framework/Utility/src/main/java/ghidra/util/SystemUtilities.java b/Ghidra/Framework/Utility/src/main/java/ghidra/util/SystemUtilities.java index ceedb03a61..4bd61e89f1 100644 --- a/Ghidra/Framework/Utility/src/main/java/ghidra/util/SystemUtilities.java +++ b/Ghidra/Framework/Utility/src/main/java/ghidra/util/SystemUtilities.java @@ -19,8 +19,8 @@ import java.awt.Font; import java.io.*; import java.net.URL; import java.net.URLDecoder; -import java.text.SimpleDateFormat; -import java.util.*; +import java.util.Objects; +import java.util.StringTokenizer; import java.util.function.Supplier; import javax.swing.SwingUtilities; @@ -35,8 +35,6 @@ import utilities.util.reflection.ReflectionUtilities; */ public class SystemUtilities { - private final static String DATE_TIME_FORMAT = "MMM d yyyy HH:mm:ss"; - private static String userName; /** @@ -168,32 +166,6 @@ public class SystemUtilities { return font.deriveFont((float) FONT_SIZE_OVERRIDE_VALUE.intValue()); } - /** - * returns the current date/time using default DATE/TIME format - * @return the current date/time using default DATE/TIME format - */ - public static String getDateTime() { - return getDateTime(DATE_TIME_FORMAT); - } - - public static String currentTimeStamp() { - SimpleDateFormat formatter = new SimpleDateFormat("dd.MMM.yyyy_HH.mm.ss"); - return formatter.format(new Date()); - } - - /** - * returns the current date/time using specified DATE/TIME format - * - * @param dateTimeFormat the format for the time - * @return the formatted date - */ - public static String getDateTime(String dateTimeFormat) { - SimpleDateFormat formatter = new SimpleDateFormat(dateTimeFormat, Locale.getDefault()); - formatter.setTimeZone(TimeZone.getDefault()); - - return formatter.format(new Date()); - } - /** * Returns true if the system is running during a test. *