From c2f519bc29e4f44def96296f63f60f45f647bf6c Mon Sep 17 00:00:00 2001 From: "Ole B. Rosentreter" Date: Sat, 28 Sep 2024 22:32:43 +0200 Subject: [PATCH] Initial project version --- pom.xml | 96 ++++++++++++++ .../de/laktatnebel/product/tools/Hello.java | 38 ++++++ .../tools/calculators/AbstractCalculator.java | 44 +++++++ .../tools/calculators/Calculators.java | 13 ++ .../tools/calculators/ServletInitializer.java | 13 ++ .../tools/calculators/output/OutPutter.java | 89 +++++++++++++ .../tools/calculators/run/RunPace.java | 49 +++++++ .../tools/calculators/run/RunPrediction.java | 124 ++++++++++++++++++ .../tools/calculators/run/SplitTimes.java | 95 ++++++++++++++ .../tools/calculators/util/Converter.java | 27 ++++ .../product/tools/calculators/util/Time.java | 75 +++++++++++ src/main/resources/application.properties | 3 + src/main/resources/log4j.xml | 17 +++ src/main/webapp/index.html | 10 ++ .../CalculatorApplicationTests.java | 13 ++ 15 files changed, 706 insertions(+) create mode 100644 pom.xml create mode 100644 src/main/java/de/laktatnebel/product/tools/Hello.java create mode 100644 src/main/java/de/laktatnebel/product/tools/calculators/AbstractCalculator.java create mode 100644 src/main/java/de/laktatnebel/product/tools/calculators/Calculators.java create mode 100644 src/main/java/de/laktatnebel/product/tools/calculators/ServletInitializer.java create mode 100644 src/main/java/de/laktatnebel/product/tools/calculators/output/OutPutter.java create mode 100644 src/main/java/de/laktatnebel/product/tools/calculators/run/RunPace.java create mode 100644 src/main/java/de/laktatnebel/product/tools/calculators/run/RunPrediction.java create mode 100644 src/main/java/de/laktatnebel/product/tools/calculators/run/SplitTimes.java create mode 100644 src/main/java/de/laktatnebel/product/tools/calculators/util/Converter.java create mode 100644 src/main/java/de/laktatnebel/product/tools/calculators/util/Time.java create mode 100644 src/main/resources/application.properties create mode 100644 src/main/resources/log4j.xml create mode 100644 src/main/webapp/index.html create mode 100644 src/test/java/de/laktatnebel/product/tools/calculators/CalculatorApplicationTests.java diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..3ceb6f7 --- /dev/null +++ b/pom.xml @@ -0,0 +1,96 @@ + + + 4.0.0 + de.laktatnebel.product.tools + Calculators + 0.0.1-SNAPSHOT + war + + + org.springframework.boot + spring-boot-starter-parent + 2.4.3 + + + + Calculators + Calculates Sport Issues + + + 15 + 2.3.1 + 2.1.0 + + + + + + javax.xml.bind + jaxb-api + ${jaxb-api.version} + + + de.laktatnebel.libs + utillib + ${utillib.version} + + + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + org.springframework.boot + spring-boot-starter-tomcat + provided + + + org.springframework.boot + spring-boot-starter-test + test + + + + + javax.xml.bind + jaxb-api + + + + de.laktatnebel.libs + utillib + + + org.slf4j + slf4j-api + + + org.slf4j + slf4j-log4j12 + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/src/main/java/de/laktatnebel/product/tools/Hello.java b/src/main/java/de/laktatnebel/product/tools/Hello.java new file mode 100644 index 0000000..c4b0e78 --- /dev/null +++ b/src/main/java/de/laktatnebel/product/tools/Hello.java @@ -0,0 +1,38 @@ +package de.laktatnebel.product.tools; + +/* +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.UriInfo; +*/ + +//@Path("/hello") +public class Hello { +// This method is called if TEXT_PLAIN is request + //@GET + // @Produces(MediaType.TEXT_PLAIN) + public String sayPlainTextHello() { + return "Hello Jersey"; + } + +// This method is called if XML is request + //@GET + //@Produces(MediaType.TEXT_XML) + public String sayXMLHello() { + return "" + " Hello Jersey" + ""; + } + +// This method is called if HTML is request + //@GET + //@Produces(MediaType.TEXT_HTML) + public String sayHtmlHello() { + return " " + "" + "Hello Jersey" + "" + + "

