From c3aa3b1e55f7a912f373acb2f62dd6f5b82a05a6 Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Wed, 20 May 2026 16:36:25 +0400 Subject: [PATCH 01/45] Configured project dependencies and architecture structure --- pom.xml | 22 +++++++++++++++++++ .../parser/MeasurementParser.java | 4 ++++ 2 files changed, 26 insertions(+) create mode 100644 src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java diff --git a/pom.xml b/pom.xml index 20909d2..9650a47 100644 --- a/pom.xml +++ b/pom.xml @@ -35,6 +35,28 @@ spring-boot-starter-web + + org.springframework.boot + spring-boot-starter-data-jpa + + + + org.springframework.boot + spring-boot-starter-validation + + + + com.oracle.database.jdbc + ojdbc11 + runtime + + + + org.projectlombok + lombok + true + + org.springframework.boot spring-boot-starter-test diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java b/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java new file mode 100644 index 0000000..4bec436 --- /dev/null +++ b/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java @@ -0,0 +1,4 @@ +package com.oraclequantapi.oraclequantapi.parser; + +public class MeasurementParser { +} From 203c0ea2a08101592a64182b766b8af612456134 Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Wed, 20 May 2026 16:42:29 +0400 Subject: [PATCH 02/45] Added decoded number parser model --- .../oraclequantapi/parser/DecodedNumber.java | 9 +++++++++ .../oraclequantapi/parser/MeasurementParser.java | 9 +++++++++ 2 files changed, 18 insertions(+) create mode 100644 src/main/java/com/oraclequantapi/oraclequantapi/parser/DecodedNumber.java diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/parser/DecodedNumber.java b/src/main/java/com/oraclequantapi/oraclequantapi/parser/DecodedNumber.java new file mode 100644 index 0000000..f9f043d --- /dev/null +++ b/src/main/java/com/oraclequantapi/oraclequantapi/parser/DecodedNumber.java @@ -0,0 +1,9 @@ +package com.oraclequantapi.oraclequantapi.parser; + +public class DecodedNumber { + + private int value; + + private int nextIndex; + +} diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java b/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java index 4bec436..689590f 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java @@ -1,4 +1,13 @@ package com.oraclequantapi.oraclequantapi.parser; +import java.util.List; + public class MeasurementParser { + + public List parseMeasurements(String input) { + } + + private int readEncodedNumber(String input) { + } + } From a91f593ecfa551fcef632d989a2f69ac5db5699e Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Wed, 20 May 2026 16:44:27 +0400 Subject: [PATCH 03/45] Redesigned parser decoding method signature --- .../oraclequantapi/oraclequantapi/parser/MeasurementParser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java b/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java index 689590f..95b24ba 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java @@ -7,7 +7,7 @@ public class MeasurementParser { public List parseMeasurements(String input) { } - private int readEncodedNumber(String input) { + private DecodedNumber readEncodedNumber(String input, int currentIndex) { } } From 14f52baeb092c7ee1e253bc635339ebae5803908 Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Wed, 20 May 2026 16:53:53 +0400 Subject: [PATCH 04/45] Implemented decoded number model accessors --- .../oraclequantapi/parser/DecodedNumber.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/parser/DecodedNumber.java b/src/main/java/com/oraclequantapi/oraclequantapi/parser/DecodedNumber.java index f9f043d..52aae79 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/parser/DecodedNumber.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/parser/DecodedNumber.java @@ -6,4 +6,17 @@ public class DecodedNumber { private int nextIndex; + public DecodedNumber(int value, int nextIndex) { + this.value = value; + this.nextIndex = nextIndex; + } + + public int getValue() { + return value; + } + + public int getNextIndex() { + return nextIndex; + } } + From 50799d203331279daba24b8a9f343414c9365210 Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Wed, 20 May 2026 17:16:06 +0400 Subject: [PATCH 05/45] Implemented basic standalone value decoding --- .../oraclequantapi/parser/MeasurementParser.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java b/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java index 95b24ba..849e915 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java @@ -8,6 +8,16 @@ public List parseMeasurements(String input) { } private DecodedNumber readEncodedNumber(String input, int currentIndex) { + char currentCharacter = input.charAt(currentIndex); + int value; + + if (currentCharacter == '_') { + value = 0; + } else { + value = (currentCharacter - 'a') + 1; + } + + return new DecodedNumber(value, currentIndex + 1); } } From a87f5900175574b7baf1238e57f9c8132f551a9a Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Wed, 20 May 2026 17:23:07 +0400 Subject: [PATCH 06/45] Implemented continuation mode decoding --- .../oraclequantapi/parser/DecodedNumber.java | 3 +- .../parser/MeasurementParser.java | 37 +++++++++++++++---- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/parser/DecodedNumber.java b/src/main/java/com/oraclequantapi/oraclequantapi/parser/DecodedNumber.java index 52aae79..ea33b38 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/parser/DecodedNumber.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/parser/DecodedNumber.java @@ -18,5 +18,4 @@ public int getValue() { public int getNextIndex() { return nextIndex; } -} - +} \ No newline at end of file diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java b/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java index 849e915..fd028ff 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java @@ -5,19 +5,42 @@ public class MeasurementParser { public List parseMeasurements(String input) { + return null; } private DecodedNumber readEncodedNumber(String input, int currentIndex) { char currentCharacter = input.charAt(currentIndex); - int value; + int value = 0; - if (currentCharacter == '_') { - value = 0; - } else { - value = (currentCharacter - 'a') + 1; + if (currentCharacter == 'z') { + while (currentIndex < input.length() + && input.charAt(currentIndex) == 'z') { + + value += 26; + currentIndex++; + } + + if (currentIndex < input.length()) { + char terminatingCharacter = input.charAt(currentIndex); + + if (terminatingCharacter == '_') { + value += 0; + } + else { + value += (terminatingCharacter - 'a') + 1; + } + currentIndex++; + } } - return new DecodedNumber(value, currentIndex + 1); + else { + if (currentCharacter == '_') { + value = 0; + } else { + value = (currentCharacter - 'a') + 1; + } + currentIndex++; + } + return new DecodedNumber(value, currentIndex); } - } From 59bea6a85bc9993e218acef5e13e1e7fda43a128 Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Thu, 21 May 2026 08:27:05 +0400 Subject: [PATCH 07/45] Implemented package count decoding --- .../oraclequantapi/parser/MeasurementParser.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java b/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java index fd028ff..1200c43 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java @@ -1,11 +1,24 @@ package com.oraclequantapi.oraclequantapi.parser; +import java.util.ArrayList; import java.util.List; public class MeasurementParser { public List parseMeasurements(String input) { - return null; + List results = new ArrayList<>(); + + int currentIndex = 0; + + while (currentIndex < input.length()) { + DecodedNumber packageCountResult = + readEncodedNumber(input, currentIndex); + + int packageCount = packageCountResult.getValue(); + + currentIndex = packageCountResult.getNextIndex(); + } + return results; } private DecodedNumber readEncodedNumber(String input, int currentIndex) { From 63a7597a116930b506c8d33f0357d53fa7217602 Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Thu, 21 May 2026 08:39:40 +0400 Subject: [PATCH 08/45] Added package accumulation variables --- .../oraclequantapi/parser/MeasurementParser.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java b/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java index 1200c43..85028c6 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java @@ -17,6 +17,9 @@ public List parseMeasurements(String input) { int packageCount = packageCountResult.getValue(); currentIndex = packageCountResult.getNextIndex(); + + int packageTotal = 0; + int valuesRead = 0; } return results; } From 3b875c039dacdafb0a68f9f37f6d6ad47b566042 Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Thu, 21 May 2026 09:02:11 +0400 Subject: [PATCH 09/45] Created application version tracking file --- version.txt | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 version.txt diff --git a/version.txt b/version.txt new file mode 100644 index 0000000..9173781 --- /dev/null +++ b/version.txt @@ -0,0 +1,29 @@ +v0.1.0 + +Project creation/setup milestone. + +⸻ + +v0.2.0 + +Dependencies + architecture established. + +⸻ + +v0.3.0 + +Core decoding engine completed: + +* continuation mode +* parser state movement +* DecodedNumber + +⸻ + +v0.4.0 + +Package workflow foundation: + +* package count decoding +* accumulation variables +* nested parsing structure \ No newline at end of file From 7d798e4f7db807704e988f94684e78accb619ee4 Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Thu, 21 May 2026 10:13:20 +0400 Subject: [PATCH 10/45] Implemented package value accumulation --- .../oraclequantapi/parser/MeasurementParser.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java b/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java index 85028c6..7896efb 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java @@ -20,6 +20,19 @@ public List parseMeasurements(String input) { int packageTotal = 0; int valuesRead = 0; + + while (valuesRead < packageCount + && currentIndex < input.length()) { + + DecodedNumber valueResult = + readEncodedNumber(input, currentIndex); + + packageTotal += valueResult.getValue(); + + currentIndex = valueResult.getNextIndex(); + + valuesRead++; + } } return results; } From 2c69aee759e9c99e6cc96334b65b8679160439ac Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Thu, 21 May 2026 10:17:24 +0400 Subject: [PATCH 11/45] Implemented package result finalization --- .../oraclequantapi/oraclequantapi/parser/MeasurementParser.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java b/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java index 7896efb..e37fbde 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java @@ -33,6 +33,7 @@ public List parseMeasurements(String input) { valuesRead++; } + results.add(packageCount); } return results; } From 2d0a8fbc97ddcb99923bc872a3ac3ed52dc8c446 Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Thu, 21 May 2026 10:18:16 +0400 Subject: [PATCH 12/45] Finalized package result storage logic --- .../oraclequantapi/oraclequantapi/parser/MeasurementParser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java b/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java index e37fbde..985a392 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java @@ -33,7 +33,7 @@ public List parseMeasurements(String input) { valuesRead++; } - results.add(packageCount); + results.add(packageTotal); } return results; } From dc7af43ddfb5052f5d3e26d381ba30f5fcc1b546 Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Thu, 21 May 2026 10:28:16 +0400 Subject: [PATCH 13/45] Added parser standalone test harness --- .../oraclequantapi/parser/MeasurementParser.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java b/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java index 985a392..26210ae 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java @@ -38,6 +38,16 @@ public List parseMeasurements(String input) { return results; } + public static void main(String[] args) { + + MeasurementParser parser = new MeasurementParser(); + + System.out.println( + parser.parseMeasurements("dz_a_aazzaaa") + ); + } + + private DecodedNumber readEncodedNumber(String input, int currentIndex) { char currentCharacter = input.charAt(currentIndex); int value = 0; From d30f74a7f76d0cea74d230236cca3d3a569407c2 Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Thu, 21 May 2026 10:41:08 +0400 Subject: [PATCH 14/45] Validated parser engine functionality --- .../oraclequantapi/oraclequantapi/parser/MeasurementParser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java b/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java index 26210ae..3f9776c 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java @@ -43,7 +43,7 @@ public static void main(String[] args) { MeasurementParser parser = new MeasurementParser(); System.out.println( - parser.parseMeasurements("dz_a_aazzaaa") + parser.parseMeasurements("chdkkuuw_a") ); } From 27283a44d895c889b173cdce4debccbde4bfc6bd Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Thu, 21 May 2026 10:55:38 +0400 Subject: [PATCH 15/45] Updated application version history --- version.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 9173781..d22ba65 100644 --- a/version.txt +++ b/version.txt @@ -26,4 +26,8 @@ Package workflow foundation: * package count decoding * accumulation variables -* nested parsing structure \ No newline at end of file +* nested parsing structure + +v0.5.0 + +* Completed encoded measurement parser engine \ No newline at end of file From 5dee6b04bba5f16ef2249d4a7b3a7491b1615afd Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Thu, 21 May 2026 11:19:22 +0400 Subject: [PATCH 16/45] Created measurement service contract --- .../oraclequantapi/parser/MeasurementParser.java | 2 +- .../oraclequantapi/service/MeasurementService.java | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/oraclequantapi/oraclequantapi/service/MeasurementService.java diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java b/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java index 3f9776c..4925019 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java @@ -43,7 +43,7 @@ public static void main(String[] args) { MeasurementParser parser = new MeasurementParser(); System.out.println( - parser.parseMeasurements("chdkkuuw_a") + parser.parseMeasurements("za_a_a_a_a_a_a_a_a_a_a_a_a_azaaa") ); } diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/service/MeasurementService.java b/src/main/java/com/oraclequantapi/oraclequantapi/service/MeasurementService.java new file mode 100644 index 0000000..14a5a29 --- /dev/null +++ b/src/main/java/com/oraclequantapi/oraclequantapi/service/MeasurementService.java @@ -0,0 +1,7 @@ +package com.oraclequantapi.oraclequantapi.service; + +import java.util.List; + +public interface MeasurementService { + List convertMeasurements(String input); +} From ddd19b922de9d874c8eaf4a43a0984fb180dae42 Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Thu, 21 May 2026 11:36:36 +0400 Subject: [PATCH 17/45] Implemented measurement service layer --- .../service/impl/MeasurementServiceImpl.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java b/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java new file mode 100644 index 0000000..022fdb3 --- /dev/null +++ b/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java @@ -0,0 +1,18 @@ +package com.oraclequantapi.oraclequantapi.service.impl; + +import com.oraclequantapi.oraclequantapi.parser.MeasurementParser; +import com.oraclequantapi.oraclequantapi.service.MeasurementService; + +import java.util.List; + +public class MeasurementServiceImpl implements MeasurementService { + + private final MeasurementParser measurementParser = + new MeasurementParser(); + + @Override + public List convertMeasurements(String input) { + + return measurementParser.parseMeasurements(input); + } +} \ No newline at end of file From 64cfb88e1baf88b0c316430eb0b8d25a46326100 Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Thu, 21 May 2026 11:38:57 +0400 Subject: [PATCH 18/45] Configured Spring service bean --- .../oraclequantapi/service/impl/MeasurementServiceImpl.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java b/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java index 022fdb3..d1353f7 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java @@ -4,7 +4,9 @@ import com.oraclequantapi.oraclequantapi.service.MeasurementService; import java.util.List; +import org.springframework.stereotype.Service; +@Service public class MeasurementServiceImpl implements MeasurementService { private final MeasurementParser measurementParser = From a25926fbf722525420ab0636651e60062eabec03 Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Thu, 21 May 2026 11:42:13 +0400 Subject: [PATCH 19/45] Implemented measurement REST controller --- .../controller/MeasurementController.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/main/java/com/oraclequantapi/oraclequantapi/controller/MeasurementController.java diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/controller/MeasurementController.java b/src/main/java/com/oraclequantapi/oraclequantapi/controller/MeasurementController.java new file mode 100644 index 0000000..340c9a1 --- /dev/null +++ b/src/main/java/com/oraclequantapi/oraclequantapi/controller/MeasurementController.java @@ -0,0 +1,28 @@ +package com.oraclequantapi.oraclequantapi.controller; + +import com.oraclequantapi.oraclequantapi.service.MeasurementService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +public class MeasurementController { + + private final MeasurementService measurementService; + + public MeasurementController( + MeasurementService measurementService + ) { + this.measurementService = measurementService; + } + + @GetMapping("/convert-measurements") + public List convertMeasurements( + @RequestParam String input + ) { + + return measurementService.convertMeasurements(input); + } +} \ No newline at end of file From 105099a5671673da250dd5c29b9b8ecc72ca8ac4 Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Thu, 21 May 2026 11:51:46 +0400 Subject: [PATCH 20/45] Disabled temporary datasource auto configuration --- .../oraclequantapi/OraclequantapiApplication.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/OraclequantapiApplication.java b/src/main/java/com/oraclequantapi/oraclequantapi/OraclequantapiApplication.java index 5e28689..f5abff7 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/OraclequantapiApplication.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/OraclequantapiApplication.java @@ -3,7 +3,11 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -@SpringBootApplication +@SpringBootApplication ( + exclude = { + org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration.class + } +) public class OraclequantapiApplication { public static void main(String[] args) { From d255e04f53db24965c50b6d270071ed5f8a882e6 Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Thu, 21 May 2026 11:55:22 +0400 Subject: [PATCH 21/45] Integrated parser engine with REST API --- version.txt | 52 +++++++++++++++++++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/version.txt b/version.txt index d22ba65..a21c1a6 100644 --- a/version.txt +++ b/version.txt @@ -1,33 +1,51 @@ -v0.1.0 +v0.1.0 - Project creation/setup milestone. -Project creation/setup milestone. +----------------------------------------------- -⸻ +v0.2.0 - Dependencies + architecture established. -v0.2.0 +----------------------------------------------- -Dependencies + architecture established. - -⸻ - -v0.3.0 - -Core decoding engine completed: +v0.3.0 - Core decoding engine completed: * continuation mode * parser state movement * DecodedNumber -⸻ +----------------------------------------------- -v0.4.0 - -Package workflow foundation: +v0.4.0 - Package workflow foundation: * package count decoding * accumulation variables * nested parsing structure -v0.5.0 +----------------------------------------------- + +v0.5.0 - Completed encoded measurement parser engine + +----------------------------------------------- + +v0.6.0 - Implemented Spring Boot REST API integration + +----------------------------------------------- + + + +----------------------------------------------- + + + +----------------------------------------------- + + + +----------------------------------------------- + + + +----------------------------------------------- + + -* Completed encoded measurement parser engine \ No newline at end of file +----------------------------------------------- \ No newline at end of file From da30cb82fc8d809d2317ba3741b0e6e00bb904fd Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Sat, 23 May 2026 21:19:18 +0400 Subject: [PATCH 22/45] Created exception handling package --- .../oraclequantapi/exception/GlobalExceptionHandler.java | 4 ++++ .../exception/InvalidMeasurementInputException.java | 4 ++++ 2 files changed, 8 insertions(+) create mode 100644 src/main/java/com/oraclequantapi/oraclequantapi/exception/GlobalExceptionHandler.java create mode 100644 src/main/java/com/oraclequantapi/oraclequantapi/exception/InvalidMeasurementInputException.java diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/exception/GlobalExceptionHandler.java b/src/main/java/com/oraclequantapi/oraclequantapi/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..c1f291b --- /dev/null +++ b/src/main/java/com/oraclequantapi/oraclequantapi/exception/GlobalExceptionHandler.java @@ -0,0 +1,4 @@ +package com.oraclequantapi.oraclequantapi.exception; + +public class GlobalExceptionHandler { +} diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/exception/InvalidMeasurementInputException.java b/src/main/java/com/oraclequantapi/oraclequantapi/exception/InvalidMeasurementInputException.java new file mode 100644 index 0000000..8f2a31f --- /dev/null +++ b/src/main/java/com/oraclequantapi/oraclequantapi/exception/InvalidMeasurementInputException.java @@ -0,0 +1,4 @@ +package com.oraclequantapi.oraclequantapi.exception; + +public class InvalidMeasurementInputException { +} From 265fe4d4b27c3fca163841b64ee80c5f61a1ed19 Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Sat, 23 May 2026 21:21:39 +0400 Subject: [PATCH 23/45] Implemented global API exception handling --- .../exception/GlobalExceptionHandler.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/exception/GlobalExceptionHandler.java b/src/main/java/com/oraclequantapi/oraclequantapi/exception/GlobalExceptionHandler.java index c1f291b..611e530 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/exception/GlobalExceptionHandler.java @@ -1,4 +1,28 @@ package com.oraclequantapi.oraclequantapi.exception; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +import java.util.Map; + +@ControllerAdvice public class GlobalExceptionHandler { + + @ExceptionHandler(IllegalArgumentException.class) + public ResponseEntity> + handleIllegalArgumentException( + IllegalArgumentException exception + ) { + + return ResponseEntity + .status(HttpStatus.BAD_REQUEST) + .body( + Map.of( + "error", + exception.getMessage() + ) + ); + } } From 934681379cdb58455d07029a37ad5efae66b161e Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Sat, 23 May 2026 21:26:19 +0400 Subject: [PATCH 24/45] Implemented service input validation --- .../oraclequantapi/service/impl/MeasurementServiceImpl.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java b/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java index d1353f7..1a9c56d 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java @@ -15,6 +15,12 @@ public class MeasurementServiceImpl implements MeasurementService { @Override public List convertMeasurements(String input) { + if (input == null || input.isBlank()) { + throw new IllegalArgumentException( + "Input parameter is required" + ); + } + return measurementParser.parseMeasurements(input); } } \ No newline at end of file From 23973b7a9515d0a6bef918b3066d219829562d63 Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Sat, 23 May 2026 21:38:18 +0400 Subject: [PATCH 25/45] Updated application version history --- .../oraclequantapi/service/impl/MeasurementServiceImpl.java | 1 - version.txt | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java b/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java index 1a9c56d..fce3c8b 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java @@ -20,7 +20,6 @@ public List convertMeasurements(String input) { "Input parameter is required" ); } - return measurementParser.parseMeasurements(input); } } \ No newline at end of file diff --git a/version.txt b/version.txt index a21c1a6..e6b63b9 100644 --- a/version.txt +++ b/version.txt @@ -30,7 +30,7 @@ v0.6.0 - Implemented Spring Boot REST API integration ----------------------------------------------- - +v0.7.0 - Added API validation and centralized exception handling ----------------------------------------------- From 1621ae46bb9c3a5736ddfe55a5da3f54b0147f88 Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Sat, 23 May 2026 21:50:10 +0400 Subject: [PATCH 26/45] Added service logging infrastructure --- .../service/impl/MeasurementServiceImpl.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java b/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java index fce3c8b..e75a982 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java @@ -2,13 +2,18 @@ import com.oraclequantapi.oraclequantapi.parser.MeasurementParser; import com.oraclequantapi.oraclequantapi.service.MeasurementService; - import java.util.List; import org.springframework.stereotype.Service; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + @Service public class MeasurementServiceImpl implements MeasurementService { + private static final Logger logger = + LoggerFactory.getLogger(MeasurementServiceImpl.class); + private final MeasurementParser measurementParser = new MeasurementParser(); From 4c182b85d6bb23e6718dea50143a23448c7f488a Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Sat, 23 May 2026 21:58:38 +0400 Subject: [PATCH 27/45] Implemented service activity logging --- .../oraclequantapi/service/impl/MeasurementServiceImpl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java b/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java index e75a982..501123d 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java @@ -25,6 +25,9 @@ public List convertMeasurements(String input) { "Input parameter is required" ); } + + logger.info("Successfully converted measurement input"); + return measurementParser.parseMeasurements(input); } } \ No newline at end of file From c7e846b386f2da307b4195ec5f4822bcd5b92d22 Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Sat, 23 May 2026 22:03:49 +0400 Subject: [PATCH 28/45] Implemented service activity logging --- .../oraclequantapi/service/impl/MeasurementServiceImpl.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java b/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java index 501123d..bbf2b30 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java @@ -20,7 +20,11 @@ public class MeasurementServiceImpl implements MeasurementService { @Override public List convertMeasurements(String input) { + logger.info("Received measurement conversion request"); + if (input == null || input.isBlank()) { + logger.warn("Received invalid blank measurement input"); + throw new IllegalArgumentException( "Input parameter is required" ); From dd02c6a9d9db534f70c7c796b9fbf00b695dbf58 Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Sat, 23 May 2026 22:11:40 +0400 Subject: [PATCH 29/45] Configured rolling application logging --- src/main/resources/application.properties | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 99d0060..c0a2d90 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,11 @@ spring.application.name=oraclequantapi + +logging.file.name=logs/application.log + +logging.logback.rollingpolicy.max-file-size=10MB + +logging.logback.rollingpolicy.max-history=7 + +logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} - %msg%n + +logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss} [%level] %logger{36} - %msg%n From 18f8ce82198519fdc04ef3b51ea4a227c1754d97 Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Sat, 23 May 2026 22:16:10 +0400 Subject: [PATCH 30/45] Implemented production logging infrastructure --- logs/application.log | 16 ++++++++++++++++ version.txt | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 logs/application.log diff --git a/logs/application.log b/logs/application.log new file mode 100644 index 0000000..50b8fe2 --- /dev/null +++ b/logs/application.log @@ -0,0 +1,16 @@ +2026-05-23 22:13:35 [INFO] c.o.o.OraclequantapiApplication - Starting OraclequantapiApplication using Java 17.0.18 with PID 16876 (/Users/saif/Desktop/measurement-api/oraclequantapi/target/classes started by saif in /Users/saif/Desktop/measurement-api/oraclequantapi) +2026-05-23 22:13:35 [INFO] c.o.o.OraclequantapiApplication - No active profile set, falling back to 1 default profile: "default" +2026-05-23 22:13:41 [INFO] o.s.b.w.e.tomcat.TomcatWebServer - Tomcat initialized with port 8080 (http) +2026-05-23 22:13:41 [INFO] o.a.catalina.core.StandardService - Starting service [Tomcat] +2026-05-23 22:13:41 [INFO] o.a.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.54] +2026-05-23 22:13:41 [INFO] o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +2026-05-23 22:13:41 [INFO] o.s.b.w.s.c.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 6107 ms +2026-05-23 22:13:41 [INFO] o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port 8080 (http) with context path '/' +2026-05-23 22:13:41 [INFO] c.o.o.OraclequantapiApplication - Started OraclequantapiApplication in 6.668 seconds (process running for 8.534) +2026-05-23 22:15:00 [INFO] o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +2026-05-23 22:15:00 [INFO] o.s.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +2026-05-23 22:15:00 [INFO] o.s.web.servlet.DispatcherServlet - Completed initialization in 9 ms +2026-05-23 22:15:00 [INFO] c.o.o.s.impl.MeasurementServiceImpl - Received measurement conversion request +2026-05-23 22:15:00 [INFO] c.o.o.s.impl.MeasurementServiceImpl - Successfully converted measurement input +2026-05-23 22:15:14 [INFO] c.o.o.s.impl.MeasurementServiceImpl - Received measurement conversion request +2026-05-23 22:15:14 [WARN] c.o.o.s.impl.MeasurementServiceImpl - Received invalid blank measurement input diff --git a/version.txt b/version.txt index e6b63b9..40ecc77 100644 --- a/version.txt +++ b/version.txt @@ -34,7 +34,7 @@ v0.7.0 - Added API validation and centralized exception handling ----------------------------------------------- - +v0.8.0 - Added rolling application logging infrastructure ----------------------------------------------- From 442397e8448d45c43b79bef450718b0f275a6039 Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Sat, 23 May 2026 22:18:29 +0400 Subject: [PATCH 31/45] Created entity package --- .../oraclequantapi/entity/MeasurementRecord.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/main/java/com/oraclequantapi/oraclequantapi/entity/MeasurementRecord.java diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/entity/MeasurementRecord.java b/src/main/java/com/oraclequantapi/oraclequantapi/entity/MeasurementRecord.java new file mode 100644 index 0000000..f9d95de --- /dev/null +++ b/src/main/java/com/oraclequantapi/oraclequantapi/entity/MeasurementRecord.java @@ -0,0 +1,4 @@ +package com.oraclequantapi.oraclequantapi.entity; + +public class MeasurementRecord { +} From 21640118330ad5a9b0de79e2c4984e8949b46724 Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Sat, 23 May 2026 22:25:34 +0400 Subject: [PATCH 32/45] Created measurement persistence entity --- .../entity/MeasurementRecord.java | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/entity/MeasurementRecord.java b/src/main/java/com/oraclequantapi/oraclequantapi/entity/MeasurementRecord.java index f9d95de..37f37dd 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/entity/MeasurementRecord.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/entity/MeasurementRecord.java @@ -1,4 +1,39 @@ package com.oraclequantapi.oraclequantapi.entity; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; + +@Entity public class MeasurementRecord { -} + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String input; + + private String output; + + public MeasurementRecord() { + + } + + public MeasurementRecord(String input, String output) { + this.input = input; + this.output = output; + } + + public Long getId() { + return id; + } + + public String getInput() { + return input; + } + + public String getOutput() { + return output; + } +} \ No newline at end of file From b3e0a401787fc120e6a576b639c3da1d08592acb Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Sat, 23 May 2026 22:41:44 +0400 Subject: [PATCH 33/45] Created measurement persistence repository --- .../repository/MeasurementRecordRepository.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/main/java/com/oraclequantapi/oraclequantapi/repository/MeasurementRecordRepository.java diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/repository/MeasurementRecordRepository.java b/src/main/java/com/oraclequantapi/oraclequantapi/repository/MeasurementRecordRepository.java new file mode 100644 index 0000000..94fc9e2 --- /dev/null +++ b/src/main/java/com/oraclequantapi/oraclequantapi/repository/MeasurementRecordRepository.java @@ -0,0 +1,11 @@ +package com.oraclequantapi.oraclequantapi.repository; + +import com.oraclequantapi.oraclequantapi.entity.MeasurementRecord; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface MeasurementRecordRepository + + extends JpaRepository { + +} From 1fb500e1464ed9c4e2297edae66610a49d7fd0c1 Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Sun, 24 May 2026 00:29:31 +0400 Subject: [PATCH 34/45] Configured Oracle datasource integration --- .../oraclequantapi/OraclequantapiApplication.java | 4 +--- .../service/impl/MeasurementServiceImpl.java | 12 ++++++++++++ src/main/resources/application.properties | 12 ++++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/OraclequantapiApplication.java b/src/main/java/com/oraclequantapi/oraclequantapi/OraclequantapiApplication.java index f5abff7..369609c 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/OraclequantapiApplication.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/OraclequantapiApplication.java @@ -4,9 +4,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication ( - exclude = { - org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration.class - } + ) public class OraclequantapiApplication { diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java b/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java index bbf2b30..513f598 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java @@ -4,6 +4,8 @@ import com.oraclequantapi.oraclequantapi.service.MeasurementService; import java.util.List; import org.springframework.stereotype.Service; +import com.oraclequantapi.oraclequantapi.entity.MeasurementRecord; +import com.oraclequantapi.oraclequantapi.repository.MeasurementRecordRepository; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -14,9 +16,19 @@ public class MeasurementServiceImpl implements MeasurementService { private static final Logger logger = LoggerFactory.getLogger(MeasurementServiceImpl.class); + private final MeasurementRecordRepository + measurementRecordRepository; + private final MeasurementParser measurementParser = new MeasurementParser(); + public MeasurementServiceImpl( + MeasurementRecordRepository measurementRecordRepository + ) { + this.measurementRecordRepository = + measurementRecordRepository; + } + @Override public List convertMeasurements(String input) { diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index c0a2d90..2c4fa9d 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -9,3 +9,15 @@ logging.logback.rollingpolicy.max-history=7 logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} - %msg%n logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss} [%level] %logger{36} - %msg%n + +spring.datasource.url=jdbc:oracle:thin:@localhost:1521/XE + +spring.datasource.username=system + +spring.datasource.password=oracle + +spring.datasource.driver-class-name=oracle.jdbc.OracleDriver + +spring.jpa.hibernate.ddl-auto=update + +spring.jpa.show-sql=true From eaf3bdb0a7aea8b54dd8ccf6f9c0089657df5698 Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Sun, 24 May 2026 00:30:29 +0400 Subject: [PATCH 35/45] Updated application version history --- version.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.txt b/version.txt index 40ecc77..5bb18e8 100644 --- a/version.txt +++ b/version.txt @@ -38,7 +38,7 @@ v0.8.0 - Added rolling application logging infrastructure ----------------------------------------------- - +v0.9.0 - Added Oracle database and JPA datasource configuration ----------------------------------------------- From b9dc701f0f5c706ac270c04150bc05c84a9ddaae Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Sun, 24 May 2026 00:49:13 +0400 Subject: [PATCH 36/45] Implemented Oracle database persistence workflow --- logs/application.log | 122 +++++++++++++++--- logs/application.log.2026-05-23.0.gz | Bin 0 -> 626 bytes .../service/impl/MeasurementServiceImpl.java | 13 +- version.txt | 2 +- 4 files changed, 119 insertions(+), 18 deletions(-) create mode 100644 logs/application.log.2026-05-23.0.gz diff --git a/logs/application.log b/logs/application.log index 50b8fe2..174c827 100644 --- a/logs/application.log +++ b/logs/application.log @@ -1,16 +1,106 @@ -2026-05-23 22:13:35 [INFO] c.o.o.OraclequantapiApplication - Starting OraclequantapiApplication using Java 17.0.18 with PID 16876 (/Users/saif/Desktop/measurement-api/oraclequantapi/target/classes started by saif in /Users/saif/Desktop/measurement-api/oraclequantapi) -2026-05-23 22:13:35 [INFO] c.o.o.OraclequantapiApplication - No active profile set, falling back to 1 default profile: "default" -2026-05-23 22:13:41 [INFO] o.s.b.w.e.tomcat.TomcatWebServer - Tomcat initialized with port 8080 (http) -2026-05-23 22:13:41 [INFO] o.a.catalina.core.StandardService - Starting service [Tomcat] -2026-05-23 22:13:41 [INFO] o.a.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.54] -2026-05-23 22:13:41 [INFO] o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext -2026-05-23 22:13:41 [INFO] o.s.b.w.s.c.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 6107 ms -2026-05-23 22:13:41 [INFO] o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port 8080 (http) with context path '/' -2026-05-23 22:13:41 [INFO] c.o.o.OraclequantapiApplication - Started OraclequantapiApplication in 6.668 seconds (process running for 8.534) -2026-05-23 22:15:00 [INFO] o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' -2026-05-23 22:15:00 [INFO] o.s.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' -2026-05-23 22:15:00 [INFO] o.s.web.servlet.DispatcherServlet - Completed initialization in 9 ms -2026-05-23 22:15:00 [INFO] c.o.o.s.impl.MeasurementServiceImpl - Received measurement conversion request -2026-05-23 22:15:00 [INFO] c.o.o.s.impl.MeasurementServiceImpl - Successfully converted measurement input -2026-05-23 22:15:14 [INFO] c.o.o.s.impl.MeasurementServiceImpl - Received measurement conversion request -2026-05-23 22:15:14 [WARN] c.o.o.s.impl.MeasurementServiceImpl - Received invalid blank measurement input +2026-05-24 00:37:55 [INFO] o.s.b.w.e.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete +2026-05-24 00:37:55 [INFO] o.s.b.w.e.tomcat.GracefulShutdown - Graceful shutdown complete +2026-05-24 00:38:21 [INFO] c.o.o.OraclequantapiApplication - Starting OraclequantapiApplication using Java 17.0.18 with PID 19251 (/Users/saif/Desktop/measurement-api/oraclequantapi/target/classes started by saif in /Users/saif/Desktop/measurement-api/oraclequantapi) +2026-05-24 00:38:21 [INFO] c.o.o.OraclequantapiApplication - No active profile set, falling back to 1 default profile: "default" +2026-05-24 00:38:32 [INFO] o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2026-05-24 00:38:32 [INFO] o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 36 ms. Found 1 JPA repository interface. +2026-05-24 00:38:32 [INFO] o.s.b.w.e.tomcat.TomcatWebServer - Tomcat initialized with port 8080 (http) +2026-05-24 00:38:32 [INFO] o.a.catalina.core.StandardService - Starting service [Tomcat] +2026-05-24 00:38:32 [INFO] o.a.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.54] +2026-05-24 00:38:32 [INFO] o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +2026-05-24 00:38:32 [INFO] o.s.b.w.s.c.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 11500 ms +2026-05-24 00:38:33 [INFO] o.h.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +2026-05-24 00:38:33 [INFO] org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.49.Final +2026-05-24 00:38:33 [INFO] o.h.c.i.RegionFactoryInitiator - HHH000026: Second-level cache disabled +2026-05-24 00:38:33 [INFO] o.s.o.j.p.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +2026-05-24 00:38:33 [INFO] com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +2026-05-24 00:38:35 [INFO] com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection oracle.jdbc.driver.T4CConnection@819fb19 +2026-05-24 00:38:35 [INFO] com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +2026-05-24 00:38:35 [INFO] o.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 21.3 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +2026-05-24 00:38:36 [INFO] o.h.e.t.j.p.i.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +2026-05-24 00:38:39 [INFO] o.s.o.j.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +2026-05-24 00:38:39 [WARN] o.s.b.a.o.j.JpaBaseConfiguration$JpaWebConfiguration - spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2026-05-24 00:38:39 [INFO] o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port 8080 (http) with context path '/' +2026-05-24 00:38:39 [INFO] c.o.o.OraclequantapiApplication - Started OraclequantapiApplication in 19.034 seconds (process running for 19.607) +2026-05-24 00:39:33 [INFO] o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +2026-05-24 00:39:33 [INFO] o.s.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +2026-05-24 00:39:33 [INFO] o.s.web.servlet.DispatcherServlet - Completed initialization in 13 ms +2026-05-24 00:39:33 [INFO] c.o.o.s.impl.MeasurementServiceImpl - Received measurement conversion request +2026-05-24 00:39:33 [INFO] c.o.o.s.impl.MeasurementServiceImpl - Successfully converted measurement input +2026-05-24 00:46:35 [INFO] o.s.b.w.e.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete +2026-05-24 00:46:35 [INFO] o.s.b.w.e.tomcat.GracefulShutdown - Graceful shutdown complete +2026-05-24 00:46:35 [INFO] o.s.o.j.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +2026-05-24 00:46:35 [INFO] com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +2026-05-24 00:46:37 [INFO] com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +2026-05-24 00:46:59 [INFO] c.o.o.OraclequantapiApplication - Starting OraclequantapiApplication using Java 17.0.18 with PID 19529 (/Users/saif/Desktop/measurement-api/oraclequantapi/target/classes started by saif in /Users/saif/Desktop/measurement-api/oraclequantapi) +2026-05-24 00:46:59 [INFO] c.o.o.OraclequantapiApplication - No active profile set, falling back to 1 default profile: "default" +2026-05-24 00:47:09 [INFO] o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2026-05-24 00:47:09 [INFO] o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 31 ms. Found 1 JPA repository interface. +2026-05-24 00:47:09 [INFO] o.s.b.w.e.tomcat.TomcatWebServer - Tomcat initialized with port 8080 (http) +2026-05-24 00:47:09 [INFO] o.s.b.w.s.c.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 9960 ms +2026-05-24 00:47:09 [INFO] o.h.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +2026-05-24 00:47:09 [INFO] org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.49.Final +2026-05-24 00:47:09 [INFO] o.h.c.i.RegionFactoryInitiator - HHH000026: Second-level cache disabled +2026-05-24 00:47:10 [INFO] o.s.o.j.p.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +2026-05-24 00:47:10 [INFO] com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +2026-05-24 00:47:11 [INFO] com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection oracle.jdbc.driver.T4CConnection@49cb5030 +2026-05-24 00:47:11 [INFO] com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +2026-05-24 00:47:11 [INFO] o.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 21.3 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +2026-05-24 00:47:12 [INFO] o.h.e.t.j.p.i.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +2026-05-24 00:47:14 [INFO] o.s.o.j.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +2026-05-24 00:47:14 [WARN] o.s.b.a.o.j.JpaBaseConfiguration$JpaWebConfiguration - spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2026-05-24 00:47:14 [INFO] o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port 8080 (http) with context path '/' +2026-05-24 00:47:14 [INFO] c.o.o.OraclequantapiApplication - Started OraclequantapiApplication in 17.525 seconds (process running for 20.362) +2026-05-24 00:47:14 [INFO] o.s.b.w.e.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete +2026-05-24 00:47:14 [INFO] o.s.b.w.e.tomcat.GracefulShutdown - Graceful shutdown complete +2026-05-24 00:47:14 [INFO] o.s.o.j.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +2026-05-24 00:47:14 [INFO] com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +2026-05-24 00:47:15 [INFO] com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +2026-05-24 00:47:17 [INFO] c.o.o.OraclequantapiApplication - Starting OraclequantapiApplication using Java 17.0.18 with PID 19538 (/Users/saif/Desktop/measurement-api/oraclequantapi/target/classes started by saif in /Users/saif/Desktop/measurement-api/oraclequantapi) +2026-05-24 00:47:17 [INFO] c.o.o.OraclequantapiApplication - No active profile set, falling back to 1 default profile: "default" +2026-05-24 00:47:17 [INFO] o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2026-05-24 00:47:17 [INFO] o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 36 ms. Found 1 JPA repository interface. +2026-05-24 00:47:17 [INFO] o.s.b.w.e.tomcat.TomcatWebServer - Tomcat initialized with port 8080 (http) +2026-05-24 00:47:17 [INFO] o.a.catalina.core.StandardService - Starting service [Tomcat] +2026-05-24 00:47:17 [INFO] o.a.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.54] +2026-05-24 00:47:17 [INFO] o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +2026-05-24 00:47:17 [INFO] o.s.b.w.s.c.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 844 ms +2026-05-24 00:47:18 [INFO] o.h.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +2026-05-24 00:47:18 [INFO] org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.49.Final +2026-05-24 00:47:18 [INFO] o.h.c.i.RegionFactoryInitiator - HHH000026: Second-level cache disabled +2026-05-24 00:47:18 [INFO] o.s.o.j.p.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +2026-05-24 00:47:18 [INFO] com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +2026-05-24 00:47:19 [INFO] com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection oracle.jdbc.driver.T4CConnection@54463380 +2026-05-24 00:47:19 [INFO] com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +2026-05-24 00:47:19 [INFO] o.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 21.3 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +2026-05-24 00:47:20 [INFO] o.h.e.t.j.p.i.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +2026-05-24 00:47:21 [INFO] o.s.o.j.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +2026-05-24 00:47:21 [WARN] o.s.b.a.o.j.JpaBaseConfiguration$JpaWebConfiguration - spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2026-05-24 00:47:21 [INFO] o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port 8080 (http) with context path '/' +2026-05-24 00:47:21 [INFO] c.o.o.OraclequantapiApplication - Started OraclequantapiApplication in 5.353 seconds (process running for 5.61) +2026-05-24 00:47:37 [INFO] o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +2026-05-24 00:47:37 [INFO] o.s.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +2026-05-24 00:47:37 [INFO] o.s.web.servlet.DispatcherServlet - Completed initialization in 3 ms +2026-05-24 00:47:37 [INFO] c.o.o.s.impl.MeasurementServiceImpl - Received measurement conversion request +2026-05-24 00:47:37 [INFO] c.o.o.s.impl.MeasurementServiceImpl - Successfully converted measurement input diff --git a/logs/application.log.2026-05-23.0.gz b/logs/application.log.2026-05-23.0.gz new file mode 100644 index 0000000000000000000000000000000000000000..eab91bb48a3f53fc622db37b4c7871b1bf5a7ee7 GIT binary patch literal 626 zcmV-&0*(D2iwFP!00000|Gkw>Zxb;PhVT4}Q7m3JnFchuzG2-)BBvJN2~QuBEM7y#e)lFKhG~Ef@_h-(TH=5{|Dc zFO|WsrL;j7`n)KNRx)U3p$5YsebDv}o?cW^eE&f%BxD_timVIwI!xiypbuHQ+iAmD z@`cb-LQ+qXKGH0>BAKJ4(&HR$sIg+=wg3rp?=U3FNFpSlm3!gFqPGz(g7oJ1~}N2EjoFIZkA0!g^T`PO8Ysege&Goq!W0#^PR} z2yV_$@p*Z>!SN9N0zGH2ig58dXle9!ZpgCLh4TTrX*Y$lX$ZxEIyW&=un2!{`N4S< zJY$*7>d|ilj za$;nhl4j~CJ}0*f9IQLFgcd&Da6ZO7=hks&HwJv+Y`|~fITIqrRu%l5&b|`kubm5r zF}=qjuI#1UykI>}i>=+x(hkh&@3>{Xbr`bila+f^m2V;W$7yo^Hym;c31b+UvqLnZ!Mg z1+CVKeZgJuzvEnN7-!2-+~&6jOth)LnkEU&65`|I*;$ z6hWS+jI_6Njt31(6>Tsnjd`d5VF#;iQ63;=&Hq$V1l^opUmgw8cEO|JKQJTh>_ACB M0C2_2V5SEE01mw^b^rhX literal 0 HcmV?d00001 diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java b/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java index 513f598..eaaa0c1 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java @@ -42,8 +42,19 @@ public List convertMeasurements(String input) { ); } + List results = + measurementParser.parseMeasurements(input); + + MeasurementRecord measurementRecord = + new MeasurementRecord( + input, + results.toString() + ); + + measurementRecordRepository.save(measurementRecord); + logger.info("Successfully converted measurement input"); - return measurementParser.parseMeasurements(input); + return results; } } \ No newline at end of file diff --git a/version.txt b/version.txt index 5bb18e8..58a6c37 100644 --- a/version.txt +++ b/version.txt @@ -42,7 +42,7 @@ v0.9.0 - Added Oracle database and JPA datasource configuration ----------------------------------------------- - +v1.0.0 - Implemented Oracle database persistence for measurement history ----------------------------------------------- From 1ee782c3a46ec33afce1adf45d6540bad59bec66 Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Sun, 24 May 2026 00:53:12 +0400 Subject: [PATCH 37/45] Added measurement history service contract --- .../oraclequantapi/service/MeasurementService.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/service/MeasurementService.java b/src/main/java/com/oraclequantapi/oraclequantapi/service/MeasurementService.java index 14a5a29..64d218e 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/service/MeasurementService.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/service/MeasurementService.java @@ -1,7 +1,9 @@ package com.oraclequantapi.oraclequantapi.service; +import com.oraclequantapi.oraclequantapi.entity.MeasurementRecord; import java.util.List; public interface MeasurementService { List convertMeasurements(String input); -} + List getMeasurementHistory(); +} \ No newline at end of file From d5a948938a2a496655a7c21e42c8a61470607c00 Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Sun, 24 May 2026 00:57:09 +0400 Subject: [PATCH 38/45] Implemented measurement history retrieval service --- .../service/impl/MeasurementServiceImpl.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java b/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java index eaaa0c1..a0ff095 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java @@ -57,4 +57,12 @@ public List convertMeasurements(String input) { return results; } + + @Override + public List getMeasurementHistory() { + + logger.info("Fetching measurement history"); + + return measurementRecordRepository.findAll(); + } } \ No newline at end of file From 9ca7967c5a03fbd834e147a571fd3678622c65d8 Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Sun, 24 May 2026 01:05:45 +0400 Subject: [PATCH 39/45] Implemented measurement history REST endpoint --- .../oraclequantapi/controller/MeasurementController.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/controller/MeasurementController.java b/src/main/java/com/oraclequantapi/oraclequantapi/controller/MeasurementController.java index 340c9a1..fd17203 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/controller/MeasurementController.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/controller/MeasurementController.java @@ -4,6 +4,7 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import com.oraclequantapi.oraclequantapi.entity.MeasurementRecord; import java.util.List; @@ -25,4 +26,10 @@ public List convertMeasurements( return measurementService.convertMeasurements(input); } + + @GetMapping("/measurement-history") + public List getMeasurementHistory() { + + return measurementService.getMeasurementHistory(); + } } \ No newline at end of file From efd7c48b9ef52031cfbad431b722d007624aa14e Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Sun, 24 May 2026 01:10:33 +0400 Subject: [PATCH 40/45] Implemented measurement history retrieval API --- logs/application.log | 38 ++++++++++++++++++++++++++++++++++++++ version.txt | 2 +- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/logs/application.log b/logs/application.log index 174c827..02aac50 100644 --- a/logs/application.log +++ b/logs/application.log @@ -104,3 +104,41 @@ 2026-05-24 00:47:37 [INFO] o.s.web.servlet.DispatcherServlet - Completed initialization in 3 ms 2026-05-24 00:47:37 [INFO] c.o.o.s.impl.MeasurementServiceImpl - Received measurement conversion request 2026-05-24 00:47:37 [INFO] c.o.o.s.impl.MeasurementServiceImpl - Successfully converted measurement input +2026-05-24 01:08:11 [INFO] o.s.b.w.e.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete +2026-05-24 01:08:11 [INFO] o.s.b.w.e.tomcat.GracefulShutdown - Graceful shutdown complete +2026-05-24 01:08:11 [INFO] o.s.o.j.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +2026-05-24 01:08:11 [INFO] com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +2026-05-24 01:08:14 [INFO] com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed. +2026-05-24 01:08:34 [INFO] c.o.o.OraclequantapiApplication - Starting OraclequantapiApplication using Java 17.0.18 with PID 20491 (/Users/saif/Desktop/measurement-api/oraclequantapi/target/classes started by saif in /Users/saif/Desktop/measurement-api/oraclequantapi) +2026-05-24 01:08:34 [INFO] c.o.o.OraclequantapiApplication - No active profile set, falling back to 1 default profile: "default" +2026-05-24 01:08:41 [INFO] o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2026-05-24 01:08:41 [INFO] o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 37 ms. Found 1 JPA repository interface. +2026-05-24 01:08:42 [INFO] o.s.b.w.e.tomcat.TomcatWebServer - Tomcat initialized with port 8080 (http) +2026-05-24 01:08:42 [INFO] o.a.catalina.core.StandardService - Starting service [Tomcat] +2026-05-24 01:08:42 [INFO] o.a.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.54] +2026-05-24 01:08:42 [INFO] o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +2026-05-24 01:08:42 [INFO] o.s.b.w.s.c.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 7220 ms +2026-05-24 01:08:42 [INFO] o.h.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +2026-05-24 01:08:42 [INFO] org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.49.Final +2026-05-24 01:08:42 [INFO] o.h.c.i.RegionFactoryInitiator - HHH000026: Second-level cache disabled +2026-05-24 01:08:42 [INFO] o.s.o.j.p.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +2026-05-24 01:08:42 [INFO] com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +2026-05-24 01:08:44 [INFO] com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection oracle.jdbc.driver.T4CConnection@49cb5030 +2026-05-24 01:08:44 [INFO] com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +2026-05-24 01:08:44 [INFO] o.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 21.3 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +2026-05-24 01:08:44 [INFO] o.h.e.t.j.p.i.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +2026-05-24 01:08:46 [INFO] o.s.o.j.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +2026-05-24 01:08:46 [WARN] o.s.b.a.o.j.JpaBaseConfiguration$JpaWebConfiguration - spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2026-05-24 01:08:46 [INFO] o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port 8080 (http) with context path '/' +2026-05-24 01:08:46 [INFO] c.o.o.OraclequantapiApplication - Started OraclequantapiApplication in 14.464 seconds (process running for 17.108) +2026-05-24 01:09:11 [INFO] o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +2026-05-24 01:09:11 [INFO] o.s.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +2026-05-24 01:09:11 [INFO] o.s.web.servlet.DispatcherServlet - Completed initialization in 4 ms +2026-05-24 01:09:11 [INFO] c.o.o.s.impl.MeasurementServiceImpl - Fetching measurement history diff --git a/version.txt b/version.txt index 58a6c37..297d345 100644 --- a/version.txt +++ b/version.txt @@ -46,6 +46,6 @@ v1.0.0 - Implemented Oracle database persistence for measurement history ----------------------------------------------- - +v1.1.0 - Added measurement history retrieval endpoint ----------------------------------------------- \ No newline at end of file From c0c24bd3792b66e6716e40c3c32e9dfefc0120d3 Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Sun, 24 May 2026 10:39:02 +0400 Subject: [PATCH 41/45] Added README.md file --- README.md | 117 +++++++++++++++++++++---------------------- logs/application.log | 11 ++++ version.txt | 20 ++++++++ 3 files changed, 87 insertions(+), 61 deletions(-) diff --git a/README.md b/README.md index b1cccfd..b7279e8 100644 --- a/README.md +++ b/README.md @@ -1,61 +1,56 @@ -## Submission Instructions - -To submit your Oracle JAVA Spring Boot Maven project as a solution, please follow these steps: - -### Step 1: Install git on your PC -- Install "git" as shown in this tutorial: [How to install git](https://youtu.be/iYkLrXobBbA?si=_l0haibv_X9NpIjJ) -- Open command prompt and run - ```bash - git version - ``` -- If you see the version, then git is successfully installed. - -### Step 2: Fork the Repository -- Navigate to [this repository](https://github.com/CodelineAtyab/oraclequantapi) provided by Codeline. -- Click on the "Fork" button at the top-right corner of the page to create a copy of the repository under your own GitHub account. - -### Step 3: Clone the Forked Repository -- Open your terminal or command prompt. -- Clone the forked repository to your local machine using the following command: - ```bash - git clone https://github.com/your-username/repo-name.git - ``` - -### Step 4: Create a new branch -- Navigate to the cloned repository directory - ```bash - cd repo-name - ``` -- Create a new branch for your code submissions (Replace your-name with your name in your-name-submission-branch): - ```bash - git checkout -b your-name-submission-branch - ``` - - -### Step 5: Add Your Code -- Implement the API - -### Step 6: Commit your changes -- Run the following commands in order to commit your changes: - ```bash - git add * - git commit -m "Meaningful commit message here" - ``` - -### Step 7: Push Your Branch to GitHub -- Run the following commands to upload the changes to the forked github repository (Replace your-name with your name in your-name-submission-branch): - ```bash - git push origin your-name-submission-branch - ``` - -### Step 8: Create a Pull Request -- Go to your forked repository on GitHub. -- You should see a prompt to create a pull request. Click on "Compare & pull request". -- Provide a title and description for your pull request, then click "Create pull request". - -### Step 9: Notify Codeline -- Notify on slack that you have created a PR for your solution. - -## Note: If you face any issues in the process above, Please do the following: -- Watch [this youtube tutorial](https://www.youtube.com/watch?v=a_FLqX3vGR4) -- Contact Ikhlas or Atyab. +# Oracle Quant API + +## Project Overview + +Oracle Quant API is a Spring Boot backend application that processes encoded measurement strings and converts them into readable numerical package totals. + +The project was designed using clean layered architecture and follows object oriented programming principles such as abstraction, encapsulation, and separation of responsibilities. + +The application supports: + +* Encoded measurement parsing +* REST API communication +* Validation and centralized exception handling +* Logging with rolling log files +* Oracle database persistence +* Measurement history retrieval + +The application uses Oracle Database running inside Docker and persists all successful conversion requests. + +--- + +## Technologies Used + +* Java 17 +* Spring Boot +* Maven +* Spring Data JPA +* Hibernate +* Oracle Database XE +* Docker +* SLF4J Logging +* Logback + +--- + +## Features + +* Encoded measurement parsing +* REST API architecture +* Oracle database persistence +* Measurement history retrieval +* Centralized exception handling +* Rolling application logs + +--- + +## Project Structure + +```text +controller/ +service/ +service/impl/ +repository/ +entity/ +parser/ +exception/ \ No newline at end of file diff --git a/logs/application.log b/logs/application.log index 02aac50..c359bfa 100644 --- a/logs/application.log +++ b/logs/application.log @@ -142,3 +142,14 @@ 2026-05-24 01:09:11 [INFO] o.s.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' 2026-05-24 01:09:11 [INFO] o.s.web.servlet.DispatcherServlet - Completed initialization in 4 ms 2026-05-24 01:09:11 [INFO] c.o.o.s.impl.MeasurementServiceImpl - Fetching measurement history +2026-05-24 02:31:58 [WARN] com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=46m44s102ms). +2026-05-24 03:15:17 [WARN] com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=43m18s679ms). +2026-05-24 03:46:34 [WARN] com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=31m17s96ms). +2026-05-24 03:59:28 [WARN] com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=12m54s588ms). +2026-05-24 07:28:08 [WARN] com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=3h28m39s638ms). +2026-05-24 09:53:26 [WARN] com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=2h24m47s572ms). +2026-05-24 10:00:01 [WARN] com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta=6m35s208ms). +2026-05-24 10:09:35 [INFO] o.s.b.w.e.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete +2026-05-24 10:09:35 [INFO] o.s.b.w.e.tomcat.GracefulShutdown - Graceful shutdown complete +2026-05-24 10:09:35 [INFO] o.s.o.j.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' +2026-05-24 10:09:35 [INFO] com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... diff --git a/version.txt b/version.txt index 297d345..09a8ec5 100644 --- a/version.txt +++ b/version.txt @@ -48,4 +48,24 @@ v1.0.0 - Implemented Oracle database persistence for measurement history v1.1.0 - Added measurement history retrieval endpoint +----------------------------------------------- + + + +----------------------------------------------- + + + +----------------------------------------------- + + + +----------------------------------------------- + + + +----------------------------------------------- + + + ----------------------------------------------- \ No newline at end of file From 55af2bb8076edab60c9a46a42a1faf89977541c6 Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Sun, 24 May 2026 11:08:39 +0400 Subject: [PATCH 42/45] Added deployment and setup documentation --- README.md | 78 +++++++++++++++++++++++++++++++++++++++++++- logs/application.log | 29 ++++++++++++++++ 2 files changed, 106 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b7279e8..774f7ef 100644 --- a/README.md +++ b/README.md @@ -53,4 +53,80 @@ service/impl/ repository/ entity/ parser/ -exception/ \ No newline at end of file +exception/ + +## Oracle Linux Deployment + +This project was packaged into a deployable Spring Boot JAR file and tested successfully outside IntelliJ. + +### Build the Application + +Run the following command inside the project directory: + +```bash +mvn clean package -DskipTests +``` + +After a successful build, the JAR file will be generated inside: + +```text +target/oraclequantapi-0.0.1-SNAPSHOT.jar +``` + +### Run the Application + +Start the Spring Boot application using: + +```bash +java -jar target/oraclequantapi-0.0.1-SNAPSHOT.jar +``` + +### Oracle Database Setup + +Oracle Database was configured using Docker. + +Start the Oracle XE container: + +```bash +docker run -d \ +--name oracle-db \ +-p 1521:1521 \ +-e ORACLE_PASSWORD=oracle \ +gvenzl/oracle-xe:21-slim +``` + +### Verify Database Connection + +Access the Oracle container: + +```bash +docker exec -it oracle-db bash +``` + +Connect to SQL Plus: + +```bash +sqlplus system/oracle@localhost:1521/XE +``` + +Verify stored records: + +```sql +SELECT * FROM measurement_record; +``` + +### API Testing + +The API was tested using Postman. + +Example request: + +```http +GET http://localhost:8080/convert-measurements?input=dz_a_aazzaaa +``` + +Example response: + +```json +[28,53,1] +``` \ No newline at end of file diff --git a/logs/application.log b/logs/application.log index c359bfa..6965f82 100644 --- a/logs/application.log +++ b/logs/application.log @@ -153,3 +153,32 @@ 2026-05-24 10:09:35 [INFO] o.s.b.w.e.tomcat.GracefulShutdown - Graceful shutdown complete 2026-05-24 10:09:35 [INFO] o.s.o.j.LocalContainerEntityManagerFactoryBean - Closing JPA EntityManagerFactory for persistence unit 'default' 2026-05-24 10:09:35 [INFO] com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated... +2026-05-24 11:06:24 [INFO] c.o.o.OraclequantapiApplication - Starting OraclequantapiApplication v0.0.1-SNAPSHOT using Java 17.0.18 with PID 24161 (/Users/saif/Desktop/measurement-api/oraclequantapi/target/oraclequantapi-0.0.1-SNAPSHOT.jar started by saif in /Users/saif/Desktop/measurement-api/oraclequantapi) +2026-05-24 11:06:27 [INFO] c.o.o.OraclequantapiApplication - No active profile set, falling back to 1 default profile: "default" +2026-05-24 11:06:29 [INFO] o.s.d.r.c.RepositoryConfigurationDelegate - Bootstrapping Spring Data JPA repositories in DEFAULT mode. +2026-05-24 11:06:29 [INFO] o.s.d.r.c.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 87 ms. Found 1 JPA repository interface. +2026-05-24 11:06:29 [INFO] o.s.b.w.e.tomcat.TomcatWebServer - Tomcat initialized with port 8080 (http) +2026-05-24 11:06:29 [INFO] o.a.catalina.core.StandardService - Starting service [Tomcat] +2026-05-24 11:06:29 [INFO] o.a.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.54] +2026-05-24 11:06:29 [INFO] o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext +2026-05-24 11:06:29 [INFO] o.s.b.w.s.c.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 2520 ms +2026-05-24 11:06:30 [INFO] o.h.jpa.internal.util.LogHelper - HHH000204: Processing PersistenceUnitInfo [name: default] +2026-05-24 11:06:30 [INFO] org.hibernate.Version - HHH000412: Hibernate ORM core version 6.6.49.Final +2026-05-24 11:06:30 [INFO] o.h.c.i.RegionFactoryInitiator - HHH000026: Second-level cache disabled +2026-05-24 11:06:31 [INFO] o.s.o.j.p.SpringPersistenceUnitInfo - No LoadTimeWeaver setup: ignoring JPA class transformer +2026-05-24 11:06:31 [INFO] com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... +2026-05-24 11:06:35 [INFO] com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection oracle.jdbc.driver.T4CConnection@561d88ee +2026-05-24 11:06:35 [INFO] com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed. +2026-05-24 11:06:36 [INFO] o.hibernate.orm.connections.pooling - HHH10001005: Database info: + Database JDBC URL [Connecting through datasource 'HikariDataSource (HikariPool-1)'] + Database driver: undefined/unknown + Database version: 21.3 + Autocommit mode: undefined/unknown + Isolation level: undefined/unknown + Minimum pool size: undefined/unknown + Maximum pool size: undefined/unknown +2026-05-24 11:06:37 [INFO] o.h.e.t.j.p.i.JtaPlatformInitiator - HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration) +2026-05-24 11:06:43 [INFO] o.s.o.j.LocalContainerEntityManagerFactoryBean - Initialized JPA EntityManagerFactory for persistence unit 'default' +2026-05-24 11:06:43 [WARN] o.s.b.a.o.j.JpaBaseConfiguration$JpaWebConfiguration - spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning +2026-05-24 11:06:44 [INFO] o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port 8080 (http) with context path '/' +2026-05-24 11:06:44 [INFO] c.o.o.OraclequantapiApplication - Started OraclequantapiApplication in 20.266 seconds (process running for 20.826) From f9066ad79c4fb4f79a7f3511d779ce1874d6cc2d Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Sun, 24 May 2026 11:16:29 +0400 Subject: [PATCH 43/45] Completed final API validation and deployment testing --- logs/application.log | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/logs/application.log b/logs/application.log index 6965f82..5a523f5 100644 --- a/logs/application.log +++ b/logs/application.log @@ -182,3 +182,9 @@ 2026-05-24 11:06:43 [WARN] o.s.b.a.o.j.JpaBaseConfiguration$JpaWebConfiguration - spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning 2026-05-24 11:06:44 [INFO] o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port 8080 (http) with context path '/' 2026-05-24 11:06:44 [INFO] c.o.o.OraclequantapiApplication - Started OraclequantapiApplication in 20.266 seconds (process running for 20.826) +2026-05-24 11:12:12 [INFO] o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet' +2026-05-24 11:12:12 [INFO] o.s.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet' +2026-05-24 11:12:12 [INFO] o.s.web.servlet.DispatcherServlet - Completed initialization in 67 ms +2026-05-24 11:12:12 [INFO] c.o.o.s.impl.MeasurementServiceImpl - Received measurement conversion request +2026-05-24 11:12:14 [INFO] c.o.o.s.impl.MeasurementServiceImpl - Successfully converted measurement input +2026-05-24 11:15:32 [INFO] c.o.o.s.impl.MeasurementServiceImpl - Fetching measurement history From 6942efa3b3e8514e8f8f55c2498b87aecb6c09c0 Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Mon, 25 May 2026 11:49:02 +0400 Subject: [PATCH 44/45] Finalising Functional Requirements --- .DS_Store | Bin 0 -> 8196 bytes logs/application.log | 202 ++---------------- logs/application.log.2026-05-24.0.gz | Bin 0 -> 20 bytes .../OraclequantapiApplication.java | 4 +- .../controller/MeasurementController.java | 42 +++- .../entity/MeasurementRecord.java | 30 ++- .../exception/GlobalExceptionHandler.java | 7 +- .../InvalidMeasurementInputException.java | 6 +- .../oraclequantapi/parser/DecodedNumber.java | 4 +- .../parser/MeasurementParser.java | 33 +-- .../service/MeasurementService.java | 15 +- .../service/impl/MeasurementServiceImpl.java | 64 +++++- src/main/resources/application.properties | 2 +- version.txt | 21 +- 14 files changed, 212 insertions(+), 218 deletions(-) create mode 100644 .DS_Store create mode 100644 logs/application.log.2026-05-24.0.gz diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..6c2a39d74279d42c6a9627b7eb6a6127ef2a0416 GIT binary patch literal 8196 zcmeHM&rcIU6n;~xY(->2P|%n(_F@9TLi`zHs0E_L5C|n$M6KKHP&aI6n%#vegrs-9 z=-ofS#FIDU#iJLm-i-bS`VSa=GqVeHD+ez|;=E+$do%OB*`04YJ2P7VAo=ym7{DL^ z7?=c_U6}pGM7v0BmI!M^9Km>)ak*V~c^S)Q8(UXs1+)TM0j+>mKr8SsD1d9WFk_!} zU$yF7E1(tlFBK5)hcqUExe%KQ<*NfTc?3XAVzo5%<<=iDEh-RmAvP6a4H{9Qh$@tX zM+_349Eb|X_FTwsDpcV>eEPl5{^s^G`Y z?|Ez+{V7cbCZPr!z@QQ1y@~ORhzFx!qhD#|ld~~?C)Dx!HDo`=+>Nnc#MmiVfN8h^ zQ!tA-+TMRcyc+i2cL(_3f!*3~!i%vELjV@?sz4!V<$_S+^&TZ!xaEdl55Ic6E!SPg z53<=$B+-#Pbhy*#G`fuYg-5(m2&`b;&s*M#C@pgCmLuOPFFCYPGW#bv3oM6GPX;&@ zij;eI99H3tJYQ!OU&ajGF?;)t_xAS= z3=Et&IXHCc^iat>UbgJDswZxDlDpi?yX$nN>N%A{-Lf54Ee7;)P;fSB$?S_!7ii_d zZq?$GI&%7VD`a;!JxZDEZ*Fzfr$KR#zg#kVeB0x$JI{S5a5!7O=cCv&0jN#?!vRr;w##u?4z=2c4ySHofajnBdotidKchnMgQ-oXd> z4By}f=_DpOONPk>a-B?&TV#gZB{r!LhlpP_S|WPTXH+@LiH}~(gWf23%;l_#^&+MV zXE?=K;Ddv6lHvRca8}0WgP8HV^8w@Z`j3ie(+V6U1v=Et4vIa%^#0%f57LnIy=n!t z0)MCgNlq1}#1=Q&G{ob@hB}SuAtqsh*HkD&FcTC}FE;{+JAW9WpAOq{AvP6a3!45A NAZ5^*R^YEH@C% convertMeasurements( - @RequestParam String input + @RequestParam String input, + HttpServletRequest request + ) { - return measurementService.convertMeasurements(input); + return measurementService.convertMeasurements( + input, + request.getRemoteAddr() + ); } @GetMapping("/measurement-history") public List getMeasurementHistory() { return measurementService.getMeasurementHistory(); + + } + + @GetMapping("/measurement-history/{id}") + public MeasurementRecord getMeasurementById( + @PathVariable Long id + ) { + return measurementService.getMeasurementById(id); } + + @PutMapping("/measurement-history/{id}") + public MeasurementRecord updateMeasurementRecord( + @PathVariable Long id, + @RequestBody MeasurementRecord updatedRecord + + ) { + return measurementService.updateMeasurementRecord( + id, + updatedRecord + ); + } + + @DeleteMapping("/measurement-history/{id}") + public void deleteMeasurementRecord( + @PathVariable Long id +) { + + measurementService.deleteMeasurementRecord(id); + } } \ No newline at end of file diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/entity/MeasurementRecord.java b/src/main/java/com/oraclequantapi/oraclequantapi/entity/MeasurementRecord.java index 37f37dd..de99eaa 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/entity/MeasurementRecord.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/entity/MeasurementRecord.java @@ -4,6 +4,7 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import java.time.LocalDateTime; @Entity public class MeasurementRecord { @@ -12,6 +13,10 @@ public class MeasurementRecord { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + private LocalDateTime timestamp; + + private String sourceIpAddress; + private String input; private String output; @@ -20,15 +25,30 @@ public MeasurementRecord() { } - public MeasurementRecord(String input, String output) { + public MeasurementRecord( + String input, + String output, + String sourceIpAddress + + ) { this.input = input; this.output = output; + this.sourceIpAddress = sourceIpAddress; + this.timestamp = LocalDateTime.now(); } public Long getId() { return id; } + public LocalDateTime getTimestamp() { + return timestamp; + } + + public String getSourceIpAddress() { + return sourceIpAddress; + } + public String getInput() { return input; } @@ -36,4 +56,12 @@ public String getInput() { public String getOutput() { return output; } + + public void setInput(String input) { + this.input = input; + } + + public void setOutput(String output) { + this.output = output; + } } \ No newline at end of file diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/exception/GlobalExceptionHandler.java b/src/main/java/com/oraclequantapi/oraclequantapi/exception/GlobalExceptionHandler.java index 611e530..396e314 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/exception/GlobalExceptionHandler.java @@ -10,10 +10,11 @@ @ControllerAdvice public class GlobalExceptionHandler { - @ExceptionHandler(IllegalArgumentException.class) + @ExceptionHandler(InvalidMeasurementInputException.class) public ResponseEntity> - handleIllegalArgumentException( - IllegalArgumentException exception + handleInvalidMeasurementInputException( + InvalidMeasurementInputException exception + ) { return ResponseEntity diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/exception/InvalidMeasurementInputException.java b/src/main/java/com/oraclequantapi/oraclequantapi/exception/InvalidMeasurementInputException.java index 8f2a31f..6fb5a7b 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/exception/InvalidMeasurementInputException.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/exception/InvalidMeasurementInputException.java @@ -1,4 +1,8 @@ package com.oraclequantapi.oraclequantapi.exception; -public class InvalidMeasurementInputException { +public class InvalidMeasurementInputException extends RuntimeException { + + public InvalidMeasurementInputException(String message) { + super(message); + } } diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/parser/DecodedNumber.java b/src/main/java/com/oraclequantapi/oraclequantapi/parser/DecodedNumber.java index ea33b38..604aa71 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/parser/DecodedNumber.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/parser/DecodedNumber.java @@ -2,9 +2,9 @@ public class DecodedNumber { - private int value; + private final int value; - private int nextIndex; + private final int nextIndex; public DecodedNumber(int value, int nextIndex) { this.value = value; diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java b/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java index 4925019..abc2409 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/parser/MeasurementParser.java @@ -1,16 +1,20 @@ package com.oraclequantapi.oraclequantapi.parser; +import com.oraclequantapi.oraclequantapi.exception.InvalidMeasurementInputException; + import java.util.ArrayList; import java.util.List; public class MeasurementParser { public List parseMeasurements(String input) { + List results = new ArrayList<>(); int currentIndex = 0; while (currentIndex < input.length()) { + DecodedNumber packageCountResult = readEncodedNumber(input, currentIndex); @@ -38,35 +42,39 @@ public List parseMeasurements(String input) { return results; } - public static void main(String[] args) { + private DecodedNumber readEncodedNumber( + String input, + int currentIndex - MeasurementParser parser = new MeasurementParser(); + ) { - System.out.println( - parser.parseMeasurements("za_a_a_a_a_a_a_a_a_a_a_a_a_azaaa") - ); - } + char currentCharacter = input.charAt(currentIndex); + if (!(currentCharacter == '_' + || (currentCharacter >= 'a' + && currentCharacter <= 'z'))) { + + throw new InvalidMeasurementInputException( + "Invalid character in measurement input" + ); + } - private DecodedNumber readEncodedNumber(String input, int currentIndex) { - char currentCharacter = input.charAt(currentIndex); int value = 0; if (currentCharacter == 'z') { + while (currentIndex < input.length() && input.charAt(currentIndex) == 'z') { value += 26; currentIndex++; + } if (currentIndex < input.length()) { char terminatingCharacter = input.charAt(currentIndex); - if (terminatingCharacter == '_') { - value += 0; - } - else { + if (terminatingCharacter != '_') { value += (terminatingCharacter - 'a') + 1; } currentIndex++; @@ -76,6 +84,7 @@ private DecodedNumber readEncodedNumber(String input, int currentIndex) { else { if (currentCharacter == '_') { value = 0; + } else { value = (currentCharacter - 'a') + 1; } diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/service/MeasurementService.java b/src/main/java/com/oraclequantapi/oraclequantapi/service/MeasurementService.java index 64d218e..15b412c 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/service/MeasurementService.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/service/MeasurementService.java @@ -4,6 +4,19 @@ import java.util.List; public interface MeasurementService { - List convertMeasurements(String input); + List convertMeasurements( + String input, + String sourceIpAddress + ); + List getMeasurementHistory(); + + MeasurementRecord getMeasurementById(Long id); + + void deleteMeasurementRecord(Long id); + + MeasurementRecord updateMeasurementRecord( + Long id, + MeasurementRecord updatedRecord + ); } \ No newline at end of file diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java b/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java index a0ff095..0fde35d 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/service/impl/MeasurementServiceImpl.java @@ -6,6 +6,7 @@ import org.springframework.stereotype.Service; import com.oraclequantapi.oraclequantapi.entity.MeasurementRecord; import com.oraclequantapi.oraclequantapi.repository.MeasurementRecordRepository; +import com.oraclequantapi.oraclequantapi.exception.InvalidMeasurementInputException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -30,14 +31,18 @@ public MeasurementServiceImpl( } @Override - public List convertMeasurements(String input) { + public List convertMeasurements( + String input, + String sourceIpAddress + + ) { logger.info("Received measurement conversion request"); if (input == null || input.isBlank()) { logger.warn("Received invalid blank measurement input"); - throw new IllegalArgumentException( + throw new InvalidMeasurementInputException( "Input parameter is required" ); } @@ -48,7 +53,8 @@ public List convertMeasurements(String input) { MeasurementRecord measurementRecord = new MeasurementRecord( input, - results.toString() + results.toString(), + sourceIpAddress ); measurementRecordRepository.save(measurementRecord); @@ -60,9 +66,57 @@ public List convertMeasurements(String input) { @Override public List getMeasurementHistory() { - logger.info("Fetching measurement history"); - return measurementRecordRepository.findAll(); } + + @Override + public MeasurementRecord getMeasurementById(Long id) { + + logger.info("Fetching measurement record by id"); + + return measurementRecordRepository.findById(id) + .orElseThrow(() -> + new InvalidMeasurementInputException( + "Measurement record not found" + ) + ); + } + + @Override + public void deleteMeasurementRecord(Long id) { + + logger.info("Deleting measurement record"); + + if (!measurementRecordRepository.existsById(id)) { + + throw new InvalidMeasurementInputException( + "Measurement record not found" + ); + } + + measurementRecordRepository.deleteById(id); + } + + @Override + public MeasurementRecord updateMeasurementRecord( + Long id, + MeasurementRecord updatedRecord + ) { + + logger.info("Updating measurement record"); + + MeasurementRecord existingRecord = + measurementRecordRepository.findById(id) + .orElseThrow(() -> + new InvalidMeasurementInputException( + "Measurement record not found" + ) + ); + + existingRecord.setInput(updatedRecord.getInput()); + existingRecord.setOutput(updatedRecord.getOutput()); + + return measurementRecordRepository.save(existingRecord); + } } \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 2c4fa9d..967b60c 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -10,7 +10,7 @@ logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} - %msg%n logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss} [%level] %logger{36} - %msg%n -spring.datasource.url=jdbc:oracle:thin:@localhost:1521/XE +spring.datasource.url=jdbc:oracle:thin:@192.168.100.42:1521/XE spring.datasource.username=system diff --git a/version.txt b/version.txt index 09a8ec5..e829161 100644 --- a/version.txt +++ b/version.txt @@ -50,22 +50,35 @@ v1.1.0 - Added measurement history retrieval endpoint ----------------------------------------------- +v1.2.0 - Added measurement history CRUD operations: +* GET measurement history by id +* UPDATE measurement history via PUT +* DELETE measurement history records ----------------------------------------------- +v1.3.0 - Added request metadata persistence: +* timestamp tracking +* source IP address tracking +* Oracle XE history persistence improvements ----------------------------------------------- +v1.4.0 - Improved parser validation and exception handling: +* custom InvalidMeasurementInputException +* invalid character validation +* centralized error responses ----------------------------------------------- +v1.5.0 - Production deployment completed: - ------------------------------------------------ - - +* Maven runnable fat JAR packaging +* Oracle Linux deployment +* SSH/SCP deployment workflow +* REST API validation via curl ----------------------------------------------- \ No newline at end of file From 4ed0249bd3bc419e6e2d4ed1f169dd853f643530 Mon Sep 17 00:00:00 2001 From: SAIFMOHSIN8 Date: Mon, 25 May 2026 14:05:55 +0400 Subject: [PATCH 45/45] Final production-ready evaluation release --- README.md | 307 +++++++++++++++++++++++++++++++++++++++++++++++----- version.txt | 10 ++ 2 files changed, 289 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 774f7ef..0761768 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Oracle Quant API is a Spring Boot backend application that processes encoded measurement strings and converts them into readable numerical package totals. -The project was designed using clean layered architecture and follows object oriented programming principles such as abstraction, encapsulation, and separation of responsibilities. +The project was designed using clean layered architecture and follows object-oriented programming principles such as abstraction, encapsulation, inheritance, polymorphism, and separation of responsibilities. The application supports: @@ -13,9 +13,9 @@ The application supports: * Validation and centralized exception handling * Logging with rolling log files * Oracle database persistence -* Measurement history retrieval +* Measurement history retrieval and management -The application uses Oracle Database running inside Docker and persists all successful conversion requests. +The application uses Oracle Database XE and persists all successful conversion requests. --- @@ -27,6 +27,7 @@ The application uses Oracle Database running inside Docker and persists all succ * Spring Data JPA * Hibernate * Oracle Database XE +* Oracle Linux * Docker * SLF4J Logging * Logback @@ -39,8 +40,23 @@ The application uses Oracle Database running inside Docker and persists all succ * REST API architecture * Oracle database persistence * Measurement history retrieval +* Measurement history deletion * Centralized exception handling * Rolling application logs +* Oracle Linux deployment support + +--- + +## Design Principles + +The application follows: + +* Single Responsibility Principle (SRP) +* Encapsulation +* Abstraction +* Interface-driven development +* Layered architecture +* Separation of concerns --- @@ -54,36 +70,35 @@ repository/ entity/ parser/ exception/ +``` -## Oracle Linux Deployment - -This project was packaged into a deployable Spring Boot JAR file and tested successfully outside IntelliJ. - -### Build the Application - -Run the following command inside the project directory: +--- -```bash -mvn clean package -DskipTests -``` +## Oracle Database Configuration -After a successful build, the JAR file will be generated inside: +Database configuration is located inside: ```text -target/oraclequantapi-0.0.1-SNAPSHOT.jar +src/main/resources/application.properties ``` -### Run the Application +Example configuration: -Start the Spring Boot application using: +```properties +spring.datasource.url=jdbc:oracle:thin:@localhost:1521/XE +spring.datasource.username=system +spring.datasource.password=oracle +spring.datasource.driver-class-name=oracle.jdbc.OracleDriver -```bash -java -jar target/oraclequantapi-0.0.1-SNAPSHOT.jar +spring.jpa.hibernate.ddl-auto=update +spring.jpa.show-sql=true ``` -### Oracle Database Setup +--- + +## Oracle Database Setup -Oracle Database was configured using Docker. +Oracle Database XE was configured using Docker. Start the Oracle XE container: @@ -95,7 +110,11 @@ docker run -d \ gvenzl/oracle-xe:21-slim ``` -### Verify Database Connection +Verify the running container: + +```bash +docker ps +``` Access the Oracle container: @@ -115,18 +134,250 @@ Verify stored records: SELECT * FROM measurement_record; ``` -### API Testing +--- + +## Build the Application + +Run the following command inside the project directory: + +```bash +mvn clean package -DskipTests +``` + +After a successful build, the JAR file will be generated inside: + +```text +target/oraclequantapi-0.0.1-SNAPSHOT.jar +``` + +--- + +## Run the Application + +Start the Spring Boot application using: + +```bash +java -jar target/oraclequantapi-0.0.1-SNAPSHOT.jar +``` + +The application runs on: + +```text +http://localhost:8080 +``` + +--- + +## REST API Endpoints + +### Convert Measurements + +```http +GET /convert-measurements?input=dz_a_aazzzaaa +``` + +Example: + +```bash +curl "http://localhost:8080/convert-measurements?input=dz_a_aazzzaaa" +``` + +Example Response: + +```json +[28,53,1] +``` + +--- + +### Get All Measurement History + +```http +GET /measurement-history +``` + +Example: + +```bash +curl "http://localhost:8080/measurement-history" +``` + +--- + +### Get Measurement History By ID + +```http +GET /measurement-history/{id} +``` + +Example: + +```bash +curl "http://localhost:8080/measurement-history/1" +``` + +--- + +### Update Measurement History + +```http +PUT /measurement-history/{id} +``` + +Example: + +```bash +curl -X PUT "http://localhost:8080/measurement-history/1" \ +-H "Content-Type: application/json" \ +-d '{"input":"updated_input","output":"[10,20]"}' +``` -The API was tested using Postman. +--- -Example request: +### Delete Measurement History ```http -GET http://localhost:8080/convert-measurements?input=dz_a_aazzaaa +DELETE /measurement-history/{id} +``` + +Example: + +```bash +curl -X DELETE "http://localhost:8080/measurement-history/1" +``` + +Example verification: + +```bash +curl "http://localhost:8080/measurement-history" +``` + +--- + +## Logging + +Application logs are written both to the console and rolling log files. + +Log files are stored inside: + +```text +logs/application.log +``` + +Rolling log history is configured for one week retention using Logback rolling policies. + +Example configuration: + +```properties +logging.file.name=logs/application.log +logging.logback.rollingpolicy.max-file-size=10MB +logging.logback.rollingpolicy.max-history=7 +``` + +--- + +## Oracle Linux Deployment + +This project was packaged into a deployable Spring Boot JAR file and tested successfully on Oracle Linux. + +### Connect to Oracle Linux via SSH + +```bash +ssh username@server-ip +``` + +--- + +### Clone the Repository + +```bash +git clone +``` + +Navigate into the project: + +```bash +cd oraclequantapi ``` -Example response: +--- + +### Build the Project on Oracle Linux + +```bash +mvn clean package -DskipTests +``` + +--- + +### Run the Application on Oracle Linux + +```bash +java -jar target/oraclequantapi-0.0.1-SNAPSHOT.jar +``` + +--- + +### Verify the API + +```bash +curl "http://localhost:8080/convert-measurements?input=dz_a_aazzzaaa" +``` + +Expected response: ```json [28,53,1] -``` \ No newline at end of file +``` + +--- + +## Exception Handling + +The application uses centralized exception handling for invalid measurement inputs and unexpected server errors. + +Custom exceptions are located inside: + +```text +exception/ +``` + +--- + +## Version + +Current Version: + +```text +v1.0.0 +``` + +### Features Included + +* Measurement conversion endpoint +* Oracle database persistence +* Measurement history endpoints +* Logging support +* Oracle Linux deployment +* REST API architecture +* Centralized exception handling + +--- + +## Changelog + +### v1.0.0 + +* Initial project release +* Implemented encoded measurement conversion +* Added Oracle XE database persistence +* Added measurement history endpoints +* Added rolling logging support +* Added Oracle Linux deployment support +* Added centralized exception handling + +--- + +## Development Environment + +Developed using Java 17, Spring Boot, Oracle XE Database, and Oracle Linux deployment environment. \ No newline at end of file diff --git a/version.txt b/version.txt index e829161..1376219 100644 --- a/version.txt +++ b/version.txt @@ -81,4 +81,14 @@ v1.5.0 - Production deployment completed: * SSH/SCP deployment workflow * REST API validation via curl +----------------------------------------------- + +v2.0.0 - Final production-ready evaluation release + +* Full Oracle XE persistence support +* Complete measurement history CRUD functionality +* Oracle Linux deployment verified +* Logging and rolling file retention enabled +* README and deployment documentation finalized + ----------------------------------------------- \ No newline at end of file