From 7b97c014a99c0458b1e1e2cbda7c54bdb343ff54 Mon Sep 17 00:00:00 2001 From: playerg9 Date: Sun, 8 Sep 2024 13:53:02 +0200 Subject: [PATCH 1/3] code reformat --- build.gradle | 8 +++----- .../dynapi/core/database/AbstractDatabase.java | 5 ++++- .../core/database/impl/SimpleTableInformation.java | 5 ++++- .../postgresql/PostgreSQLMetaQueryGenerator.java | 8 ++++---- .../dynapi/core/database/interfaces/Database.java | 14 ++++++++------ .../database/interfaces/MetaQueryGenerator.java | 4 +++- .../org/dynapi/dynapi/core/query/QueryConfig.java | 2 +- src/main/java/org/dynapi/dynapi/web/Home.java | 1 - .../dynapi/dynapi/web/api/get/GetController.java | 4 +++- 9 files changed, 30 insertions(+), 21 deletions(-) diff --git a/build.gradle b/build.gradle index fa7807e..a66704f 100644 --- a/build.gradle +++ b/build.gradle @@ -36,7 +36,7 @@ repositories { dependencies { // dynapi - implementation 'org.dynapi:squirtle:0.5.9' + implementation 'org.dynapi:squirtle:0.5.10' implementation 'org.dynapi:openapispec:0.7.1' implementation 'org.dynapi:json-schema-gen:0.9.0' implementation 'org.dynapi:common:0.3.2' @@ -46,7 +46,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-jdbc' developmentOnly 'org.springframework.boot:spring-boot-devtools' testImplementation 'org.springframework.boot:spring-boot-starter-test' - // lambok + // lombok compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testCompileOnly 'org.projectlombok:lombok' @@ -54,9 +54,7 @@ dependencies { // json/yaml implementation 'org.json:json:20240303' implementation 'org.yaml:snakeyaml' - // databases - runtimeOnly 'com.mysql:mysql-connector-j' - runtimeOnly 'com.oracle.database.jdbc:ojdbc11' + // databases // todo: remove and add via plugin-system runtimeOnly 'org.postgresql:postgresql' runtimeOnly 'org.xerial:sqlite-jdbc' // testing diff --git a/src/main/java/org/dynapi/dynapi/core/database/AbstractDatabase.java b/src/main/java/org/dynapi/dynapi/core/database/AbstractDatabase.java index f70fc55..a0f074f 100644 --- a/src/main/java/org/dynapi/dynapi/core/database/AbstractDatabase.java +++ b/src/main/java/org/dynapi/dynapi/core/database/AbstractDatabase.java @@ -12,7 +12,10 @@ import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.web.server.ResponseStatusException; -import java.util.*; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; /** * basic implementation of {@link Database} which speeds up development diff --git a/src/main/java/org/dynapi/dynapi/core/database/impl/SimpleTableInformation.java b/src/main/java/org/dynapi/dynapi/core/database/impl/SimpleTableInformation.java index b2c948f..3e1ad4c 100644 --- a/src/main/java/org/dynapi/dynapi/core/database/impl/SimpleTableInformation.java +++ b/src/main/java/org/dynapi/dynapi/core/database/impl/SimpleTableInformation.java @@ -1,6 +1,9 @@ package org.dynapi.dynapi.core.database.impl; -import lombok.*; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.ToString; import org.dynapi.dynapi.core.database.interfaces.TableInformation; /** diff --git a/src/main/java/org/dynapi/dynapi/core/database/impl/postgresql/PostgreSQLMetaQueryGenerator.java b/src/main/java/org/dynapi/dynapi/core/database/impl/postgresql/PostgreSQLMetaQueryGenerator.java index 5b12710..04f285b 100644 --- a/src/main/java/org/dynapi/dynapi/core/database/impl/postgresql/PostgreSQLMetaQueryGenerator.java +++ b/src/main/java/org/dynapi/dynapi/core/database/impl/postgresql/PostgreSQLMetaQueryGenerator.java @@ -12,10 +12,10 @@ public String listSchemas() { Table pgNamespace = new Schema("pg_catalog").table("pg_namespace"); Field schemaName = pgNamespace.field("nspname").as("schema_name"); return new PostgreSQLQuery() - .from(pgNamespace) - .select(schemaName) - .where(schemaName.not_like("pg_%")) - .getSql(); + .from(pgNamespace) + .select(schemaName) + .where(schemaName.not_like("pg_%")) + .getSql(); } @Override diff --git a/src/main/java/org/dynapi/dynapi/core/database/interfaces/Database.java b/src/main/java/org/dynapi/dynapi/core/database/interfaces/Database.java index 2c42eb7..23b137b 100644 --- a/src/main/java/org/dynapi/dynapi/core/database/interfaces/Database.java +++ b/src/main/java/org/dynapi/dynapi/core/database/interfaces/Database.java @@ -13,6 +13,7 @@ public interface Database { /** * note: it's recommended to use the getter instead + * * @return a dialect appropriate {@link MetaQueryGenerator} used to fetch table-information * @see #getSchemaNames() * @see #getTableNamesOfSchema(String) @@ -47,7 +48,7 @@ public interface Database { /** * @param schemaName schema of the table - * @param tableName table + * @param tableName table * @return column-information of the table */ List getColumnInformationOfTable(@NonNull String schemaName, @NonNull String tableName); @@ -62,14 +63,14 @@ public interface Database { /** * @param schemaName name of the schema of the table - * @param tableName name of the table + * @param tableName name of the table * @return that the table exists */ boolean existsTable(@NonNull String schemaName, @NonNull String tableName); /** - * @param schemaName name of the schema of the table - * @param tableName name of the table + * @param schemaName name of the schema of the table + * @param tableName name of the table * @param columnNames columns to verify * @return that all specified columns exist on the table */ @@ -78,8 +79,9 @@ public interface Database { /** * Utility-function used to validate that a table has all {@code columns}
* If {@code columns} contains {@code *} then it's directly marked as valid - * @param schemaName schema-name - * @param tableName table-name + * + * @param schemaName schema-name + * @param tableName table-name * @param columnNames columns to check again * @throws org.springframework.web.server.ResponseStatusException if one or more columns are not existing */ diff --git a/src/main/java/org/dynapi/dynapi/core/database/interfaces/MetaQueryGenerator.java b/src/main/java/org/dynapi/dynapi/core/database/interfaces/MetaQueryGenerator.java index e97916b..e44a498 100644 --- a/src/main/java/org/dynapi/dynapi/core/database/interfaces/MetaQueryGenerator.java +++ b/src/main/java/org/dynapi/dynapi/core/database/interfaces/MetaQueryGenerator.java @@ -16,6 +16,7 @@ public interface MetaQueryGenerator { /** * returns an SQL-Query that returns the available tables of a specific schema
* format: {@code {'schema_name', 'table_name'}} + * * @param schemaName database schema */ String listTablesOfSchema(String schemaName); @@ -23,8 +24,9 @@ public interface MetaQueryGenerator { /** * returns an SQL-Query that returns the column-information of a specific table of a specific schema
* format: {@code {'column_name', 'type'}} + * * @param schemaName database schema - * @param tableName table of {@code schemaName} + * @param tableName table of {@code schemaName} */ String listColumnsOfTable(String schemaName, String tableName); } diff --git a/src/main/java/org/dynapi/dynapi/core/query/QueryConfig.java b/src/main/java/org/dynapi/dynapi/core/query/QueryConfig.java index dcf6abb..6e12889 100644 --- a/src/main/java/org/dynapi/dynapi/core/query/QueryConfig.java +++ b/src/main/java/org/dynapi/dynapi/core/query/QueryConfig.java @@ -22,5 +22,5 @@ public class QueryConfig { */ private OrderBy[] orderBy = null; - public record OrderBy(String column, Order order) {}; + public record OrderBy(String column, Order order) {} } diff --git a/src/main/java/org/dynapi/dynapi/web/Home.java b/src/main/java/org/dynapi/dynapi/web/Home.java index 44f8205..fa4a993 100644 --- a/src/main/java/org/dynapi/dynapi/web/Home.java +++ b/src/main/java/org/dynapi/dynapi/web/Home.java @@ -4,7 +4,6 @@ import lombok.extern.slf4j.Slf4j; import org.dynapi.dynapi.core.config.DynAPIConfiguration; import org.dynapi.dynapi.core.openapi.OpenApiManager; -import org.json.JSONObject; import org.springframework.core.io.InputStreamResource; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; diff --git a/src/main/java/org/dynapi/dynapi/web/api/get/GetController.java b/src/main/java/org/dynapi/dynapi/web/api/get/GetController.java index 21d2f06..96e75a7 100644 --- a/src/main/java/org/dynapi/dynapi/web/api/get/GetController.java +++ b/src/main/java/org/dynapi/dynapi/web/api/get/GetController.java @@ -7,7 +7,9 @@ import org.dynapi.dynapi.core.query.QueryConfig; import org.dynapi.dynapi.core.query.QueryConfigParser; import org.dynapi.squirtle.core.PseudoColumns; -import org.dynapi.squirtle.core.queries.*; +import org.dynapi.squirtle.core.queries.QueryBuilder; +import org.dynapi.squirtle.core.queries.Schema; +import org.dynapi.squirtle.core.queries.Table; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; From a1be6db4e67e4e86061f001cc2f510639e067614 Mon Sep 17 00:00:00 2001 From: playerg9 Date: Tue, 10 Sep 2024 10:56:13 +0200 Subject: [PATCH 2/3] added todo --- .../core/database/impl/sqlite/SQLiteMetaQueryGenerator.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/dynapi/dynapi/core/database/impl/sqlite/SQLiteMetaQueryGenerator.java b/src/main/java/org/dynapi/dynapi/core/database/impl/sqlite/SQLiteMetaQueryGenerator.java index 37c9654..42e3982 100644 --- a/src/main/java/org/dynapi/dynapi/core/database/impl/sqlite/SQLiteMetaQueryGenerator.java +++ b/src/main/java/org/dynapi/dynapi/core/database/impl/sqlite/SQLiteMetaQueryGenerator.java @@ -51,6 +51,7 @@ public String listTablesOfSchema(String schemaName) { @Override public String listColumnsOfTable(String schemaName, String tableName) { + // todo: $schema.pragme_table_info($tableName) Selectable tableInfo = new TableValuedFunction("pragma_table_info", tableName); return new SQLiteQuery() .from(tableInfo) From 3db3416ca3b577bcfea288fd04f10ba22d4eadaa Mon Sep 17 00:00:00 2001 From: playerg9 Date: Wed, 18 Sep 2024 14:51:43 +0200 Subject: [PATCH 3/3] added datatype abstractions --- .../dynapi/core/datatypes/DataType.java | 23 ++++++++ .../core/datatypes/impl/DataTypeArray.java | 52 +++++++++++++++++++ .../core/datatypes/impl/DataTypeBlob.java | 41 +++++++++++++++ .../core/datatypes/impl/DataTypeBoolean.java | 37 +++++++++++++ .../core/datatypes/impl/DataTypeDate.java | 46 ++++++++++++++++ .../core/datatypes/impl/DataTypeDateTime.java | 46 ++++++++++++++++ .../core/datatypes/impl/DataTypeDecimal.java | 39 ++++++++++++++ .../core/datatypes/impl/DataTypeInteger.java | 39 ++++++++++++++ .../core/datatypes/impl/DataTypeJson.java | 36 +++++++++++++ .../core/datatypes/impl/DataTypeString.java | 37 +++++++++++++ .../core/datatypes/impl/DataTypeUUID.java | 41 +++++++++++++++ 11 files changed, 437 insertions(+) create mode 100644 src/main/java/org/dynapi/dynapi/core/datatypes/DataType.java create mode 100644 src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeArray.java create mode 100644 src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeBlob.java create mode 100644 src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeBoolean.java create mode 100644 src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeDate.java create mode 100644 src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeDateTime.java create mode 100644 src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeDecimal.java create mode 100644 src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeInteger.java create mode 100644 src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeJson.java create mode 100644 src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeString.java create mode 100644 src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeUUID.java diff --git a/src/main/java/org/dynapi/dynapi/core/datatypes/DataType.java b/src/main/java/org/dynapi/dynapi/core/datatypes/DataType.java new file mode 100644 index 0000000..4da88af --- /dev/null +++ b/src/main/java/org/dynapi/dynapi/core/datatypes/DataType.java @@ -0,0 +1,23 @@ +package org.dynapi.dynapi.core.datatypes; + +import com.fasterxml.jackson.databind.JsonNode; +import org.dynapi.openapispec.core.schema.Schema; + +public interface DataType { + /** + * @return schema for /openapi + */ + Schema getOpenApiSchema(); + + /** + * @param node node to parse + * @return parsed value + */ + Object parseJsonNode(JsonNode node); + + /** + * @param object saved or so object + * @return json-save object + */ + Object formatObject(Object object); +} diff --git a/src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeArray.java b/src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeArray.java new file mode 100644 index 0000000..5778913 --- /dev/null +++ b/src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeArray.java @@ -0,0 +1,52 @@ +package org.dynapi.dynapi.core.datatypes.impl; + +import com.fasterxml.jackson.databind.JsonNode; +import org.dynapi.dynapi.core.datatypes.DataType; +import org.dynapi.openapispec.core.schema.Schema; +import org.dynapi.openapispec.core.schema.TArray; + +public class DataTypeArray implements DataType { + private final DataType subType; + + public DataTypeArray(DataType subType) { + this.subType = subType; + } + + /** + * @return schema for /openapi + */ + @Override + public Schema getOpenApiSchema() { + return new TArray(subType.getOpenApiSchema()); + } + + /** + * @param node node to parse + * @return parsed value + */ + @Override + public Object[] parseJsonNode(JsonNode node) { + assert node.isArray(); + Object[] array = new Object[node.size()]; + for (int i = 0; i < node.size(); i++) { + JsonNode element = node.get(i); + array[i] = subType.parseJsonNode(element); + } + return array; + } + + /** + * @param object saved or so object + * @return json-save object + */ + @Override + public Object formatObject(Object object) { + if (object instanceof Object[] a) { + Object[] array = new Object[a.length]; + for (int i = 0; i < a.length; i++) + array[i] = subType.formatObject(a[i]); + return array; + } + throw new IllegalArgumentException("Object is not an array"); + } +} diff --git a/src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeBlob.java b/src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeBlob.java new file mode 100644 index 0000000..63fa133 --- /dev/null +++ b/src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeBlob.java @@ -0,0 +1,41 @@ +package org.dynapi.dynapi.core.datatypes.impl; + +import com.fasterxml.jackson.databind.JsonNode; +import org.dynapi.dynapi.core.datatypes.DataType; +import org.dynapi.openapispec.core.schema.Schema; +import org.dynapi.openapispec.core.schema.TString; + +import java.util.Base64; + +public class DataTypeBlob implements DataType { + /** + * @return schema for /openapi + */ + @Override + public Schema getOpenApiSchema() { + return new TString() + .format(TString.CommonFormats.BINARY); + } + + /** + * @param node node to parse + * @return parsed value + */ + @Override + public byte[] parseJsonNode(JsonNode node) { + assert node.isTextual(); + String base64String = node.textValue(); + return Base64.getDecoder().decode(base64String); + } + + /** + * @param object saved or so object + * @return json-save object + */ + @Override + public Object formatObject(Object object) { + if (object instanceof byte[] b) + return Base64.getEncoder().encodeToString(b); + throw new IllegalArgumentException("Object is not a blob"); + } +} diff --git a/src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeBoolean.java b/src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeBoolean.java new file mode 100644 index 0000000..4615683 --- /dev/null +++ b/src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeBoolean.java @@ -0,0 +1,37 @@ +package org.dynapi.dynapi.core.datatypes.impl; + +import com.fasterxml.jackson.databind.JsonNode; +import org.dynapi.dynapi.core.datatypes.DataType; +import org.dynapi.openapispec.core.schema.Schema; +import org.dynapi.openapispec.core.schema.TBoolean; + +public class DataTypeBoolean implements DataType { + /** + * @return schema for /openapi + */ + @Override + public Schema getOpenApiSchema() { + return new TBoolean(); + } + + /** + * @param node node to parse + * @return parsed value + */ + @Override + public Object parseJsonNode(JsonNode node) { + assert node.isBoolean(); + return node.booleanValue(); + } + + /** + * @param object saved or so object + * @return json-save object + */ + @Override + public Object formatObject(Object object) { + if (object instanceof Boolean b) + return b; + throw new IllegalArgumentException("Object is not a boolean"); + } +} diff --git a/src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeDate.java b/src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeDate.java new file mode 100644 index 0000000..90e4a0a --- /dev/null +++ b/src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeDate.java @@ -0,0 +1,46 @@ +package org.dynapi.dynapi.core.datatypes.impl; + +import com.fasterxml.jackson.databind.JsonNode; +import org.dynapi.dynapi.core.datatypes.DataType; +import org.dynapi.openapispec.core.schema.Schema; +import org.dynapi.openapispec.core.schema.TString; + +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.TemporalAccessor; + +public class DataTypeDate implements DataType { + private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ISO_LOCAL_DATE; + + /** + * @return schema for /openapi + */ + @Override + public Schema getOpenApiSchema() { + return new TString() + .format(TString.CommonFormats.DATE); + } + + /** + * @param node node to parse + * @return parsed value + */ + @Override + public LocalDate parseJsonNode(JsonNode node) { + assert node.isTextual(); + return LocalDate.parse(node.textValue(), DATE_FORMATTER); + } + + /** + * @param object saved or so object + * @return json-save object + */ + @Override + public String formatObject(Object object) { + if (object instanceof LocalDateTime || object instanceof LocalDate || object instanceof Instant) + return DATE_FORMATTER.format((TemporalAccessor) object); + throw new IllegalArgumentException("Object is not a date"); + } +} diff --git a/src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeDateTime.java b/src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeDateTime.java new file mode 100644 index 0000000..9d05dde --- /dev/null +++ b/src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeDateTime.java @@ -0,0 +1,46 @@ +package org.dynapi.dynapi.core.datatypes.impl; + +import com.fasterxml.jackson.databind.JsonNode; +import org.dynapi.dynapi.core.datatypes.DataType; +import org.dynapi.openapispec.core.schema.Schema; +import org.dynapi.openapispec.core.schema.TString; + +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.TemporalAccessor; + +public class DataTypeDateTime implements DataType { + private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ISO_LOCAL_DATE_TIME; + + /** + * @return schema for /openapi + */ + @Override + public Schema getOpenApiSchema() { + return new TString() + .format(TString.CommonFormats.DATETIME); + } + + /** + * @param node node to parse + * @return parsed value + */ + @Override + public LocalDateTime parseJsonNode(JsonNode node) { + assert node.isTextual(); + return LocalDateTime.parse(node.textValue(), DATE_FORMATTER); + } + + /** + * @param object saved or so object + * @return json-save object + */ + @Override + public String formatObject(Object object) { + if (object instanceof LocalDateTime || object instanceof LocalDate || object instanceof Instant) + return DATE_FORMATTER.format((TemporalAccessor) object); + throw new IllegalArgumentException("Object is not a date"); + } +} diff --git a/src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeDecimal.java b/src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeDecimal.java new file mode 100644 index 0000000..ebad9f6 --- /dev/null +++ b/src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeDecimal.java @@ -0,0 +1,39 @@ +package org.dynapi.dynapi.core.datatypes.impl; + +import com.fasterxml.jackson.databind.JsonNode; +import org.dynapi.dynapi.core.datatypes.DataType; +import org.dynapi.openapispec.core.schema.Schema; +import org.dynapi.openapispec.core.schema.TNumber; + +public class DataTypeDecimal implements DataType { + /** + * @return schema for /openapi + */ + @Override + public Schema getOpenApiSchema() { + return new TNumber(); + } + + /** + * @param node node to parse + * @return parsed value + */ + @Override + public Number parseJsonNode(JsonNode node) { + assert node.isFloatingPointNumber(); + return node.isDouble() ? node.doubleValue() : node.floatValue(); + } + + /** + * @param object saved or so object + * @return json-save object + */ + @Override + public Object formatObject(Object object) { + if (object instanceof Double d) + return d; + if (object instanceof Float f) + return f; + throw new IllegalArgumentException("Object is not a decimal"); + } +} diff --git a/src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeInteger.java b/src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeInteger.java new file mode 100644 index 0000000..59c897b --- /dev/null +++ b/src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeInteger.java @@ -0,0 +1,39 @@ +package org.dynapi.dynapi.core.datatypes.impl; + +import com.fasterxml.jackson.databind.JsonNode; +import org.dynapi.dynapi.core.datatypes.DataType; +import org.dynapi.openapispec.core.schema.Schema; +import org.dynapi.openapispec.core.schema.TInteger; + +public class DataTypeInteger implements DataType { + /** + * @return schema for /openapi + */ + @Override + public Schema getOpenApiSchema() { + return new TInteger(); + } + + /** + * @param node node to parse + * @return parsed value + */ + @Override + public Number parseJsonNode(JsonNode node) { + assert node.isIntegralNumber(); + return node.isLong() ? node.longValue() : node.intValue(); + } + + /** + * @param object saved or so object + * @return json-save object + */ + @Override + public Object formatObject(Object object) { + if (object instanceof Long l) + return l; + if (object instanceof Integer i) + return i; + throw new IllegalArgumentException("Object is not an integer"); + } +} diff --git a/src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeJson.java b/src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeJson.java new file mode 100644 index 0000000..38966b7 --- /dev/null +++ b/src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeJson.java @@ -0,0 +1,36 @@ +package org.dynapi.dynapi.core.datatypes.impl; + +import com.fasterxml.jackson.databind.JsonNode; +import org.dynapi.dynapi.core.datatypes.DataType; +import org.dynapi.openapispec.core.schema.Schema; +import org.dynapi.openapispec.core.schema.TObject; + +public class DataTypeJson implements DataType { + /** + * @return schema for /openapi + */ + @Override + public Schema getOpenApiSchema() { + return new TObject(); + } + + /** + * @param node node to parse + * @return parsed value + */ + @Override + public JsonNode parseJsonNode(JsonNode node) { + return node; + } + + /** + * @param object saved or so object + * @return json-save object + */ + @Override + public JsonNode formatObject(Object object) { + if (object instanceof JsonNode j) + return j; + throw new IllegalArgumentException("Object is not a JSON object"); + } +} diff --git a/src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeString.java b/src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeString.java new file mode 100644 index 0000000..1bbd6bb --- /dev/null +++ b/src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeString.java @@ -0,0 +1,37 @@ +package org.dynapi.dynapi.core.datatypes.impl; + +import com.fasterxml.jackson.databind.JsonNode; +import org.dynapi.dynapi.core.datatypes.DataType; +import org.dynapi.openapispec.core.schema.Schema; +import org.dynapi.openapispec.core.schema.TString; + +public class DataTypeString implements DataType { + /** + * @return schema for /openapi + */ + @Override + public Schema getOpenApiSchema() { + return new TString(); + } + + /** + * @param node node to parse + * @return parsed value + */ + @Override + public String parseJsonNode(JsonNode node) { + assert node.isTextual(); + return node.textValue(); + } + + /** + * @param object saved or so object + * @return json-save object + */ + @Override + public String formatObject(Object object) { + if (object instanceof String s) + return s; + throw new IllegalArgumentException("Object is not a string"); + } +} diff --git a/src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeUUID.java b/src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeUUID.java new file mode 100644 index 0000000..ccee057 --- /dev/null +++ b/src/main/java/org/dynapi/dynapi/core/datatypes/impl/DataTypeUUID.java @@ -0,0 +1,41 @@ +package org.dynapi.dynapi.core.datatypes.impl; + +import com.fasterxml.jackson.databind.JsonNode; +import org.dynapi.dynapi.core.datatypes.DataType; +import org.dynapi.openapispec.core.schema.Schema; +import org.dynapi.openapispec.core.schema.TString; + +import java.util.UUID; + +public class DataTypeUUID implements DataType { + /** + * @return schema for /openapi + */ + @Override + public Schema getOpenApiSchema() { + return new TString() + .format(TString.CommonFormats.UUID); + } + + /** + * @param node node to parse + * @return parsed value + */ + @Override + public Object parseJsonNode(JsonNode node) { + assert node.isTextual(); + String uuidString = node.asText(); + return UUID.fromString(uuidString); + } + + /** + * @param object saved or so object + * @return json-save object + */ + @Override + public String formatObject(Object object) { + if (object instanceof UUID u) + return u.toString(); + throw new IllegalArgumentException("Object is not a UUID"); + } +}