summaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/org/unitConverter/converterGUI/UnitConverterGUI.java97
-rw-r--r--src/main/java/org/unitConverter/unit/UnitDatabase.java34
-rw-r--r--src/main/resources/dimensionfile.txt18
-rw-r--r--src/main/resources/metric_exceptions.txt19
-rw-r--r--src/main/resources/unitsfile.txt267
5 files changed, 412 insertions, 23 deletions
diff --git a/src/main/java/org/unitConverter/converterGUI/UnitConverterGUI.java b/src/main/java/org/unitConverter/converterGUI/UnitConverterGUI.java
index c046846..ee1bcc3 100644
--- a/src/main/java/org/unitConverter/converterGUI/UnitConverterGUI.java
+++ b/src/main/java/org/unitConverter/converterGUI/UnitConverterGUI.java
@@ -23,6 +23,7 @@ import java.awt.GridLayout;
import java.awt.event.KeyEvent;
import java.io.BufferedWriter;
import java.io.IOException;
+import java.io.InputStream;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
@@ -36,6 +37,7 @@ import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.NoSuchElementException;
+import java.util.Scanner;
import java.util.Set;
import java.util.function.Predicate;
import java.util.stream.Collectors;
@@ -93,13 +95,11 @@ final class UnitConverterGUI {
/** The default place where settings are stored. */
private static final String DEFAULT_SETTINGS_FILEPATH = "settings.txt";
/** The default place where units are stored. */
- private static final Path DEFAULT_UNITS_FILE = Path.of("unitsfile.txt");
+ private static final String DEFAULT_UNITS_FILEPATH = "/unitsfile.txt";
/** The default place where dimensions are stored. */
- private static final Path DEFAULT_DIMENSION_FILE = Path
- .of("dimensionfile.txt");
+ private static final String DEFAULT_DIMENSIONS_FILEPATH = "/dimensionfile.txt";
/** The default place where exceptions are stored. */
- private static final Path DEFAULT_EXCEPTIONS_FILE = Path
- .of("metric_exceptions.txt");
+ private static final String DEFAULT_EXCEPTIONS_FILEPATH = "/metric_exceptions.txt";
/**
* Adds default units and dimensions to a database.
@@ -131,6 +131,41 @@ final class UnitConverterGUI {
}
/**
+ * Gets the text of a resource file as a set of strings (each one is one
+ * line of the text).
+ *
+ * @param filename filename to get resource from
+ * @return contents of file
+ * @since 2021-03-27
+ */
+ public static final List<String> getLinesFromResource(String filename) {
+ final List<String> lines = new ArrayList<>();
+
+ try (InputStream stream = inputStream(filename);
+ Scanner scanner = new Scanner(stream)) {
+ while (scanner.hasNextLine()) {
+ lines.add(scanner.nextLine());
+ }
+ } catch (final IOException e) {
+ throw new AssertionError(
+ "Error occurred while loading file " + filename, e);
+ }
+
+ return lines;
+ }
+
+ /**
+ * Gets an input stream for a resource file.
+ *
+ * @param filepath file to use as resource
+ * @return obtained Path
+ * @since 2021-03-27
+ */
+ private static final InputStream inputStream(String filepath) {
+ return UnitConverterGUI.class.getResourceAsStream(filepath);
+ }
+
+ /**
* @return {@code line} with any comments removed.
* @since 2021-03-13
*/
@@ -161,9 +196,9 @@ final class UnitConverterGUI {
/** A boolean remembering whether or not one-way conversion is on */
private boolean oneWay = true;
-
/** The prefix rule */
private DefaultPrefixRepetitionRule prefixRule = null;
+
// conditions for existence of From and To entries
// used for one-way conversion
private final MutablePredicate<String> fromExistenceCondition = new MutablePredicate<>(
@@ -196,21 +231,44 @@ final class UnitConverterGUI {
DefaultPrefixRepetitionRule.NO_RESTRICTION);
Presenter.addDefaults(this.database);
- this.database.loadUnitsFile(DEFAULT_UNITS_FILE);
- this.database.loadDimensionFile(DEFAULT_DIMENSION_FILE);
+ // load units and prefixes
+ try (final InputStream units = inputStream(DEFAULT_UNITS_FILEPATH)) {
+ this.database.loadUnitsFromStream(units);
+ } catch (final IOException e) {
+ throw new AssertionError("Loading of unitsfile.txt failed.", e);
+ }
+
+ // load dimensions
+ try (final InputStream dimensions = inputStream(
+ DEFAULT_DIMENSIONS_FILEPATH)) {
+ this.database.loadDimensionsFromStream(dimensions);
+ } catch (final IOException e) {
+ throw new AssertionError("Loading of dimensionfile.txt failed.", e);
+ }
// load metric exceptions
try {
- this.metricExceptions = Files.readAllLines(DEFAULT_EXCEPTIONS_FILE)
- .stream().map(Presenter::withoutComments)
- .filter(s -> !s.isBlank()).collect(Collectors.toSet());
+ this.metricExceptions = new HashSet<>();
+ try (InputStream exceptions = inputStream(
+ DEFAULT_EXCEPTIONS_FILEPATH);
+ Scanner scanner = new Scanner(exceptions)) {
+ while (scanner.hasNextLine()) {
+ final String line = Presenter
+ .withoutComments(scanner.nextLine());
+ if (!line.isBlank()) {
+ this.metricExceptions.add(line);
+ }
+ }
+ }
} catch (final IOException e) {
throw new AssertionError("Loading of metric_exceptions.txt failed.",
e);
}
// load settings - requires database to exist
- this.loadSettings();
+ if (Files.exists(this.getSettingsFile())) {
+ this.loadSettings();
+ }
// a comparator that can be used to compare prefix names
// any name that does not exist is less than a name that does.
@@ -1139,17 +1197,10 @@ final class UnitConverterGUI {
infoPanel.add(infoTextArea);
// get info text
- final String infoText;
- try {
- final Path aboutFile = Path.of("src", "main", "resources",
- "about.txt");
- infoText = Files.readAllLines(aboutFile).stream()
- .map(Presenter::withoutComments)
- .collect(Collectors.joining("\n"));
- } catch (final IOException e) {
- throw new AssertionError("I/O exception loading about.txt",
- e);
- }
+ final String infoText = Presenter
+ .getLinesFromResource("/about.txt").stream()
+ .map(Presenter::withoutComments)
+ .collect(Collectors.joining("\n"));
infoTextArea.setText(infoText);
}
diff --git a/src/main/java/org/unitConverter/unit/UnitDatabase.java b/src/main/java/org/unitConverter/unit/UnitDatabase.java
index 000acf5..6322fef 100644
--- a/src/main/java/org/unitConverter/unit/UnitDatabase.java
+++ b/src/main/java/org/unitConverter/unit/UnitDatabase.java
@@ -18,6 +18,7 @@ package org.unitConverter.unit;
import java.io.FileNotFoundException;
import java.io.IOException;
+import java.io.InputStream;
import java.math.BigDecimal;
import java.nio.file.Files;
import java.nio.file.Path;
@@ -34,6 +35,7 @@ import java.util.Map;
import java.util.Map.Entry;
import java.util.NoSuchElementException;
import java.util.Objects;
+import java.util.Scanner;
import java.util.Set;
import java.util.function.BiFunction;
import java.util.function.Function;
@@ -1880,6 +1882,22 @@ public final class UnitDatabase {
}
/**
+ * Adds all dimensions from a {@code InputStream}. Otherwise, works like
+ * {@link #loadDimensionFile}.
+ *
+ * @param stream stream to load from
+ * @since 2021-03-27
+ */
+ public void loadDimensionsFromStream(final InputStream stream) {
+ try (final Scanner scanner = new Scanner(stream)) {
+ long lineCounter = 0;
+ while (scanner.hasNextLine()) {
+ this.addDimensionFromLine(scanner.nextLine(), ++lineCounter);
+ }
+ }
+ }
+
+ /**
* Adds all units from a file, using data from the database to parse them.
* <p>
* Each line in the file should consist of a name and an expression (parsed
@@ -1919,6 +1937,22 @@ public final class UnitDatabase {
}
/**
+ * Adds all units from a {@code InputStream}. Otherwise, works like
+ * {@link #loadUnitsFile}.
+ *
+ * @param stream stream to load from
+ * @since 2021-03-27
+ */
+ public void loadUnitsFromStream(InputStream stream) {
+ try (final Scanner scanner = new Scanner(stream)) {
+ long lineCounter = 0;
+ while (scanner.hasNextLine()) {
+ this.addUnitOrPrefixFromLine(scanner.nextLine(), ++lineCounter);
+ }
+ }
+ }
+
+ /**
* @return a map mapping prefix names to prefixes
* @since 2019-04-13
* @since v0.2.0
diff --git a/src/main/resources/dimensionfile.txt b/src/main/resources/dimensionfile.txt
new file mode 100644
index 0000000..3485de5
--- /dev/null
+++ b/src/main/resources/dimensionfile.txt
@@ -0,0 +1,18 @@
+# A file for the unit dimensions in my unit converter program
+
+# SI Base Dimensions
+# ! means "look for an existing dimension which I will load at the start"
+# This is necessary because every dimension must be defined by others, and I need somewhere to start.
+
+# I have excluded electric current, quantity and luminous intensity since their units are exclusively SI.
+
+LENGTH !
+MASS !
+TIME !
+TEMPERATURE !
+
+# Derived Dimensions
+AREA LENGTH^2
+VOLUME LENGTH^3
+VELOCITY LENGTH / TIME
+ENERGY MASS * VELOCITY^2 \ No newline at end of file
diff --git a/src/main/resources/metric_exceptions.txt b/src/main/resources/metric_exceptions.txt
new file mode 100644
index 0000000..73748c0
--- /dev/null
+++ b/src/main/resources/metric_exceptions.txt
@@ -0,0 +1,19 @@
+# This is a list of exceptions for the one-way conversion mode
+# Units in this list will be included in both From: and To:
+# regardless of whether or not one-way conversion is enabled.
+
+tempC
+tempCelsius
+s
+second
+min
+minute
+h
+hour
+d
+day
+wk
+week
+gregorianmonth
+gregorianyear
+km/h \ No newline at end of file
diff --git a/src/main/resources/unitsfile.txt b/src/main/resources/unitsfile.txt
new file mode 100644
index 0000000..eafe885
--- /dev/null
+++ b/src/main/resources/unitsfile.txt
@@ -0,0 +1,267 @@
+# A file for the units in my unit converter program
+
+# SI Base Units
+# ! means "look for an existing unit which I will load at the start"
+# This is necessary because every unit must be defined by others, and I need somewhere to start.
+
+metre !
+kilogram !
+second !
+ampere !
+kelvin !
+mole !
+candela !
+
+# Symbols and aliases for base units
+
+meter metre
+m metre
+kg kilogram
+s second
+A ampere
+K kelvin
+mol mole
+cd candela
+
+# the bit and byte, units of information
+
+bit !
+b bit
+byte 8 bit
+B byte
+
+# SI prefixes
+
+deca- 10
+deka- deca
+hecto- 100
+kilo- 1e3
+mega- 1e6
+giga- 1e9
+tera- 1e12
+peta- 1e15
+exa- 1e18
+zetta- 1e21
+yotta- 1e24
+
+deci- 1e-1
+centi- 1e-2
+milli- 1e-3
+micro- 1e-6
+nano- 1e-9
+pico- 1e-12
+femto- 1e-15
+atto- 1e-18
+zepto- 1e-21
+yocto- 1e-24
+
+da- deca
+D- deca
+h- hecto
+H- hecto
+k- kilo
+K- kilo
+M- mega
+G- giga
+T- tera
+P- peta
+E- exa
+Z- zetta
+Y- yotta
+
+d- deci
+c- centi
+m- milli
+u- micro
+n- nano
+p- pico
+f- femto
+a- atto
+z- zepto
+y- yocto
+
+# Binary prefixes (i.e. metric but 1024 replaces 1000)
+
+kibi- 1024^1
+mebi- 1024^2
+gibi- 1024^3
+tebi- 1024^4
+pebi- 1024^5
+exbi- 1024^6
+Ki- kibi
+Mi- mebi
+Gi- gibi
+Ti- tebi
+Pi- pebi
+Ei- exbi
+
+# Derived SI units
+# Note: it is best to have these before any non-SI units
+
+newton kg m / s^2
+N newton
+pascal N / m^2
+Pa pascal
+joule N m
+J joule
+watt J/s
+W watt
+coulomb A s
+C coulomb
+volt W/A
+V volt
+ohm V/A
+siemens A/V
+S siemens
+farad C/V
+F farad
+weber V s
+Wb weber
+henry V s / A
+H henry
+tesla Wb / m^2
+T tesla
+hertz 1 / s
+Hz hertz
+
+gram millikg
+g gram
+
+# Angle units and constants
+
+# Tau is the circle constant, equal to a circle's diameter divided by its radius
+tau 6.28318530717958
+# Another common circle constant
+pi tau / 2
+
+radian m / m
+rad radian
+steradian m^2 / m^2
+sr steradian
+degree tau / 360 radian
+deg degree
+° degree
+
+# Nonlinear units, which are not supported by the file reader and must be defined manually
+# Use tempC(100) for 100 degrees Celsius
+
+tempCelsius !
+tempFahrenheit !
+tempC tempCelsius
+tempF tempFahrenheit
+
+# Common time units
+minute 60 second
+min minute
+hour 3600 second
+h hour
+day 86400 second
+d day
+week 7 day
+wk week
+julianyear 365.25 day
+gregorianyear 365.2425 day
+gregorianmonth gregorianyear / 12
+
+# Other non-SI "metric" units
+litre 0.001 m^3
+liter litre
+l litre
+L litre
+tonne 1000 kg
+t tonne
+are 100 m^2
+hectare hectoare
+arcminute 1 / 60 degree
+arcmin arcminute
+arcsecond 1 / 60 arcminute
+arcsec arcsecond
+
+# constants
+waterdensity kilogram / litre
+
+# Imperial length units
+foot 0.3048 m
+ft foot
+inch foot / 12
+in inch
+yard 3 foot
+yd yard
+mile 1760 yard
+mi mile
+
+# Compressed notation
+kph km / hour
+mph mile / hour
+
+# Imperial weight units
+pound 0.45359237 kg
+lb pound
+ounce pound / 16
+oz ounce
+stone 14 lb
+UShundredweight 100 lb
+UKhundredweight 8 stone
+USimperialton 20 UShundredweight
+UKimperialton 10 UKhundredweight
+
+# Imperial volume units
+UKfluidounce ounce / waterdensity
+UKfloz UKfluidounce
+UKcup 10 UKfloz
+UKpint 2 UKcup
+UKquart 2 UKpint
+UKgallon 4 UKquart
+UKgal UKgallon
+
+USgallon 231 inch^3
+USgal USgallon
+USquart USgallon / 4
+USpint USquart / 2
+UScup USpint / 2
+USfluidounce UScup / 8
+USfloz USfluidounce
+UStablespoon USfluidounce / 2
+UStbsp UStablespoon
+USteaspoon UStablespoon / 3
+UStsp USteaspoon
+
+# Metric versions!
+# tsp = 5 mL, tbsp = 15 mL, floz = 30 mL, cup = 240 mL, pint = 480 mL, quart = 960 mL, gallon = 3840 mL
+# only metrictsp, metrictbsp and metriccup are common, the rest are derived from the US formulae with 240 mL cup
+metricteaspoon 5 mL
+teaspoon metricteaspoon
+tsp metricteaspoon
+metrictablespoon 3 metricteaspoon
+tablespoon metrictablespoon
+tbsp metrictablespoon
+metricfluidounce 2 metrictablespoon
+metriccup 8 metricfluidounce
+cup metriccup
+metricpint 2 metriccup
+pint metricpint
+metricquart 2 metricpint
+quart metricquart
+metricgallon 4 metricquart
+
+# Energy units
+calorie 4.18 J
+cal calorie
+Calorie kilocalorie
+Cal Calorie
+Wh W h
+
+# Extra units to only include in the dimension-based converter
+km km
+cm cm
+mm mm
+mg mg
+mL mL
+ml ml
+kJ kJ
+MJ MJ
+kWh kWh
+m/s m / s
+km/h km / h
+ft/s foot / s
+mi/h mile / hour \ No newline at end of file