From c32070ae3dd22912b50a137aaaf529126e7cf9f1 Mon Sep 17 00:00:00 2001 From: Shugo USHIO Date: Wed, 14 May 2025 09:51:21 +0900 Subject: [PATCH 1/2] Update config --- .gitignore | 9 ++++++++- .vscode/extensions.json | 7 +++++++ .vscode/settings.json | 14 ++++++++++++++ README.md | 16 ++++++++-------- default.code-workspace | 10 +++++++++- 5 files changed, 46 insertions(+), 10 deletions(-) create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json diff --git a/.gitignore b/.gitignore index af84dbb..3cb30bb 100644 --- a/.gitignore +++ b/.gitignore @@ -16,7 +16,14 @@ buildNumber.properties # JDT-specific (Eclipse Java Development Tools) .classpath +## VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json *.code-workspace !default.code-workspace -.vscode \ No newline at end of file +# Local History for Visual Studio Code +.history/ \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..e6d86b6 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "streetsidesoftware.code-spell-checker", + "davidanson.vscode-markdownlint", + "vscjava.vscode-java-pack" + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..7da4f96 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,14 @@ +{ + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.organizeImports": "explicit" + }, + "java.format.comments.enabled": false, + "java.inlayHints.parameterNames.enabled": "none", + "files.encoding": "utf8", + "java.home": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home", + "java.jdt.ls.vmargs": "-Dfile.encoding=UTF-8", + "javac-linter.javac": "javac -Dfile.encoding=UTF-8", + "java.configuration.updateBuildConfiguration": "interactive", + "cSpell.words": ["makeour", "ngsi", "Ngsiv"] +} diff --git a/README.md b/README.md index 586c7c0..8ab8675 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,18 @@ # MoC Java + MoC client for Java [![Java CI with Maven](https://github.com/makeOurCity/moc-java/actions/workflows/test.yml/badge.svg)](https://github.com/makeOurCity/moc-java/actions/workflows/test.yml) - -# Usage +## Usage See [city.makeour.moc.examples](./src/main/java/city/makeour/moc/examples/) -# Development +## Development -## Testing +### Testing -Set `.vscode/settings` env +Set `xxxx.code-workspace` env and use it. ```json { @@ -28,6 +28,6 @@ Set `.vscode/settings` env ``` ```console -$ mvn clean install -$ mvn test -``` \ No newline at end of file +mvn clean install +mvn test +``` diff --git a/default.code-workspace b/default.code-workspace index 1ab45e1..c9da917 100644 --- a/default.code-workspace +++ b/default.code-workspace @@ -9,6 +9,14 @@ "files.encoding": "utf8", "java.home": "/Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home", "java.jdt.ls.vmargs": "-Dfile.encoding=UTF-8", - "javac-linter.javac": "javac -Dfile.encoding=UTF-8" + "java.configuration.updateBuildConfiguration": "interactive", + "java.test.config": { + "env": { + "TEST_COGNITO_USER_POOL_ID": "", + "TEST_COGNITO_CLIENT_ID": "", + "TEST_COGNITO_USERNAME": "", + "TEST_COGNITO_PASSWORD": "" + } + } } } From 794146e43c1bfca69a784365536bb38364eec1e5 Mon Sep 17 00:00:00 2001 From: Shugo USHIO Date: Wed, 14 May 2025 15:56:27 +0900 Subject: [PATCH 2/2] Add create entity --- .vscode/settings.json | 2 +- src/main/java/city/makeour/moc/MocClient.java | 24 ++++-- .../java/city/makeour/moc/examples/Auth.java | 2 +- .../city/makeour/moc/ngsiv2/Ngsiv2Client.java | 74 +++++++++++++++++++ .../java/city/makeour/moc/MocClientTest.java | 6 +- 5 files changed, 95 insertions(+), 13 deletions(-) create mode 100644 src/main/java/city/makeour/moc/ngsiv2/Ngsiv2Client.java diff --git a/.vscode/settings.json b/.vscode/settings.json index 7da4f96..f5854e9 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -10,5 +10,5 @@ "java.jdt.ls.vmargs": "-Dfile.encoding=UTF-8", "javac-linter.javac": "javac -Dfile.encoding=UTF-8", "java.configuration.updateBuildConfiguration": "interactive", - "cSpell.words": ["makeour", "ngsi", "Ngsiv"] + "cSpell.words": ["fiware", "makeour", "ngsi", "Ngsiv"] } diff --git a/src/main/java/city/makeour/moc/MocClient.java b/src/main/java/city/makeour/moc/MocClient.java index a7a7fda..23eb290 100644 --- a/src/main/java/city/makeour/moc/MocClient.java +++ b/src/main/java/city/makeour/moc/MocClient.java @@ -3,13 +3,12 @@ import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; +import city.makeour.moc.ngsiv2.Ngsiv2Client; import city.makeour.ngsi.v2.api.EntitiesApi; import city.makeour.ngsi.v2.invoker.ApiClient; public class MocClient { - protected ApiClient apiClient; - - protected EntitiesApi entitiesApi; + protected Ngsiv2Client client; protected TokenFetcherInterface tokenFetcher; @@ -20,15 +19,16 @@ public MocClient() { } public MocClient(String basePath) { - this.apiClient = new ApiClient(); - this.apiClient.setBasePath(basePath); + ApiClient apiClient = new ApiClient(); + apiClient.setBasePath(basePath); + + this.client = new Ngsiv2Client(apiClient); - this.entitiesApi = new EntitiesApi(this.apiClient); this.refreshTokenStorage = new RefreshTokenStorage(); } public EntitiesApi entities() { - return this.entitiesApi; + return this.client.getEntitiesApi(); } public void setMocAuthInfo(String cognitoUserPoolId, String cognitoClientId) { @@ -80,6 +80,14 @@ public void refreshToken() throws InvalidKeyException, NoSuchAlgorithmException } public void setToken(String token) { - this.apiClient.addDefaultHeader("Authorization", token); + this.client.getApiClient().addDefaultHeader("Authorization", token); + } + + public void setFiwareService(String fiwareService) { + this.client.getApiClient().addDefaultHeader("Fiware-Service", fiwareService); + } + + public void createEntity(String contentType, Object body) { + this.client.createEntity(contentType, body); } } diff --git a/src/main/java/city/makeour/moc/examples/Auth.java b/src/main/java/city/makeour/moc/examples/Auth.java index 4a93c26..e78e6e1 100644 --- a/src/main/java/city/makeour/moc/examples/Auth.java +++ b/src/main/java/city/makeour/moc/examples/Auth.java @@ -29,7 +29,7 @@ public static void main(String[] args) { entity.setType("TestEntity"); entity.setId("urn:ngsi-ld:TestEntity:" + uuid); try { - mocClient.entities().createEntity("application/json", entity, "keyValues"); + mocClient.createEntity("application/json", entity); } catch (RestClientResponseException e) { System.err.println("Error creating entity: " + e.getMessage()); } diff --git a/src/main/java/city/makeour/moc/ngsiv2/Ngsiv2Client.java b/src/main/java/city/makeour/moc/ngsiv2/Ngsiv2Client.java new file mode 100644 index 0000000..c9bb224 --- /dev/null +++ b/src/main/java/city/makeour/moc/ngsiv2/Ngsiv2Client.java @@ -0,0 +1,74 @@ +package city.makeour.moc.ngsiv2; + +import java.nio.charset.Charset; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestClient; +import org.springframework.web.client.RestClientResponseException; + +import city.makeour.ngsi.v2.api.EntitiesApi; +import city.makeour.ngsi.v2.invoker.ApiClient; + +public class Ngsiv2Client { + protected ApiClient apiClient; + + protected EntitiesApi entitiesApi; + + public Ngsiv2Client(ApiClient apiClient) { + this.apiClient = apiClient; + + this.entitiesApi = new EntitiesApi(this.apiClient); + } + + public ApiClient getApiClient() { + return apiClient; + } + + public EntitiesApi getEntitiesApi() { + return entitiesApi; + } + + public RestClient.ResponseSpec createEntity(String contentType, Object body) { + if (contentType == null) { + throw new RestClientResponseException( + "Missing the required parameter 'contentType' when calling createEntity", + HttpStatus.BAD_REQUEST.value(), HttpStatus.BAD_REQUEST.getReasonPhrase(), (HttpHeaders) null, + (byte[]) null, (Charset) null); + } else if (body == null) { + throw new RestClientResponseException("Missing the required parameter 'body' when calling createEntity", + HttpStatus.BAD_REQUEST.value(), HttpStatus.BAD_REQUEST.getReasonPhrase(), (HttpHeaders) null, + (byte[]) null, (Charset) null); + } else { + Map pathParams = new HashMap(); + MultiValueMap queryParams = new LinkedMultiValueMap(); + HttpHeaders headerParams = new HttpHeaders(); + MultiValueMap cookieParams = new LinkedMultiValueMap(); + MultiValueMap formParams = new LinkedMultiValueMap(); + queryParams.putAll( + this.apiClient.parameterToMultiValueMap((ApiClient.CollectionFormat) null, "options", "keyValues")); + if (contentType != null) { + headerParams.add("Content-Type", this.apiClient.parameterToString(contentType)); + } + + String[] localVarAccepts = new String[0]; + List localVarAccept = this.apiClient.selectHeaderAccept(localVarAccepts); + String[] localVarContentTypes = new String[] { "application/json" }; + MediaType localVarContentType = this.apiClient.selectHeaderContentType(localVarContentTypes); + String[] localVarAuthNames = new String[0]; + ParameterizedTypeReference localVarReturnType = new ParameterizedTypeReference<>() { + }; + return this.apiClient.invokeAPI("/v2/entities", HttpMethod.POST, pathParams, queryParams, body, + headerParams, cookieParams, formParams, localVarAccept, localVarContentType, localVarAuthNames, + localVarReturnType); + } + } +} diff --git a/src/test/java/city/makeour/moc/MocClientTest.java b/src/test/java/city/makeour/moc/MocClientTest.java index bb698c6..403a04c 100644 --- a/src/test/java/city/makeour/moc/MocClientTest.java +++ b/src/test/java/city/makeour/moc/MocClientTest.java @@ -23,7 +23,7 @@ class MocClientTest { @DisplayName("デフォルトコンストラクタで正しいベースパスが設定されることを確認") void defaultConstructorShouldSetCorrectBasePath() { MocClient client = new MocClient(); - assertEquals("https://orion.sandbox.makeour.city", client.apiClient.getBasePath()); + assertEquals("https://orion.sandbox.makeour.city", client.client.getApiClient().getBasePath()); } @Test @@ -31,7 +31,7 @@ void defaultConstructorShouldSetCorrectBasePath() { void constructorWithBasePathShouldSetCustomBasePath() { String customBasePath = "https://custom.orion.example.com"; MocClient client = new MocClient(customBasePath); - assertEquals(customBasePath, client.apiClient.getBasePath()); + assertEquals(customBasePath, client.client.getApiClient().getBasePath()); } @Test @@ -41,7 +41,7 @@ void entitiesMethodShouldReturnEntitiesApiInstance() { EntitiesApi entitiesApi = client.entities(); assertNotNull(entitiesApi); - assertEquals(client.entitiesApi, entitiesApi); + assertEquals(client.client.getEntitiesApi(), entitiesApi); } @Test