" + "Hello Jersey" + "

" + " "; + } +} diff --git a/src/main/java/de/laktatnebel/product/tools/calculators/AbstractCalculator.java b/src/main/java/de/laktatnebel/product/tools/calculators/AbstractCalculator.java new file mode 100644 index 0000000..b8f61e1 --- /dev/null +++ b/src/main/java/de/laktatnebel/product/tools/calculators/AbstractCalculator.java @@ -0,0 +1,44 @@ +package de.laktatnebel.product.tools.calculators; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public abstract class AbstractCalculator { + + /** Logger logger field */ + private static Logger logger = LoggerFactory.getLogger(AbstractCalculator.class); + + { + logger = null; + } + + /** + * @param clazz Class + * @return Logger + */ + public static Logger getLogger(Class clazz) { + if (AbstractCalculator.logger == null) { + AbstractCalculator.logger = LoggerFactory.getLogger(clazz); + } + return AbstractCalculator.logger; + } + /** + * + * @param logger Logger + * @param string String + */ + public static void log(Logger logger, String string) { + if (logger.isTraceEnabled()) { + logger.trace(string); + } else if (logger.isDebugEnabled()) { + logger.debug(string); + } else if (logger.isInfoEnabled()) { + logger.info(string); + } else if (logger.isWarnEnabled()) { + logger.warn(string); + } else if (logger.isErrorEnabled()) { + logger.error(string); + } + } + +} diff --git a/src/main/java/de/laktatnebel/product/tools/calculators/Calculators.java b/src/main/java/de/laktatnebel/product/tools/calculators/Calculators.java new file mode 100644 index 0000000..78ac347 --- /dev/null +++ b/src/main/java/de/laktatnebel/product/tools/calculators/Calculators.java @@ -0,0 +1,13 @@ +package de.laktatnebel.product.tools.calculators; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Calculators { + + public static void main(String[] args) { + SpringApplication.run(Calculators.class, args); + } + +} diff --git a/src/main/java/de/laktatnebel/product/tools/calculators/ServletInitializer.java b/src/main/java/de/laktatnebel/product/tools/calculators/ServletInitializer.java new file mode 100644 index 0000000..6cca604 --- /dev/null +++ b/src/main/java/de/laktatnebel/product/tools/calculators/ServletInitializer.java @@ -0,0 +1,13 @@ +package de.laktatnebel.product.tools.calculators; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; + +public class ServletInitializer extends SpringBootServletInitializer { + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(Calculators.class); + } + +} diff --git a/src/main/java/de/laktatnebel/product/tools/calculators/output/OutPutter.java b/src/main/java/de/laktatnebel/product/tools/calculators/output/OutPutter.java new file mode 100644 index 0000000..664e541 --- /dev/null +++ b/src/main/java/de/laktatnebel/product/tools/calculators/output/OutPutter.java @@ -0,0 +1,89 @@ +package de.laktatnebel.product.tools.calculators.output; + +import java.io.StringWriter; +import java.util.HashMap; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +public class OutPutter { + + private Document doc = null; + + public OutPutter() { + + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = null; + try { + builder = factory.newDocumentBuilder(); + } catch (ParserConfigurationException e) { + e.printStackTrace(); + throw new RuntimeException("Error converting to String", e); + } + Document doc = builder.newDocument(); + + Element root = doc.createElementNS("laktatnebel.de", "result"); + doc.appendChild(root); + + this.doc = doc; + } + + public void setNodeNameValue(String nodeName, String nodeValue) { + NodeList elementsByTagName = this.doc.getElementsByTagName("result"); + + Element e = getNodeNameValue(nodeName, nodeValue); + + elementsByTagName.item(0).appendChild(e); + } + + public Element getNodeNameValue(String nodeName, String nodeValue) { + Element e = this.doc.createElement(nodeName); + e.appendChild(this.doc.createTextNode(nodeValue)); + + return e; + } + + public void setNodeList(String nodeName, HashMap nameValueList) { + NodeList elementsByTagName = this.doc.getElementsByTagName("result"); + + Element mother = this.doc.createElement(nodeName); + + Element newChild = null; + for (String keyValue : nameValueList.keySet()) { + + newChild = getNodeNameValue(keyValue, nameValueList.get(keyValue)); + mother.appendChild(newChild); + elementsByTagName.item(0).appendChild(mother); + } + } + + @Override + public String toString() { + try { + StringWriter sw = new StringWriter(); + + TransformerFactory tf = TransformerFactory.newInstance(); + Transformer transformer = tf.newTransformer(); + transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); + transformer.setOutputProperty(OutputKeys.METHOD, "xml"); + transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); + + transformer.transform(new DOMSource(this.doc), new StreamResult(sw)); + return sw.toString(); + } catch (Exception ex) { + throw new RuntimeException("Error converting to String", ex); + } + } + +} \ No newline at end of file diff --git a/src/main/java/de/laktatnebel/product/tools/calculators/run/RunPace.java b/src/main/java/de/laktatnebel/product/tools/calculators/run/RunPace.java new file mode 100644 index 0000000..9290e5d --- /dev/null +++ b/src/main/java/de/laktatnebel/product/tools/calculators/run/RunPace.java @@ -0,0 +1,49 @@ +package de.laktatnebel.product.tools.calculators.run; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import de.laktatnebel.product.tools.calculators.AbstractCalculator; +import de.laktatnebel.product.tools.calculators.output.OutPutter; +import de.laktatnebel.product.tools.calculators.util.Converter; +import de.laktatnebel.product.tools.calculators.util.Time; + +@RestController +public class RunPace extends AbstractCalculator { + @SuppressWarnings("unused") + + /** + * Default constructor. + */ + public RunPace() { + // TODO Auto-generated constructor stub + } + + @RequestMapping(value = "/hello", method = RequestMethod.GET, produces = MediaType.TEXT_PLAIN_VALUE) + ResponseEntity helloWorld() { + return new ResponseEntity("Hello World!", HttpStatus.OK); + } + + @RequestMapping(value = "/pace/{dist}/{hour}/{min}/{sec}", method = RequestMethod.GET, produces = MediaType.TEXT_XML_VALUE) + @ResponseBody + ResponseEntity getPace(@PathVariable(name = "dist") Double distance, + @PathVariable(name = "hour") Integer hours, @PathVariable(name = "min") Integer minutes, + @PathVariable(name = "sec") Integer seconds) { + + Time originTime = new Time(hours, minutes, seconds); + Double kmPerHours = Converter.getKmPerHours(distance, originTime); + String pace = Converter.getPace(originTime, distance); + + OutPutter output = new OutPutter(); + output.setNodeNameValue("pace", pace); + output.setNodeNameValue("speed", Double.toString(kmPerHours)); + + return new ResponseEntity(output.toString(), HttpStatus.OK); + } +} diff --git a/src/main/java/de/laktatnebel/product/tools/calculators/run/RunPrediction.java b/src/main/java/de/laktatnebel/product/tools/calculators/run/RunPrediction.java new file mode 100644 index 0000000..ec967f0 --- /dev/null +++ b/src/main/java/de/laktatnebel/product/tools/calculators/run/RunPrediction.java @@ -0,0 +1,124 @@ +package de.laktatnebel.product.tools.calculators.run; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import de.laktatnebel.product.tools.calculators.AbstractCalculator; +import de.laktatnebel.product.tools.calculators.output.OutPutter; +import de.laktatnebel.product.tools.calculators.util.Converter; +import de.laktatnebel.product.tools.calculators.util.Time; + +@RestController +public class RunPrediction extends AbstractCalculator { + private static final double VDOT_PRECISION = 0.000125; + + @SuppressWarnings("unused") + + /** + * Default constructor. + */ + public RunPrediction() { + // TODO Auto-generated constructor stub + } + + @RequestMapping(value = "/predict/{dist}/{hour}/{min}/{sec}/{disttopredict}", method = RequestMethod.GET, produces = MediaType.TEXT_XML_VALUE) + @ResponseBody + ResponseEntity getPace(@PathVariable(name = "dist") Double distance, + @PathVariable(name = "hour") Integer hours, @PathVariable(name = "min") Integer minutes, + @PathVariable(name = "sec") Integer seconds, @PathVariable(name = "disttopredict") Double distancetopredict) { + + Time originTime = new Time(hours, minutes, seconds); + getLogger(RunPrediction.class).debug("originTime\t" + originTime.toString()); + getLogger(RunPrediction.class).debug("originTime\t" + originTime.toFormattedString()); + + JackDaniels originJD = new JackDaniels (originTime, distance); + getLogger(RunPrediction.class).debug("originJD\t" + originJD.toString()); + + String originPace = Converter.getPace(originTime, distance); + + Time estimatedTime = new Time(); + estimatedTime.setTimeMinutes(originTime.getMinutes() * Math.pow(distancetopredict / distance, 1.06)); + getLogger(RunPrediction.class).debug("estimatedTime\t" + estimatedTime.toString()); + getLogger(RunPrediction.class).debug("estimatedTime\t" + estimatedTime.toFormattedString()); + + JackDaniels estimatedJD = new JackDaniels(estimatedTime, distancetopredict); + getLogger(RunPrediction.class).debug("estimatedJD\t" + estimatedJD.toString()); + + String estimatedPace = Converter.getPace(estimatedTime, distancetopredict); + + int i=0; + Time predictedTime = new Time(); + predictedTime.setTimeHours(estimatedTime.getHours()); + JackDaniels predictedJD = new JackDaniels(estimatedTime, distancetopredict); + while (Math.abs(predictedJD.getVdot() / originJD.getVdot() - 1) > VDOT_PRECISION) { + if (estimatedJD.getVdot() > originJD.getVdot()) { + predictedTime.addSeconds(1); + } else { + predictedTime.addSeconds(-1); + } + + getLogger(RunPrediction.class).debug("predictedTime\t" + predictedTime.toString()); + getLogger(RunPrediction.class).debug("predictedTime\t" + predictedTime.toFormattedString()); + + predictedJD = new JackDaniels(predictedTime, distancetopredict); + getLogger(RunPrediction.class).debug("predictedJD\t" + predictedJD.toString()); + + if (++i >= 100 ) break; + } + + String predictedPace = Converter.getPace(predictedTime, distancetopredict); + + Double kmPerHours = Converter.getKmPerHours(distance, originTime); + Double meterPerMin = Converter.getMeterPerMin(distance, originTime); + + OutPutter output = new OutPutter(); + output.setNodeNameValue("pace_min-km", originPace); + output.setNodeNameValue("speed_km-h", Double.toString(kmPerHours)); + output.setNodeNameValue("meter-per-min", Double.toString(meterPerMin)); + output.setNodeNameValue("vO2", Double.toString(originJD.getVo2())); + output.setNodeNameValue("fvO2", Double.toString(originJD.getFvo2())); + output.setNodeNameValue("vdot", Double.toString(originJD.vdot)); + output.setNodeNameValue("distancetopredict", Double.toString(distancetopredict)); + output.setNodeNameValue("estimatedTime", estimatedTime.toFormattedString()); + output.setNodeNameValue("estimatedPace_min-km", estimatedPace); + output.setNodeNameValue("predictedTime", predictedTime.toFormattedString()); + output.setNodeNameValue("predictedPace_min-km", predictedPace); + + return new ResponseEntity(output.toString(), HttpStatus.OK); + } + + private class JackDaniels { + private Double vo2 = 0.0; + private Double fvo2 = 0.0; + private Double vdot = 0.0; + + public JackDaniels(Time originTime, Double distance) { + this.vo2 = 0.000104 * Math.pow(Converter.getMeterPerMin(distance, originTime), 2) + 0.182258 * Converter.getMeterPerMin(distance, originTime) - 4.60; + this.fvo2 = 0.80 + 0.298956 * Math.pow(Math.E, (-0.193261*originTime.getMinutes())) + 0.189438 * Math.pow(Math.E, (-0.012778*originTime.getMinutes())); + this.vdot = getVo2() / getFvo2(); + } + + public Double getVo2() { + return vo2; + } + + public Double getFvo2() { + return fvo2; + } + + public Double getVdot() { + return vdot; + } + + @Override + public String toString() { + return "JackDaniels [vo2=" + vo2 + ", fvo2=" + fvo2 + ", vdot=" + vdot + "]"; + } + } +} diff --git a/src/main/java/de/laktatnebel/product/tools/calculators/run/SplitTimes.java b/src/main/java/de/laktatnebel/product/tools/calculators/run/SplitTimes.java new file mode 100644 index 0000000..f038840 --- /dev/null +++ b/src/main/java/de/laktatnebel/product/tools/calculators/run/SplitTimes.java @@ -0,0 +1,95 @@ +package de.laktatnebel.product.tools.calculators.run; + +import java.util.HashMap; + +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import de.laktatnebel.product.tools.calculators.AbstractCalculator; +import de.laktatnebel.product.tools.calculators.output.OutPutter; +import de.laktatnebel.product.tools.calculators.util.Converter; +import de.laktatnebel.product.tools.calculators.util.Time; + +@RestController +public class SplitTimes extends AbstractCalculator { + + public SplitTimes() { + super(); + // TODO Auto-generated constructor stub + } + + @RequestMapping(value = "/splits/{dist}/{hour}/{min}/{sec}", method = RequestMethod.GET, produces = MediaType.TEXT_XML_VALUE) + @ResponseBody + ResponseEntity getAllSplits(@PathVariable(name = "dist") Double distance, + @PathVariable(name = "hour") Integer hours, @PathVariable(name = "min") Integer minutes, + @PathVariable(name = "sec") Integer seconds) { + + Time originTime = new Time(hours, minutes, seconds); + Double kmPerHours = Converter.getKmPerHours(distance, originTime); + String pace = Converter.getPace(originTime, distance); + + OutPutter output = new OutPutter(); + + output.setNodeNameValue("pace", pace); + output.setNodeNameValue("speed", Double.toString(kmPerHours)); + getLogger(RunPrediction.class).debug("speed\t" + kmPerHours); + + Double split = 0.0; + while (split < distance) { + getLogger(RunPrediction.class).debug("split\t" + split); + + Time splitTime = new Time(); + splitTime.setTimeHours(split * originTime.getHours() / distance); + + HashMap splits = new HashMap(); + splits.put("km", Double.toString(split)); + splits.put("time", splitTime.toFormattedString()); + + output.setNodeList("split", splits); + split++; + } + + HashMap splits = new HashMap(); + splits.put("km", Double.toString(distance)); + splits.put("time", originTime.toFormattedString()); + + output.setNodeList("split", splits); + + return new ResponseEntity(output.toString(), HttpStatus.OK); + } + + @RequestMapping(value = "/splits/{dist}/{hour}/{min}/{sec}/{specialsplit}", method = RequestMethod.GET, produces = MediaType.TEXT_XML_VALUE) + @ResponseBody + ResponseEntity getSpecialSplit(@PathVariable(name = "dist") Double distance, + @PathVariable(name = "hour") Integer hours, @PathVariable(name = "min") Integer minutes, + @PathVariable(name = "sec") Integer seconds, @PathVariable(name = "specialsplit") Double specialsplit) { + + Time originTime = new Time(hours, minutes, seconds); + Double kmPerHours = Converter.getKmPerHours(distance, originTime); + String pace = Converter.getPace(originTime, distance); + + OutPutter output = new OutPutter(); + + output.setNodeNameValue("pace", pace); + output.setNodeNameValue("speed", Double.toString(kmPerHours)); + getLogger(RunPrediction.class).debug("speed\t" + kmPerHours); + + Time splitTime = new Time(); + splitTime.setTimeHours(originTime.getHours() * specialsplit / distance); + + HashMap splits = new HashMap(); + splits.put("km", Double.toString(specialsplit)); + splits.put("time", splitTime.toFormattedString()); + + output.setNodeList("split", splits); + + return new ResponseEntity(output.toString(), HttpStatus.OK); + } + +} diff --git a/src/main/java/de/laktatnebel/product/tools/calculators/util/Converter.java b/src/main/java/de/laktatnebel/product/tools/calculators/util/Converter.java new file mode 100644 index 0000000..2fb4f1c --- /dev/null +++ b/src/main/java/de/laktatnebel/product/tools/calculators/util/Converter.java @@ -0,0 +1,27 @@ +package de.laktatnebel.product.tools.calculators.util; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TimeZone; + +public class Converter { + + public static String getPace(Time time, Double distance) { + Date dateFromTimeInSeconds = new Date(Math.round(60L * 60L * 1000L * time.getHours() / distance)); + + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss,SS"); + sdf.setTimeZone(TimeZone.getTimeZone("UTC")); + + return sdf.format(dateFromTimeInSeconds); + } + + public static Double getKmPerHours(Double distance, Time time) { + return distance / time.getHours(); + } + + public static Double getMeterPerMin(Double distance, Time time) { + return distance * 1000 / time.getMinutes(); + } + + +} diff --git a/src/main/java/de/laktatnebel/product/tools/calculators/util/Time.java b/src/main/java/de/laktatnebel/product/tools/calculators/util/Time.java new file mode 100644 index 0000000..e8bb6ae --- /dev/null +++ b/src/main/java/de/laktatnebel/product/tools/calculators/util/Time.java @@ -0,0 +1,75 @@ +package de.laktatnebel.product.tools.calculators.util; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TimeZone; + +public class Time { + + private Double seconds = 0.0; + private Double minutes = 0.0; + private Double hours = 0.0; + + public Time(Integer hours, Integer minutes, Integer seconds) { + super(); + setTime(hours, minutes, seconds); + } + + public void addSeconds(int secondsToAdd) { + setTimeSeconds(this.seconds + (double) secondsToAdd/10); + } + + public String toFormattedString() { + Date dateFromTimeInSeconds = new Date(Math.round(1000L * seconds)); + + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss,SS"); + sdf.setTimeZone(TimeZone.getTimeZone("UTC")); + + return sdf.format(dateFromTimeInSeconds); + } + + public Time() { + super(); + } + + public Double getSeconds() { + return seconds; + } + + public Double getMinutes() { + return minutes; + } + + public Double getHours() { + return hours; + } + + public void setTimeSeconds(Double seconds) { + this.seconds = seconds; + this.minutes = seconds / 60; + this.hours = seconds / 3600; + } + + public void setTimeMinutes(Double minutes) { + this.seconds = minutes * 60; + this.minutes = minutes; + this.hours = minutes / 60; + } + + public void setTimeHours(Double hours) { + this.seconds = hours * 3600; + this.minutes = hours * 60; + this.hours = hours; + } + + public void setTime(Integer hours, Integer minutes, Integer seconds) { + this.seconds = (double) hours * 3600 + (double) minutes * 60 + (double) seconds; + this.minutes = (double) hours * 60 + (double) minutes + (double) seconds / 60; + this.hours = (double) hours + (double) minutes / 60 + (double) seconds / 3600; + } + + @Override + public String toString() { + return "Time [seconds=" + seconds + ", minutes=" + minutes + ", hours=" + hours + "]"; + } +} \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..dc7c72e --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,3 @@ +logging.level.root=TRACE +logging.level.org.springframework.web=DEBUG +logging.level.org.hibernate=ERROR diff --git a/src/main/resources/log4j.xml b/src/main/resources/log4j.xml new file mode 100644 index 0000000..f04bbed --- /dev/null +++ b/src/main/resources/log4j.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/src/main/webapp/index.html b/src/main/webapp/index.html new file mode 100644 index 0000000..adf7f11 --- /dev/null +++ b/src/main/webapp/index.html @@ -0,0 +1,10 @@ + + + + +Insert title here + + +something ... + + \ No newline at end of file diff --git a/src/test/java/de/laktatnebel/product/tools/calculators/CalculatorApplicationTests.java b/src/test/java/de/laktatnebel/product/tools/calculators/CalculatorApplicationTests.java new file mode 100644 index 0000000..934fca3 --- /dev/null +++ b/src/test/java/de/laktatnebel/product/tools/calculators/CalculatorApplicationTests.java @@ -0,0 +1,13 @@ +package de.laktatnebel.product.tools.calculators; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class CalculatorApplicationTests { + + @Test + void contextLoads() { + } + +} -- 2.39.5