From 72d7df4583ca2305f11f3792a622ff3f6d9cee13 Mon Sep 17 00:00:00 2001 From: safa Date: Sat, 23 May 2026 02:17:38 +0400 Subject: [PATCH 1/9] create a measurementpareser that has the logic --- .../service/MeasurementParser.java | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/main/java/com/oraclequantapi/oraclequantapi/service/MeasurementParser.java diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/service/MeasurementParser.java b/src/main/java/com/oraclequantapi/oraclequantapi/service/MeasurementParser.java new file mode 100644 index 0000000..c56c58c --- /dev/null +++ b/src/main/java/com/oraclequantapi/oraclequantapi/service/MeasurementParser.java @@ -0,0 +1,58 @@ +package com.oraclequantapi.oraclequantapi.service; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class MeasurementParser { + + public List parse(String input) { + List packageTotals = new ArrayList<>(); + int i = 0; + + while (i < input.length()) { + + // Step 1: read cycleCount + int cycleCount = 0; + while (i < input.length()) { + char c = input.charAt(i); + i++; + if (c == 'z') { + cycleCount += 26; + } else { + cycleCount += charValue(c); + break; + } + } + + // Step 2: read values and sum them + long packageTotal = 0; + for (int v = 0; v < cycleCount; v++) { + if (i >= input.length()) break; + + long value = 0; + while (i < input.length()) { + char c = input.charAt(i); + i++; + if (c == 'z') { + value += 26; + } else { + value += charValue(c); + break; + } + } + packageTotal += value; + } + + packageTotals.add(packageTotal); + } + + return packageTotals; + } + + private int charValue(char c) { + if (c == '_') return 0; + return c - 'a' + 1; // a=1, b=2, ..., z=26 + } +} \ No newline at end of file From 65d4ad6434695bb369b6916ddad931ea288d2b9c Mon Sep 17 00:00:00 2001 From: safa Date: Sat, 23 May 2026 02:30:09 +0400 Subject: [PATCH 2/9] create a measurementcontroller for get endpoint that accepts a query parameter --- .../controller/MeasurementController.java | 25 +++++++++++++++++++ 1 file changed, 25 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..13f327a --- /dev/null +++ b/src/main/java/com/oraclequantapi/oraclequantapi/controller/MeasurementController.java @@ -0,0 +1,25 @@ +package com.oraclequantapi.oraclequantapi.controller; +import jakarta.servlet.http.HttpServletRequest; +import com.oraclequantapi.oraclequantapi.MeasurementRecord; +import com.oraclequantapi.oraclequantapi.service.HistoryService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping(path = "/convert-measurements") +public class MeasurementController { + + @Autowired + public HistoryService historyService; + + @GetMapping + public ResponseEntity> convertMeasurements(@RequestParam("input") String input, + HttpServletRequest request) { + MeasurementRecord record = historyService.save(input, request.getRemoteAddr()); + return ResponseEntity.status(HttpStatus.OK).body(record.getOutput()); + } +} From 8842d4e736f9de77f132e9a001b6e5c75b55e0d8 Mon Sep 17 00:00:00 2001 From: safa Date: Sat, 23 May 2026 12:06:26 +0400 Subject: [PATCH 3/9] create historycontroller --- .../controller/HistoryController.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/main/java/com/oraclequantapi/oraclequantapi/controller/HistoryController.java diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/controller/HistoryController.java b/src/main/java/com/oraclequantapi/oraclequantapi/controller/HistoryController.java new file mode 100644 index 0000000..36e2f95 --- /dev/null +++ b/src/main/java/com/oraclequantapi/oraclequantapi/controller/HistoryController.java @@ -0,0 +1,44 @@ +package com.oraclequantapi.oraclequantapi.controller; +import com.oraclequantapi.oraclequantapi.model.MeasurementRecord; +import com.oraclequantapi.oraclequantapi.service.HistoryService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping(path = "/history") +public class HistoryController { + + @Autowired + public HistoryService historyService; + + @GetMapping + public ResponseEntity> getAll() { + return ResponseEntity.status(HttpStatus.OK).body(historyService.getAll()); + } + + @GetMapping(path = "/{id}") + public ResponseEntity getById(@PathVariable long id) { + return historyService.getById(id) + .map(record -> ResponseEntity.status(HttpStatus.OK).body(record)) + .orElse(ResponseEntity.status(HttpStatus.NOT_FOUND).build()); + } + + @PutMapping(path = "/{id}") + public ResponseEntity update(@PathVariable long id, + @RequestBody Map body) { + String newInput = body.get("input"); + return historyService.update(id, newInput) + .map(record -> ResponseEntity.status(HttpStatus.OK).body(record)) + .orElse(ResponseEntity.status(HttpStatus.NOT_FOUND).build()); + } + + @DeleteMapping + public ResponseEntity clearAll() { + historyService.clearAll(); + return ResponseEntity.status(HttpStatus.OK).body("History has been Deleted"); + } +} From b879431f5f53b2cc25312e06bace1e31436b8a98 Mon Sep 17 00:00:00 2001 From: safa Date: Sat, 23 May 2026 12:12:44 +0400 Subject: [PATCH 4/9] creste historyservice class --- .../service/HistoryService.java | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/main/java/com/oraclequantapi/oraclequantapi/service/HistoryService.java diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/service/HistoryService.java b/src/main/java/com/oraclequantapi/oraclequantapi/service/HistoryService.java new file mode 100644 index 0000000..324fcaf --- /dev/null +++ b/src/main/java/com/oraclequantapi/oraclequantapi/service/HistoryService.java @@ -0,0 +1,52 @@ +package com.oraclequantapi.oraclequantapi.service; +import com.oraclequantapi.oraclequantapi.MeasurementRecord; +import com.oraclequantapi.oraclequantapi.MeasurementRecordRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Optional; + +@Service +public class HistoryService { + + @Autowired + private MeasurementRecordRepository measurementRecordRepository; + + @Autowired + private MeasurementParser measurementParser; + + public MeasurementRecord save(String input, String sourceIp) { + List output = measurementParser.parse(input); + MeasurementRecord record = new MeasurementRecord( + 0, + LocalDateTime.now(), + sourceIp, + input, + output + ); + return measurementRecordRepository.save(record); + } + + public List getAll() { + return measurementRecordRepository.findAll(); + } + + public Optional getById(long id) { + return measurementRecordRepository.findById(id); + } + + public Optional update(long id, String newInput) { + Optional record = measurementRecordRepository.findById(id); + record.ifPresent(r -> { + r.setInput(newInput); + r.setOutput(measurementParser.parse(newInput)); + measurementRecordRepository.save(r); + }); + return record; + } + + public void clearAll() { + measurementRecordRepository.deleteAll(); + } +} \ No newline at end of file From 702366edb897d9aee8a88833f5c97383fbcafc16 Mon Sep 17 00:00:00 2001 From: safa Date: Sat, 23 May 2026 12:19:52 +0400 Subject: [PATCH 5/9] create measurementrecord class --- .../model/MeasurementRecord.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/main/java/com/oraclequantapi/oraclequantapi/model/MeasurementRecord.java diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/model/MeasurementRecord.java b/src/main/java/com/oraclequantapi/oraclequantapi/model/MeasurementRecord.java new file mode 100644 index 0000000..81b9f86 --- /dev/null +++ b/src/main/java/com/oraclequantapi/oraclequantapi/model/MeasurementRecord.java @@ -0,0 +1,46 @@ +package com.oraclequantapi.oraclequantapi.model; +import jakarta.persistence.*; + +import java.time.LocalDateTime; +import java.util.List; + +@Entity +@Table(name = "measurement_records") +public class MeasurementRecord { + + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE) + private long id; + + private LocalDateTime timestamp; + private String sourceIpAddress; + private String input; + + @ElementCollection + @CollectionTable(name = "measurement_output", joinColumns = @JoinColumn(name = "record_id")) + @OrderColumn(name = "output_index") + @Column(name = "output_value") + private List output; + + public MeasurementRecord() {} + + public MeasurementRecord(long id, LocalDateTime timestamp, String sourceIpAddress, String input, List output) { + this.id = id; + this.timestamp = timestamp; + this.sourceIpAddress = sourceIpAddress; + this.input = input; + this.output = output; + } + + public long getId() { return id; } + + public LocalDateTime getTimestamp() { return timestamp; } + + public String getSourceIpAddress() { return sourceIpAddress; } + + public String getInput() { return input; } + public void setInput(String input) { this.input = input; } + + public List getOutput() { return output; } + public void setOutput(List output) { this.output = output; } +} From 845a683b2997d13e29a82597f2d6309603fff663 Mon Sep 17 00:00:00 2001 From: safa Date: Sat, 23 May 2026 12:23:22 +0400 Subject: [PATCH 6/9] adding database dependency --- pom.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/pom.xml b/pom.xml index 20909d2..85385cd 100644 --- a/pom.xml +++ b/pom.xml @@ -40,6 +40,17 @@ spring-boot-starter-test test + + + com.oracle.database.jdbc + ojdbc11 + runtime + + + + org.springframework.boot + spring-boot-starter-data-jpa + From a5e57d0872e5d5bab637ffe18675c7a3c8320017 Mon Sep 17 00:00:00 2001 From: safa Date: Sat, 23 May 2026 12:28:40 +0400 Subject: [PATCH 7/9] adding oracle XE connection config in application properties --- .../oraclequantapi/service/MeasurementParser.java | 1 - src/main/resources/application.properties | 11 +++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/service/MeasurementParser.java b/src/main/java/com/oraclequantapi/oraclequantapi/service/MeasurementParser.java index c56c58c..ffb6ee6 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/service/MeasurementParser.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/service/MeasurementParser.java @@ -1,6 +1,5 @@ package com.oraclequantapi.oraclequantapi.service; import org.springframework.stereotype.Service; - import java.util.ArrayList; import java.util.List; diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 99d0060..8240577 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,12 @@ spring.application.name=oraclequantapi + +# Oracle XE datasource +spring.datasource.url=jdbc:oracle:thin:@localhost:1521/XEPDB1 +spring.datasource.username=system +spring.datasource.password=29999login +spring.datasource.driver-class-name=oracle.jdbc.OracleDriver + +# JPA / Hibernate +spring.jpa.database-platform=org.hibernate.dialect.OracleDialect +spring.jpa.hibernate.ddl-auto=update +spring.jpa.show-sql=true From b23b9cf5c2268f7cb8b5b1534176900ad97ea3df Mon Sep 17 00:00:00 2001 From: safa Date: Sat, 23 May 2026 12:50:50 +0400 Subject: [PATCH 8/9] create measurement record repository --- .../controller/MeasurementController.java | 2 +- .../repository/MeasurementRecordRepository.java | 10 ++++++++++ .../oraclequantapi/service/HistoryService.java | 4 ++-- 3 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/oraclequantapi/oraclequantapi/repository/MeasurementRecordRepository.java diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/controller/MeasurementController.java b/src/main/java/com/oraclequantapi/oraclequantapi/controller/MeasurementController.java index 13f327a..041766e 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/controller/MeasurementController.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/controller/MeasurementController.java @@ -1,6 +1,6 @@ package com.oraclequantapi.oraclequantapi.controller; import jakarta.servlet.http.HttpServletRequest; -import com.oraclequantapi.oraclequantapi.MeasurementRecord; +import com.oraclequantapi.oraclequantapi.model.MeasurementRecord; import com.oraclequantapi.oraclequantapi.service.HistoryService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; 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..e3445ff --- /dev/null +++ b/src/main/java/com/oraclequantapi/oraclequantapi/repository/MeasurementRecordRepository.java @@ -0,0 +1,10 @@ +package com.oraclequantapi.oraclequantapi.repository; + +import com.oraclequantapi.oraclequantapi.model.MeasurementRecord; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface MeasurementRecordRepository extends JpaRepository { +} + diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/service/HistoryService.java b/src/main/java/com/oraclequantapi/oraclequantapi/service/HistoryService.java index 324fcaf..c325826 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/service/HistoryService.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/service/HistoryService.java @@ -1,6 +1,6 @@ package com.oraclequantapi.oraclequantapi.service; -import com.oraclequantapi.oraclequantapi.MeasurementRecord; -import com.oraclequantapi.oraclequantapi.MeasurementRecordRepository; +import com.oraclequantapi.oraclequantapi.model.MeasurementRecord; +import com.oraclequantapi.oraclequantapi.repository.MeasurementRecordRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.time.LocalDateTime; From 82be2586fb2807935df6046e4b3c7f1743ee002f Mon Sep 17 00:00:00 2001 From: safa Date: Mon, 25 May 2026 21:22:33 +0400 Subject: [PATCH 9/9] add readme.md file --- README2.md | 105 ++++++++++++++++++ pom.xml | 2 +- .../controller/HistoryController.java | 9 +- .../controller/MeasurementController.java | 1 - .../model/MeasurementRecord.java | 1 - version.txt | 7 ++ 6 files changed, 118 insertions(+), 7 deletions(-) create mode 100644 README2.md create mode 100644 version.txt diff --git a/README2.md b/README2.md new file mode 100644 index 0000000..89606e1 --- /dev/null +++ b/README2.md @@ -0,0 +1,105 @@ +# oraclequantapi- Measurement Parser API + +A Spring Boot REST API that parses encoded measurement strings and stores the history in an Oracle XE database. + +--- + +## How to Run + +1. Start Oracle XE: + +run the docker start oracle-xe + + +2. Build the JAR: +----- +./mvnw clean package +----- +3. Run the app: +------ +java -jar target/oraclequantapi-0.0.1.jar +------ +4. Open the browser and test: +------ +http://localhost:8080/convert-measurements?input=abbcc +------ + +...................... + +## How to Deploy to Oracle Linux VM + +1. Copy the JAR to the VM: +------- +scp target/oraclequantapi-0.0.1 safa@:~/ +------- + +2. SSH into the VM: +------- +ssh safa@ +------- + +3. Run the app: +------- +java -jar ~/tryout-0.0.1-SNAPSHOT.jar +------- + +4. Test from your browser: +------- +http://:8080/convert-measurements?input=abbcc +------- + +....................... + +## How to Configure the Database + +Open `src/main/resources/application.properties` and update these values: + +```properties +spring.datasource.url=jdbc:oracle:thin:@:1521/XEPDB1 +spring.datasource.username=system +spring.datasource.password= +``` + +- Replace `` with `localhost` if running locally, or your Mac IP if running from the VM +- Replace `` with the password you set when creating the Oracle XE container + +......................... + +## API Endpoints + +| GET | `/convert-measurements?input=` | Parse input and return result | +| GET | `/history` | Get all history records | +| GET | `/history/{id}` | Get one record by ID | +| PUT | `/history/{id}` | Update a record by ID | +| DELETE | `/history` | Clear all history records| + +### Examples + +**Convert:** +``` +GET http://localhost:8080/convert-measurements?input=abbcc +Response: [2, 6] +``` + +**Get all history:** +``` +GET http://localhost:8080/history +``` + +**Get one record:** +``` +GET http://localhost:8080/history/1 +``` + +**Update a record:** +``` +PUT http://localhost:8080/history/1 +Body: { "input": "abbcc" } +``` + +**Clear history:** +``` +DELETE http://localhost:8080/history +Response: History has been Deleted +``` + diff --git a/pom.xml b/pom.xml index 85385cd..070b260 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.oraclequantapi oraclequantapi - 0.0.1-SNAPSHOT + 0.0.1 diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/controller/HistoryController.java b/src/main/java/com/oraclequantapi/oraclequantapi/controller/HistoryController.java index 36e2f95..4e9e255 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/controller/HistoryController.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/controller/HistoryController.java @@ -9,24 +9,25 @@ import java.util.Map; @RestController +// All endpoints in this class start with "/history" @RequestMapping(path = "/history") public class HistoryController { @Autowired public HistoryService historyService; - +//Returns all history records from the database as a JSON array @GetMapping public ResponseEntity> getAll() { return ResponseEntity.status(HttpStatus.OK).body(historyService.getAll()); } - +//Returns a specific record by its ID @GetMapping(path = "/{id}") public ResponseEntity getById(@PathVariable long id) { return historyService.getById(id) .map(record -> ResponseEntity.status(HttpStatus.OK).body(record)) .orElse(ResponseEntity.status(HttpStatus.NOT_FOUND).build()); } - +//update input by specific ID @PutMapping(path = "/{id}") public ResponseEntity update(@PathVariable long id, @RequestBody Map body) { @@ -35,7 +36,7 @@ public ResponseEntity update(@PathVariable long id, .map(record -> ResponseEntity.status(HttpStatus.OK).body(record)) .orElse(ResponseEntity.status(HttpStatus.NOT_FOUND).build()); } - +//Delete all the records @DeleteMapping public ResponseEntity clearAll() { historyService.clearAll(); diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/controller/MeasurementController.java b/src/main/java/com/oraclequantapi/oraclequantapi/controller/MeasurementController.java index 041766e..0ca9bae 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/controller/MeasurementController.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/controller/MeasurementController.java @@ -6,7 +6,6 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; - import java.util.List; @RestController diff --git a/src/main/java/com/oraclequantapi/oraclequantapi/model/MeasurementRecord.java b/src/main/java/com/oraclequantapi/oraclequantapi/model/MeasurementRecord.java index 81b9f86..686af6b 100644 --- a/src/main/java/com/oraclequantapi/oraclequantapi/model/MeasurementRecord.java +++ b/src/main/java/com/oraclequantapi/oraclequantapi/model/MeasurementRecord.java @@ -1,6 +1,5 @@ package com.oraclequantapi.oraclequantapi.model; import jakarta.persistence.*; - import java.time.LocalDateTime; import java.util.List; diff --git a/version.txt b/version.txt new file mode 100644 index 0000000..33dddd7 --- /dev/null +++ b/version.txt @@ -0,0 +1,7 @@ +v0.0.1 - 2026-05-24 +- Added GET /convert-measurements endpoint to parse measurement input string +- Added history tracking with Oracle XE database +- Added GET /history to retrieve all history records +- Added GET /history/{id} to retrieve a specific history record +- Added PUT /history/{id} to update a history record +- Added DELETE /history to clear all history records \ No newline at end of file