From 52841901e8f2aecc2a3a8fed6cd86eae6574d6b2 Mon Sep 17 00:00:00 2001 From: Tomas Casas Date: Mon, 11 Aug 2025 15:28:06 -0300 Subject: [PATCH] [sc-73945] Support DecisionResponse with single and multiple decisions --- .github/workflows/maven.yml | 30 + .openapi-generator/FILES | 23 +- .openapi-generator/VERSION | 2 +- README.md | 342 ++---- api/openapi.yaml | 1049 +++++++++++++++++ build.gradle | 227 ++-- build.sbt | 27 + docs/ConsentRequest.md | 8 +- docs/Content.md | 14 +- docs/Decision.md | 28 +- docs/DecisionApi.md | 18 +- docs/DecisionRequest.md | 42 +- docs/DecisionResponse.md | 10 +- docs/DecisionResponseDecisionsValue.md | 28 + docs/Event.md | 8 +- docs/MatchedPoint.md | 8 +- docs/Placement.md | 50 +- docs/PricingData.md | 14 +- docs/SkipFilters.md | 20 +- docs/User.md | 6 +- docs/UserdbApi.md | 148 +-- git_push.sh | 7 +- gradle/wrapper/gradle-wrapper.jar | Bin 59536 -> 43453 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 189 +-- gradlew.bat | 181 +-- pom.xml | 340 ++++++ src/.DS_Store | Bin 0 -> 6148 bytes .../com/adzerk/sdk/AdditionalOptions.java | 81 -- src/main/java/com/adzerk/sdk/Client.java | 367 ------ .../java/com/adzerk/sdk/ClientOptions.java | 92 -- .../java/com/adzerk/sdk/PixelFireOptions.java | 76 -- .../com/adzerk/sdk/PixelFireResponse.java | 32 - .../com/adzerk/sdk/constants/EventType.java | 63 - .../com/adzerk/sdk/constants/RateType.java | 10 - .../com/adzerk/sdk/generated/ApiCallback.java | 4 +- .../com/adzerk/sdk/generated/ApiClient.java | 461 ++++++-- .../adzerk/sdk/generated/ApiException.java | 80 +- .../com/adzerk/sdk/generated/ApiResponse.java | 21 +- .../adzerk/sdk/generated/Configuration.java | 66 +- .../java/com/adzerk/sdk/generated/JSON.java | 112 +- .../java/com/adzerk/sdk/generated/Pair.java | 6 +- .../sdk/generated/ProgressResponseBody.java | 2 - .../sdk/generated/ServerConfiguration.java | 20 +- .../adzerk/sdk/generated/ServerVariable.java | 14 + .../com/adzerk/sdk/generated/StringUtil.java | 2 +- .../adzerk/sdk/generated/api/DecisionApi.java | 64 +- .../adzerk/sdk/generated/api/UserdbApi.java | 490 +++++--- .../adzerk/sdk/generated/auth/ApiKeyAuth.java | 7 +- .../sdk/generated/auth/Authentication.java | 9 +- .../sdk/generated/auth/HttpBasicAuth.java | 7 +- .../sdk/generated/auth/HttpBearerAuth.java | 29 +- .../model/AbstractOpenApiSchema.java | 146 +++ .../sdk/generated/model/ConsentRequest.java | 144 ++- .../adzerk/sdk/generated/model/Content.java | 192 ++- .../adzerk/sdk/generated/model/Decision.java | 335 ++++-- .../sdk/generated/model/DecisionRequest.java | 434 ++++--- .../sdk/generated/model/DecisionResponse.java | 171 ++- .../model/DecisionResponseDecisionsValue.java | 297 +++++ .../com/adzerk/sdk/generated/model/Event.java | 144 ++- .../sdk/generated/model/MatchedPoint.java | 147 ++- .../adzerk/sdk/generated/model/Placement.java | 480 ++++---- .../sdk/generated/model/PricingData.java | 180 ++- .../sdk/generated/model/SkipFilters.java | 219 ++-- .../com/adzerk/sdk/generated/model/User.java | 132 ++- .../adzerk/sdk/model/DecisionResponse.java | 32 - .../java/com/adzerk/sdk/model/UserRecord.java | 162 --- src/main/resources/log4j2.xml | 14 - src/test/java/com/adzerk/sdk/.gitkeep | 0 .../sdk/generated/api/DecisionApiTest.java | 51 + .../sdk/generated/api/UserdbApiTest.java | 187 +++ .../generated/model/ConsentRequestTest.java | 59 + .../sdk/generated/model/ContentTest.java | 83 ++ .../generated/model/DecisionRequestTest.java | 200 ++++ .../DecisionResponseDecisionsValueTest.java | 144 +++ .../generated/model/DecisionResponseTest.java | 72 ++ .../sdk/generated/model/DecisionTest.java | 146 +++ .../adzerk/sdk/generated/model/EventTest.java | 60 + .../sdk/generated/model/MatchedPointTest.java | 59 + .../sdk/generated/model/PlacementTest.java | 233 ++++ .../sdk/generated/model/PricingDataTest.java | 83 ++ .../sdk/generated/model/SkipFiltersTest.java | 107 ++ .../adzerk/sdk/generated/model/UserTest.java | 51 + 83 files changed, 6946 insertions(+), 2756 deletions(-) create mode 100644 .github/workflows/maven.yml create mode 100644 api/openapi.yaml create mode 100644 build.sbt create mode 100644 docs/DecisionResponseDecisionsValue.md mode change 100755 => 100644 gradlew create mode 100644 pom.xml create mode 100644 src/.DS_Store delete mode 100644 src/main/java/com/adzerk/sdk/AdditionalOptions.java delete mode 100644 src/main/java/com/adzerk/sdk/Client.java delete mode 100644 src/main/java/com/adzerk/sdk/ClientOptions.java delete mode 100644 src/main/java/com/adzerk/sdk/PixelFireOptions.java delete mode 100644 src/main/java/com/adzerk/sdk/PixelFireResponse.java delete mode 100644 src/main/java/com/adzerk/sdk/constants/EventType.java delete mode 100644 src/main/java/com/adzerk/sdk/constants/RateType.java create mode 100644 src/main/java/com/adzerk/sdk/generated/model/AbstractOpenApiSchema.java create mode 100644 src/main/java/com/adzerk/sdk/generated/model/DecisionResponseDecisionsValue.java delete mode 100644 src/main/java/com/adzerk/sdk/model/DecisionResponse.java delete mode 100644 src/main/java/com/adzerk/sdk/model/UserRecord.java delete mode 100644 src/main/resources/log4j2.xml delete mode 100644 src/test/java/com/adzerk/sdk/.gitkeep create mode 100644 src/test/java/com/adzerk/sdk/generated/api/DecisionApiTest.java create mode 100644 src/test/java/com/adzerk/sdk/generated/api/UserdbApiTest.java create mode 100644 src/test/java/com/adzerk/sdk/generated/model/ConsentRequestTest.java create mode 100644 src/test/java/com/adzerk/sdk/generated/model/ContentTest.java create mode 100644 src/test/java/com/adzerk/sdk/generated/model/DecisionRequestTest.java create mode 100644 src/test/java/com/adzerk/sdk/generated/model/DecisionResponseDecisionsValueTest.java create mode 100644 src/test/java/com/adzerk/sdk/generated/model/DecisionResponseTest.java create mode 100644 src/test/java/com/adzerk/sdk/generated/model/DecisionTest.java create mode 100644 src/test/java/com/adzerk/sdk/generated/model/EventTest.java create mode 100644 src/test/java/com/adzerk/sdk/generated/model/MatchedPointTest.java create mode 100644 src/test/java/com/adzerk/sdk/generated/model/PlacementTest.java create mode 100644 src/test/java/com/adzerk/sdk/generated/model/PricingDataTest.java create mode 100644 src/test/java/com/adzerk/sdk/generated/model/SkipFiltersTest.java create mode 100644 src/test/java/com/adzerk/sdk/generated/model/UserTest.java diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml new file mode 100644 index 0000000..5d57951 --- /dev/null +++ b/.github/workflows/maven.yml @@ -0,0 +1,30 @@ +# This workflow will build a Java project with Maven, and cache/restore any dependencies to improve the workflow execution time +# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven +# +# This file is auto-generated by OpenAPI Generator (https://openapi-generator.tech) + +name: Java CI with Maven + +on: + push: + branches: [ main, master ] + pull_request: + branches: [ main, master ] + +jobs: + build: + name: Build Adzerk Decision API + runs-on: ubuntu-latest + strategy: + matrix: + java: [ 17, 21 ] + steps: + - uses: actions/checkout@v4 + - name: Set up JDK + uses: actions/setup-java@v4 + with: + java-version: ${{ matrix.java }} + distribution: 'temurin' + cache: maven + - name: Build with Maven + run: mvn -B package --no-transfer-progress --file pom.xml diff --git a/.openapi-generator/FILES b/.openapi-generator/FILES index e767192..6abdbde 100644 --- a/.openapi-generator/FILES +++ b/.openapi-generator/FILES @@ -1,9 +1,4 @@ -.gitignore -.openapi-generator-ignore -.travis.yml -README.md -api/openapi.yaml -build.gradle +.github/workflows/maven.yml build.sbt docs/ConsentRequest.md docs/Content.md @@ -11,6 +6,7 @@ docs/Decision.md docs/DecisionApi.md docs/DecisionRequest.md docs/DecisionResponse.md +docs/DecisionResponseDecisionsValue.md docs/Event.md docs/MatchedPoint.md docs/Placement.md @@ -46,27 +42,16 @@ src/main/java/com/adzerk/sdk/generated/auth/ApiKeyAuth.java src/main/java/com/adzerk/sdk/generated/auth/Authentication.java src/main/java/com/adzerk/sdk/generated/auth/HttpBasicAuth.java src/main/java/com/adzerk/sdk/generated/auth/HttpBearerAuth.java +src/main/java/com/adzerk/sdk/generated/model/AbstractOpenApiSchema.java src/main/java/com/adzerk/sdk/generated/model/ConsentRequest.java src/main/java/com/adzerk/sdk/generated/model/Content.java src/main/java/com/adzerk/sdk/generated/model/Decision.java src/main/java/com/adzerk/sdk/generated/model/DecisionRequest.java src/main/java/com/adzerk/sdk/generated/model/DecisionResponse.java +src/main/java/com/adzerk/sdk/generated/model/DecisionResponseDecisionsValue.java src/main/java/com/adzerk/sdk/generated/model/Event.java src/main/java/com/adzerk/sdk/generated/model/MatchedPoint.java src/main/java/com/adzerk/sdk/generated/model/Placement.java src/main/java/com/adzerk/sdk/generated/model/PricingData.java src/main/java/com/adzerk/sdk/generated/model/SkipFilters.java src/main/java/com/adzerk/sdk/generated/model/User.java -src/test/java/com/adzerk/sdk/generated/api/DecisionApiTest.java -src/test/java/com/adzerk/sdk/generated/api/UserdbApiTest.java -src/test/java/com/adzerk/sdk/generated/model/ConsentRequestTest.java -src/test/java/com/adzerk/sdk/generated/model/ContentTest.java -src/test/java/com/adzerk/sdk/generated/model/DecisionRequestTest.java -src/test/java/com/adzerk/sdk/generated/model/DecisionResponseTest.java -src/test/java/com/adzerk/sdk/generated/model/DecisionTest.java -src/test/java/com/adzerk/sdk/generated/model/EventTest.java -src/test/java/com/adzerk/sdk/generated/model/MatchedPointTest.java -src/test/java/com/adzerk/sdk/generated/model/PlacementTest.java -src/test/java/com/adzerk/sdk/generated/model/PricingDataTest.java -src/test/java/com/adzerk/sdk/generated/model/SkipFiltersTest.java -src/test/java/com/adzerk/sdk/generated/model/UserTest.java diff --git a/.openapi-generator/VERSION b/.openapi-generator/VERSION index 831446c..e465da4 100644 --- a/.openapi-generator/VERSION +++ b/.openapi-generator/VERSION @@ -1 +1 @@ -5.1.0 +7.14.0 diff --git a/README.md b/README.md index 5351c0b..1ba62b7 100644 --- a/README.md +++ b/README.md @@ -1,292 +1,166 @@ -# Adzerk Java Decision SDK +# adzerk-decision-sdk -Java Software Development Kit for Adzerk Decision & UserDB APIs +Adzerk Decision API +- API version: 1.0 + - Build date: 2025-08-11T14:42:50.054336-03:00[America/Argentina/Cordoba] + - Generator version: 7.14.0 -## Installation +Adzerk Decision API -Requires [Java SE 8](https://en.wikipedia.org/wiki/Java_version_history) or higher. -[Maven Package](https://search.maven.org/artifact/com.adzerk/adzerk-decision-sdk) +*Automatically generated by the [OpenAPI Generator](https://openapi-generator.tech)* -Add to your `pom.xml` file: -```xml - - com.adzerk - adzerk-decision-sdk - 1.0.0-beta.1 - -``` +## Requirements -Or `build.gradle` file: +Building the API client library requires: +1. Java 1.8+ +2. Maven (3.8.3+)/Gradle (7.2+) -```gradle -implementation 'com.adzerk:adzerk-decision-sdk:1.0.0-beta.1' -``` +## Installation -Or, if using Clojure, add to your `deps.edn` file: +To install the API client library to your local Maven repository, simply execute: -```clojure -{:deps - {com.adzerk/adzerk-decision-sdk {:mvn/version "1.0.0-beta.1"}}} +```shell +mvn clean install ``` -## Examples +To deploy it to a remote Maven repository instead, configure the settings of the repository and execute: -### API Credentials & Required IDs - -- Network ID: Log into [Adzerk UI](https://app.adzerk.com/) & use the "circle-i" help menu in upper right corner to find Network ID. Required for all SDK operations. -- Site ID: Go to [Manage Sites page](https://app.adzerk.com/#!/sites/) to find site IDs. Required when fetching an ad decision. -- Ad Type ID: Go to [Ad Sizes page](https://app.adzerk.com/#!/ad-sizes/) to find Ad Type IDs. Required when fetching an ad decision. -- API Key: Go to [API Keys page](https://app.adzerk.com/#!/api-keys/) find active API keys. Required when writing to UserDB. -- User Key: UserDB IDs are [specified or generated for each user](https://dev.adzerk.com/reference/userdb#passing-the-userkey). - -### Fetching an Ad Decision - -```java -import java.util.*; -import com.adzerk.sdk.*; -import com.adzerk.sdk.generated.ApiException; -import com.adzerk.sdk.generated.model.*; -import com.adzerk.sdk.model.DecisionResponse; - -public class FetchAds { - public static void main(String[] args) throws ApiException { - // Demo network, site, and ad type IDs; find your own via the Adzerk UI! - Client client = new Client(new ClientOptions(23).siteId(667480)); - Placement placement = new Placement().adTypes(Arrays.asList(5)); - User user = new User().key("abc"); - - DecisionRequest request = new DecisionRequest() - .placements(Arrays.asList(placement)) - .keywords(Arrays.asList("keyword1", "keyword2")) - .user(user); - - DecisionResponse response = client.decisions().get(request); - System.out.println(response.toString()); - } -} +```shell +mvn clean deploy ``` -### Recording Impression & Clicks - -Use with the fetch ad example above. +Refer to the [OSSRH Guide](http://central.sonatype.org/pages/ossrh-guide.html) for more information. -```java -// Impression pixel; fire when user sees the ad -String impUrl = decision.getImpressionUrl().toString(); -client.pixels().fire(new PixelFireOptions().url(impUrl)); - -// Click pixel; fire when user clicks on the ad -// status: HTTP status code -// location: click target URL -String clickUrl = decision.getClickUrl().toString(); -PixelFireResponse clickResponse = client.pixels().fire(new PixelFireOptions() .url(clickUrl)); -System.out.println("Fired! " + - "status: " + clickResponse.getStatusCode() + " " + - "location: " + clickResponse.getLocation()); -``` +### Maven users -### UserDB: Reading User Record +Add this dependency to your project's POM: -```java -import com.adzerk.sdk.*; -import com.adzerk.sdk.generated.ApiException; -import com.adzerk.sdk.model.UserRecord; -import org.apache.commons.lang3.builder.ToStringBuilder; - -public class FetchUserDb { - public static void main(String[] argv) throws ApiException { - // Demo network ID; find your own via the Adzerk UI! - Client client = new Client(new ClientOptions(23)); - UserRecord record = client.userDb().read("abc"); - System.out.println(ToStringBuilder.reflectionToString(record)); - } -} +```xml + + com.adzerk + adzerk-decision-sdk + 1.0 + compile + ``` -### UserDB: Setting Custom Properties - -```java -import java.util.*; -import com.adzerk.sdk.*; -import com.adzerk.sdk.generated.ApiException; +### Gradle users -public class SetUserDb { - public static void main(String[] argv) throws ApiException { - // Demo network ID; find your own via the Adzerk UI! - Client client = new Client(new ClientOptions(23)); +Add this dependency to your project's build file: - Map props = Map.of( - "favoriteColor", "blue", - "favoriteNumber", 42, - "favoriteFoods", new String[] {"strawberries", "chocolate"}); +```groovy + repositories { + mavenCentral() // Needed if the 'adzerk-decision-sdk' jar has been published to maven central. + mavenLocal() // Needed if the 'adzerk-decision-sdk' jar has been published to the local maven repo. + } - client.userDb().setCustomProperties("abc", props); + dependencies { + implementation "com.adzerk:adzerk-decision-sdk:1.0" } -} ``` -### UserDB: Forgetting User Record +### Others -```java -import com.adzerk.sdk.*; -import com.adzerk.sdk.generated.ApiException; +At first generate the JAR by executing: -public class ForgetUserDb { - public static void main(String[] argv) throws ApiException { - // Demo network ID and API key; find your own via the Adzerk UI! - Client client = new Client(new ClientOptions(23).apiKey("YOUR-API-KEY")); - client.userDb().forget("abc"); - } -} +```shell +mvn clean package ``` -### Decision Explainer +Then manually install the following JARs: + +* `target/adzerk-decision-sdk-1.0.jar` +* `target/lib/*.jar` -The Decision Explainer is a feature that returns information on a Decision API request explaining why each candidate ad was or was not chosen. +## Getting Started +Please follow the [installation](#installation) instruction and execute the following Java code: ```java -import java.util.*; -import com.adzerk.sdk.*; + +// Import classes: +import com.adzerk.sdk.generated.ApiClient; import com.adzerk.sdk.generated.ApiException; +import com.adzerk.sdk.generated.Configuration; import com.adzerk.sdk.generated.model.*; -import com.adzerk.sdk.model.DecisionResponse; - -public class FetchAds { - public static void main(String[] args) throws ApiException { - // Demo network, site, and ad type IDs; find your own via the Adzerk UI! - Client client = new Client(new ClientOptions(23).siteId(667480)); - Placement placement = new Placement().adTypes(Arrays.asList(5)); - User user = new User().key("abc"); - - DecisionRequest request = new DecisionRequest() - .placements(Arrays.asList(placement)) - .keywords(Arrays.asList("keyword1", "keyword2")) - .user(user); - - AdditionalOptions options = new AdditionalOptions() - .includeExplanation(true) - .apiKey("API_KEY"); - - DecisionResponse response = client.decisions().get(request, options); - System.out.println(response.toString()); - } -} -``` - -The response returns a decision object with placement, buckets, rtb logs, and result information. -``` json -{ - "div0": { - "placement": {}, - "buckets": [], - "rtb_log": [], - "results": [] +import com.adzerk.sdk.generated.api.DecisionApi; + +public class Example { + public static void main(String[] args) { + ApiClient defaultClient = Configuration.getDefaultApiClient(); + defaultClient.setBasePath("https://e-23.adzerk.net"); + + DecisionApi apiInstance = new DecisionApi(defaultClient); + DecisionRequest decisionRequest = new DecisionRequest(); // DecisionRequest | + try { + DecisionResponse result = apiInstance.getDecisions(decisionRequest); + System.out.println(result); + } catch (ApiException e) { + System.err.println("Exception when calling DecisionApi#getDecisions"); + System.err.println("Status code: " + e.getCode()); + System.err.println("Reason: " + e.getResponseBody()); + System.err.println("Response headers: " + e.getResponseHeaders()); + e.printStackTrace(); + } } } -``` - -The "placement" object represents a decision in which an ad may be served. A Explainer Request can have multiple placements in the request. -The "buckets" array contains channel and priority information. -The "rtb_logs" array contains information about Real Time Bidding. -The "results" array contains the list of candidate ads that did and did not serve, along with a brief explanation. - - -## Clojure Examples - -### Fetching an Ad Decision - -```clojure -(ns readme-ad-request - (:import (com.adzerk.sdk Client ClientOptions) - (com.adzerk.sdk.generated.model DecisionRequest Placement User))) - -(defn -main [] - ; Demo network, site, and ad type IDs; find your own via the Adzerk UI! - (let [client (Client. (doto (ClientOptions. (int 23)) (.siteId (int 667480)))) - request (doto (DecisionRequest.) - (.placements [(doto (Placement.) (.adTypes [5]))]) - (.keywords ["keyword1" "keyword2"]) - (.user (doto (User.) (.key "abc"))))] - (print (-> client (.decisions) (.get request))))) ``` -### Recording Impression & Clicks - -Use with the fetch ad example above. +## Documentation for API Endpoints -```clojure -; Impression pixel; fire when user sees the ad -(-> client (.pixels) (.fire (doto (PixelFireOptions.) (.url (.toString (.getImpressionUrl decision)))))) +All URIs are relative to *https://e-23.adzerk.net* -; Click pixel; fire when user clicks on the ad -; status: HTTP status code -; location: click target URL -(let [decision-url (.toString (.getClickUrl decision)) - pixel-results (-> client (.pixels) (.fire (doto (PixelFireOptions.) (.url decision-url))))] - (println (str "Fired! status: " (.getStatusCode pixel-results) - "; location: " (.getLocation pixel-results)))))) -``` - -### UserDB: Reading User Record +Class | Method | HTTP request | Description +------------ | ------------- | ------------- | ------------- +*DecisionApi* | [**getDecisions**](docs/DecisionApi.md#getDecisions) | **POST** /api/v2 | +*UserdbApi* | [**addCustomProperties**](docs/UserdbApi.md#addCustomProperties) | **POST** /udb/{networkId}/custom | +*UserdbApi* | [**addInterests**](docs/UserdbApi.md#addInterests) | **GET** /udb/{networkId}/interest/i.gif | +*UserdbApi* | [**addRetargetingSegment**](docs/UserdbApi.md#addRetargetingSegment) | **GET** /udb/{networkId}/rt/{advertiserId}/{retargetingSegmentId}/i.gif | +*UserdbApi* | [**forget**](docs/UserdbApi.md#forget) | **DELETE** /udb/{networkId} | +*UserdbApi* | [**gdprConsent**](docs/UserdbApi.md#gdprConsent) | **POST** /udb/{networkId}/consent | +*UserdbApi* | [**ipOverride**](docs/UserdbApi.md#ipOverride) | **GET** /udb/{networkId}/ip/i.gif | +*UserdbApi* | [**matchUser**](docs/UserdbApi.md#matchUser) | **GET** /udb/{networkId}/sync/i.gif | +*UserdbApi* | [**optOut**](docs/UserdbApi.md#optOut) | **GET** /udb/{networkId}/optout/i.gif | +*UserdbApi* | [**read**](docs/UserdbApi.md#read) | **GET** /udb/{networkId}/read | -```clojure -(ns readme-read-userdb - (:use clojure.pprint) - (:import (com.adzerk.sdk Client ClientOptions))) -(defn -main [] - ; Demo network ID; find your own via the Adzerk UI! - (let [client (Client. (doto (ClientOptions. (int 23))))] - (pprint (bean (-> client (.userDb) (.read "abc")))))) -``` +## Documentation for Models -### UserDB: Setting Custom Properties + - [ConsentRequest](docs/ConsentRequest.md) + - [Content](docs/Content.md) + - [Decision](docs/Decision.md) + - [DecisionRequest](docs/DecisionRequest.md) + - [DecisionResponse](docs/DecisionResponse.md) + - [DecisionResponseDecisionsValue](docs/DecisionResponseDecisionsValue.md) + - [Event](docs/Event.md) + - [MatchedPoint](docs/MatchedPoint.md) + - [Placement](docs/Placement.md) + - [PricingData](docs/PricingData.md) + - [SkipFilters](docs/SkipFilters.md) + - [User](docs/User.md) -```clojure -(ns readme-set-userdb - (:import (com.adzerk.sdk Client ClientOptions))) -(defn -main [] - ; Demo network ID; find your own via the Adzerk UI! - (let [client (Client. (doto (ClientOptions. (int 23)))) - props {"favoriteColor" "blue" - "favoriteNumber" 42 - "favoriteFoods" ["strawberries", "chocolate"]}] - (-> client (.userDb) (.setCustomProperties "abc" props)))) -``` + +## Documentation for Authorization -### UserDB: Forgetting User Record -```clojure -(ns readme-forget-userdb - (:import (com.adzerk.sdk Client ClientOptions))) +Authentication schemes defined for the API: + +### ApiKeyAuth -(defn -main [] - ; Demo network ID and API key; find your own via the Adzerk UI! - (let [client (Client. (doto (ClientOptions. (int 23)) (.apiKey "YOUR-API-KEY")))] - (-> client (.userDb) (.forget "abc")))) -``` +- **Type**: API key +- **API key parameter name**: X-Adzerk-ApiKey +- **Location**: HTTP header -## Documentation -- [Adzerk API Documentation](https://dev.adzerk.com/reference) -- [Adzerk User & Developer Documentation](https://dev.adzerk.com/docs) +## Recommendation -## Contributing +It's recommended to create an instance of `ApiClient` per thread in a multithreaded environment to avoid any potential issues. -### Reporting Issues +## Author -- For bug fixes and improvements to this SDK please use Github to [open an issue](https://github.com/adzerk/adzerk-decision-sdk-java/issues) or send us a [pull request](https://github.com/adzerk/adzerk-decision-sdk-java/pulls). -- For questions or issues regarding Adzerk functionality, please [contact Adzerk support](https://adzerk.com/help/). -### Building -``` -./gradlew build -``` \ No newline at end of file diff --git a/api/openapi.yaml b/api/openapi.yaml new file mode 100644 index 0000000..ebd917e --- /dev/null +++ b/api/openapi.yaml @@ -0,0 +1,1049 @@ +openapi: 3.0.1 +info: + description: Adzerk Decision API + title: Adzerk Decision API + version: "1.0" +servers: +- url: "{protocol}://e-{networkId}.adzerk.net" + variables: + protocol: + default: https + enum: + - http + - https + networkId: + default: "23" + description: Your Adzerk Network Id +tags: +- description: Adzerk Decision API Endpoint + name: decision +- description: Adzerk UserDB + name: userdb +paths: + /api/v2: + post: + description: Request Decision(s) + operationId: getDecisions + requestBody: + content: + application/json: + examples: + "0": + value: "{\"placements\": [{ \"divName\": \"header\", \"networkId\"\ + : 23, \"siteId\": 667480, \"adTypes\": [5] }] }" + "1": + value: "{\"placements\": [{ \"divName\": \"header\", \"networkId\"\ + : 23, \"siteId\": 667480, \"adTypes\": [5] }], \"user\": { \"key\"\ + : \"ABC123\" } }" + "2": + value: "{\"placements\": [{ \"divName\": \"header\", \"networkId\"\ + : 23, \"siteId\": 667480, \"adTypes\": [5], \"count\": 5 }], \"\ + user\": { \"key\": \"ABC123\" } }" + "3": + value: "{\"placements\": [{ \"divName\": \"header\", \"networkId\"\ + : 23, \"siteId\": 667480, \"adTypes\": [5], \"count\": 5 }], \"\ + user\": { \"key\": \"ABC123\" }, \"includePricingData\": true }" + "4": + value: "{\"placements\": [{ \"divName\": \"header\", \"networkId\"\ + : 23, \"siteId\": 667480, \"adTypes\": [5], \"eventIds\": [1, 2],\ + \ \"count\": 5}], \"user\": { \"key\": \"ABC123\" }, \"includePricingData\"\ + : true }" + schema: + $ref: "#/components/schemas/DecisionRequest" + responses: + "400": + description: Bad Request + "200": + content: + application/json: + schema: + $ref: "#/components/schemas/DecisionResponse" + description: Successful decision request + tags: + - decision + x-content-type: application/json + x-accepts: + - application/json + /udb/{networkId}/custom: + post: + description: Add Custom Properties to a User + operationId: addCustomProperties + parameters: + - description: Your Network Id + explode: false + in: path + name: networkId + required: true + schema: + format: int32 + type: integer + style: simple + - description: The User's UserDB Key + explode: true + in: query + name: userKey + required: true + schema: + type: string + style: form + requestBody: + content: + application/json: + schema: + type: object + responses: + "200": + content: + image/gif: + schema: + format: binary + type: string + description: Success + security: + - ApiKeyAuth: [] + tags: + - userdb + x-content-type: application/json + x-accepts: + - image/gif + /udb/{networkId}/interest/i.gif: + get: + description: Add Interests to a User + operationId: addInterests + parameters: + - description: Your Network Id + explode: false + in: path + name: networkId + required: true + schema: + format: int32 + type: integer + style: simple + - description: The User's UserDB Key + explode: true + in: query + name: userKey + required: true + schema: + type: string + style: form + - description: Comma Seperated list of interests + explode: true + in: query + name: interest + required: true + schema: + type: string + style: form + responses: + "200": + content: + image/gif: + schema: + format: binary + type: string + description: Success + tags: + - userdb + x-accepts: + - image/gif + /udb/{networkId}/rt/{advertiserId}/{retargetingSegmentId}/i.gif: + get: + description: Add User to a Retargeting Segment + operationId: addRetargetingSegment + parameters: + - description: Your Network Id + explode: false + in: path + name: networkId + required: true + schema: + format: int32 + type: integer + style: simple + - description: The Advertiser's ID + explode: false + in: path + name: advertiserId + required: true + schema: + format: int32 + type: integer + style: simple + - description: The Segment's ID + explode: false + in: path + name: retargetingSegmentId + required: true + schema: + format: int32 + type: integer + style: simple + - description: The User's UserDB Key + explode: true + in: query + name: userKey + required: true + schema: + type: string + style: form + responses: + "200": + content: + image/gif: + schema: + format: binary + type: string + description: Success + tags: + - userdb + x-accepts: + - image/gif + /udb/{networkId}/optout/i.gif: + get: + description: Opt-Out a User + operationId: optOut + parameters: + - description: Your Network Id + explode: false + in: path + name: networkId + required: true + schema: + format: int32 + type: integer + style: simple + - description: The User's UserDB Key + explode: true + in: query + name: userKey + required: true + schema: + type: string + style: form + responses: + "200": + content: + image/gif: + schema: + format: binary + type: string + description: Sucess + tags: + - userdb + x-accepts: + - image/gif + /udb/{networkId}/read: + get: + description: Read a User's UserDB Record + operationId: read + parameters: + - description: Your Network Id + explode: false + in: path + name: networkId + required: true + schema: + format: int32 + type: integer + style: simple + - description: The User's UserDB Key + explode: true + in: query + name: userKey + required: true + schema: + type: string + style: form + responses: + "200": + content: + application/json: + schema: + type: object + description: The UserDB record + tags: + - userdb + x-accepts: + - application/json + /udb/{networkId}/ip/i.gif: + get: + description: IP Address Override + operationId: ipOverride + parameters: + - description: Your Network Id + explode: false + in: path + name: networkId + required: true + schema: + format: int32 + type: integer + style: simple + - description: The User's UserDB Key + explode: true + in: query + name: userKey + required: true + schema: + type: string + style: form + - description: This is the IP to exclude + explode: true + in: query + name: ip + required: true + schema: + type: string + style: form + responses: + "200": + content: + image/gif: + schema: + format: binary + type: string + description: The updated UserDB record + tags: + - userdb + x-accepts: + - image/gif + /udb/{networkId}: + delete: + description: Forget User + operationId: forget + parameters: + - description: Your Network Id + explode: false + in: path + name: networkId + required: true + schema: + format: int32 + type: integer + style: simple + - description: The User's UserDB Key + explode: true + in: query + name: userKey + required: true + schema: + type: string + style: form + responses: + "200": + description: Success + security: + - ApiKeyAuth: [] + tags: + - userdb + x-accepts: + - application/json + /udb/{networkId}/consent: + post: + description: GDPR Consent + operationId: gdprConsent + parameters: + - description: Your Network Id + explode: false + in: path + name: networkId + required: true + schema: + format: int32 + type: integer + style: simple + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/ConsentRequest" + responses: + "200": + content: + image/gif: + schema: + format: binary + type: string + description: Success + security: + - ApiKeyAuth: [] + tags: + - userdb + x-content-type: application/json + x-accepts: + - image/gif + /udb/{networkId}/sync/i.gif: + get: + description: User Matching + operationId: matchUser + parameters: + - description: Your Network Id + explode: false + in: path + name: networkId + required: true + schema: + format: int32 + type: integer + style: simple + - description: The User's UserDB Key + explode: true + in: query + name: userKey + required: true + schema: + type: string + style: form + - description: The ID of the RTB provider in Adzerk. Contact Support if you + don't have the ID. + explode: true + in: query + name: partnerId + required: true + schema: + format: int32 + type: integer + style: form + - description: This is the UserID the individual RTB provider has of the user. + This is NOT the UserDB userkey. + explode: true + in: query + name: userId + required: true + schema: + format: int32 + type: integer + style: form + responses: + "200": + content: + image/gif: + schema: + format: binary + type: string + description: Success + tags: + - userdb + x-accepts: + - image/gif +components: + schemas: + DecisionRequest: + example: + intendedLongitude: 1.4894159 + keywords: + - keywords + - keywords + notrack: true + intendedLatitude: 1.0246457 + enableUserDBIP: true + ip: ip + placements: + - clickUrl: clickUrl + floorPrice: 4.145608 + divName: divName + contentKeys: + key: contentKeys + campaignId: 5 + count: 3 + adQuery: "{}" + flightId: 2 + overrides: "{}" + ecpmPartition: ecpmPartition + eventIds: + - 9 + - 9 + adTypes: + - 1 + - 1 + skipFilters: + siteZone: true + distance: true + placementLimit: true + location: true + keyword: true + facet: true + geodistance: true + geolocation: true + proportionality: true + zoneIds: + - 5 + - 5 + adId: 7 + eventMultiplier: -59457539 + skipSelection: true + siteId: 6 + floorCpc: 7.386282 + networkId: 0 + ecpmPartitions: + - ecpmPartitions + - ecpmPartitions + properties: "{}" + - clickUrl: clickUrl + floorPrice: 4.145608 + divName: divName + contentKeys: + key: contentKeys + campaignId: 5 + count: 3 + adQuery: "{}" + flightId: 2 + overrides: "{}" + ecpmPartition: ecpmPartition + eventIds: + - 9 + - 9 + adTypes: + - 1 + - 1 + skipFilters: + siteZone: true + distance: true + placementLimit: true + location: true + keyword: true + facet: true + geodistance: true + geolocation: true + proportionality: true + zoneIds: + - 5 + - 5 + adId: 7 + eventMultiplier: -59457539 + skipSelection: true + siteId: 6 + floorCpc: 7.386282 + networkId: 0 + ecpmPartitions: + - ecpmPartitions + - ecpmPartitions + properties: "{}" + consent: "{}" + deviceID: deviceID + url: url + includeMatchedPoints: true + referrer: referrer + parallel: true + includePricingData: true + isMobile: true + radius: 6.846853 + user: + key: key + enableBotFiltering: true + blockedCreatives: + - 1 + - 1 + properties: + placements: + description: One or more Placement objects + items: + $ref: "#/components/schemas/Placement" + type: array + user: + $ref: "#/components/schemas/User" + keywords: + description: "Keywords for keyword Targeting. Such as `\"keywords\": [\"\ + foo\", \"bar\", \"baz\"]`." + items: + type: string + nullable: true + type: array + url: + description: The current page URL + nullable: true + type: string + referrer: + description: The referrer URL + nullable: true + type: string + ip: + description: "The IP address. Required for [Geo-Targeting](https://dev.adzerk.com/docs/geo-location)" + nullable: true + type: string + blockedCreatives: + description: Numeric creative ids to disregard for ad selection + items: + type: integer + nullable: true + type: array + isMobile: + deprecated: true + description: "If true, only ads containing a single image will be returned" + nullable: true + type: boolean + includePricingData: + description: "If true, return pricing data for the decision in the response" + nullable: true + type: boolean + notrack: + description: "If true, only return ads that are set to honor Do Not Track" + nullable: true + type: boolean + enableBotFiltering: + description: "If making a client-side request, set to true. Defaults to\ + \ false to ensure a server isn't seen as a bot. See [here](https://dev.adzerk.com/docs/tracking-overview#section-bot-filtering)\ + \ for more info" + nullable: true + type: boolean + enableUserDBIP: + description: "If true, override the IP address of the request with the IP\ + \ address supplied on the UserKey. If no IP address is found on the UserKey,\ + \ this will fall back to the IP address on the request. Requires UserDB" + nullable: true + type: boolean + consent: + description: Object that sets the data consent preferences. Other consent + settings are available in the GDPR settings documentation. + nullable: true + type: object + deviceID: + description: RTB requests only - sets an Identifier for Advertisers (IFA + or IDFA) + nullable: true + type: string + parallel: + nullable: true + type: boolean + intendedLatitude: + format: float + nullable: true + type: number + intendedLongitude: + format: float + nullable: true + type: number + radius: + format: float + nullable: true + type: number + includeMatchedPoints: + nullable: true + type: boolean + required: + - placements + type: object + Placement: + example: + clickUrl: clickUrl + floorPrice: 4.145608 + divName: divName + contentKeys: + key: contentKeys + campaignId: 5 + count: 3 + adQuery: "{}" + flightId: 2 + overrides: "{}" + ecpmPartition: ecpmPartition + eventIds: + - 9 + - 9 + adTypes: + - 1 + - 1 + skipFilters: + siteZone: true + distance: true + placementLimit: true + location: true + keyword: true + facet: true + geodistance: true + geolocation: true + proportionality: true + zoneIds: + - 5 + - 5 + adId: 7 + eventMultiplier: -59457539 + skipSelection: true + siteId: 6 + floorCpc: 7.386282 + networkId: 0 + ecpmPartitions: + - ecpmPartitions + - ecpmPartitions + properties: "{}" + properties: + divName: + description: A unique name for the placement defined by you + type: string + networkId: + description: The numeric network id + format: int32 + type: integer + siteId: + description: The numeric site id + format: int32 + type: integer + adTypes: + description: "One or more integer ad types. More info [here](https://dev.adzerk.com/docs/ad-sizes)" + items: + type: integer + type: array + zoneIds: + description: Zone IDs to use + items: + type: integer + nullable: true + type: array + campaignId: + description: "A numeric campaign id; if specified, only consider ads in\ + \ that campaign" + format: int32 + nullable: true + type: integer + flightId: + description: "A numeric ad (flight-creative map) id; if specified, only\ + \ serve that ad if possible" + format: int32 + nullable: true + type: integer + adId: + description: "A numeric ad (flight-creative map) id; if specified, only\ + \ serve that ad if possible" + format: int32 + nullable: true + type: integer + clickUrl: + description: The ad's click-through URL + nullable: true + type: string + properties: + description: "A map of key/value pairs used for [Custom Targeting](https://dev.adzerk.com/docs/custom-targeting)" + nullable: true + type: object + eventIds: + description: "An array of numeric event types. Requests tracking URLs for\ + \ custom events. See here for [Event Tracking IDs](https://dev.adzerk.com/v1.0/docs/custom-event-tracking)" + items: + type: integer + nullable: true + type: array + overrides: + description: "An object that overrides values for an advertiser, campaign,\ + \ flight or ad. Used especially for header bidding" + nullable: true + type: object + contentKeys: + additionalProperties: + type: string + description: "A map of key/value pairs used with [ContentDB](https://dev.adzerk.com/docs/contentdb-1).\ + \ The format is `\"contentKeys\": {\"schema\": \"contentKey\"}`" + nullable: true + type: object + count: + description: (BETA) The number of ads to return per placement. Integer between + 1 and 20 + format: int32 + nullable: true + type: integer + proportionality: + description: "(BETA) If true, fills ads in a multi-winner placement in proportion\ + \ to the flight's goals" + nullable: true + type: boolean + ecpmPartition: + deprecated: true + description: (BETA) The name of the eCPM Partition that should be used to + source eCPM data for auctions + nullable: true + type: string + ecpmPartitions: + description: (BETA) The names of the eCPM Partitions that should be used + to source eCPM data for auctions + items: + type: string + nullable: true + type: array + eventMultiplier: + format: int32 + maximum: 100000000 + minimum: -100000000 + nullable: true + type: integer + skipSelection: + nullable: true + type: boolean + adQuery: + nullable: true + type: object + floorPrice: + format: float + nullable: true + type: number + floorCpc: + format: float + nullable: true + type: number + skipFilters: + $ref: "#/components/schemas/SkipFilters" + type: object + User: + description: "Object containing the UserKey used for [UserDB targeting](https://dev.adzerk.com/docs/userdb-1)" + example: + key: key + properties: + key: + description: The UserKey used for UserDB Targeting + type: string + type: object + Decision: + example: + clickUrl: https://openapi-generator.tech + matchedPoints: + - lon: lon + lat: lat + - lon: lon + lat: lat + adId: 0 + contents: + - template: template + data: "{}" + type: type + body: body + customTemplate: customTemplate + - template: template + data: "{}" + type: type + body: body + customTemplate: customTemplate + impressionUrl: https://openapi-generator.tech + campaignId: 5 + flightId: 5 + creativeId: 1 + events: + - id: 7 + url: https://openapi-generator.tech + - id: 7 + url: https://openapi-generator.tech + pricing: + clearPrice: 3.6160767 + rateType: 4 + revenue: 2.027123 + eCPM: 7.386282 + price: 9.301444 + advertiserId: 6 + priorityId: 2 + properties: + adId: + type: integer + advertiserId: + type: integer + creativeId: + type: integer + flightId: + type: integer + campaignId: + type: integer + priorityId: + type: integer + clickUrl: + format: uri + type: string + contents: + items: + $ref: "#/components/schemas/Content" + type: array + impressionUrl: + format: uri + type: string + events: + items: + $ref: "#/components/schemas/Event" + type: array + matchedPoints: + items: + $ref: "#/components/schemas/MatchedPoint" + type: array + pricing: + $ref: "#/components/schemas/PricingData" + type: object + Event: + example: + id: 7 + url: https://openapi-generator.tech + properties: + id: + format: int32 + type: integer + url: + format: uri + type: string + type: object + Content: + example: + template: template + data: "{}" + type: type + body: body + customTemplate: customTemplate + properties: + type: + type: string + template: + type: string + customTemplate: + type: string + data: + type: object + body: + type: string + type: object + PricingData: + example: + clearPrice: 3.6160767 + rateType: 4 + revenue: 2.027123 + eCPM: 7.386282 + price: 9.301444 + properties: + price: + format: float + type: number + clearPrice: + format: float + type: number + revenue: + format: float + type: number + rateType: + type: integer + eCPM: + format: float + type: number + type: object + DecisionResponse: + example: + explain: "{}" + decisions: + key: + clickUrl: https://openapi-generator.tech + matchedPoints: + - lon: lon + lat: lat + - lon: lon + lat: lat + adId: 0 + contents: + - template: template + data: "{}" + type: type + body: body + customTemplate: customTemplate + - template: template + data: "{}" + type: type + body: body + customTemplate: customTemplate + impressionUrl: https://openapi-generator.tech + campaignId: 5 + flightId: 5 + creativeId: 1 + events: + - id: 7 + url: https://openapi-generator.tech + - id: 7 + url: https://openapi-generator.tech + pricing: + clearPrice: 3.6160767 + rateType: 4 + revenue: 2.027123 + eCPM: 7.386282 + price: 9.301444 + advertiserId: 6 + priorityId: 2 + user: + key: key + properties: + user: + $ref: "#/components/schemas/User" + decisions: + additionalProperties: + $ref: "#/components/schemas/DecisionResponse_decisions_value" + description: Single decision format with dynamic string key + type: object + explain: + type: object + type: object + ConsentRequest: + example: + consent: "{}" + userKey: userKey + properties: + userKey: + type: string + consent: + type: object + type: object + MatchedPoint: + example: + lon: lon + lat: lat + properties: + lat: + type: string + lon: + type: string + type: object + GeoDistanceSkipFilter: + description: "Geodistance filter, which skips geodistance targeting if true." + type: boolean + GeoLocationSkipFilter: + description: "Geolocation filter, which skips location targeting if true." + type: boolean + SkipFilters: + example: + siteZone: true + distance: true + placementLimit: true + location: true + keyword: true + facet: true + geodistance: true + geolocation: true + properties: + distance: + description: "Geodistance filter, which skips geodistance targeting if true." + type: boolean + facet: + description: "Facet targeting filter, which skips facet targeting if true." + type: boolean + geodistance: + description: "Geodistance filter, which skips geodistance targeting if true." + type: boolean + geolocation: + description: "Geolocation filter, which skips location targeting if true." + type: boolean + keyword: + description: "Keyword limit filter, which skips all (ad and/or flight) keyword\ + \ targeting if true." + type: boolean + location: + description: "Geolocation filter, which skips location targeting if true." + type: boolean + placementLimit: + description: "Placement limit filter, where no advertiser placement limit\ + \ if true." + type: boolean + siteZone: + description: "Site/zone limit filter, which skips site/zone targeting if\ + \ true." + type: boolean + type: object + DecisionResponse_decisions_value: + anyOf: + - $ref: "#/components/schemas/Decision" + - description: Array of decision objects + items: + $ref: "#/components/schemas/Decision" + type: array + securitySchemes: + ApiKeyAuth: + in: header + name: X-Adzerk-ApiKey + type: apiKey + diff --git a/build.gradle b/build.gradle index 313a210..2b9078e 100644 --- a/build.gradle +++ b/build.gradle @@ -1,137 +1,166 @@ +apply plugin: 'idea' apply plugin: 'eclipse' apply plugin: 'java' +apply plugin: 'com.diffplug.spotless' + +group = 'com.adzerk' +version = '1.0' buildscript { repositories { mavenCentral() } + dependencies { + classpath 'com.android.tools.build:gradle:2.3.+' + classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1' + classpath 'com.diffplug.spotless:spotless-plugin-gradle:6.11.0' + } } -allprojects { - apply plugin: "maven-publish" - apply plugin: "signing" +repositories { + mavenCentral() +} +sourceSets { + main.java.srcDirs = ['src/main/java'] } -publishing { - publications { - mavenJava(MavenPublication) { - from components.java - - artifactId = 'adzerk-decision-sdk' - group = 'com.adzerk' - version = '1.0.0-beta.15' - - pom { - name = 'Adzerk Decision SDK' - description = 'Adzerk Decision SDK' - url = 'https://github.com/adzerk/adzerk-decision-sdk-java' - - licenses { - license { - name = 'The Apache License, Version 2.0' - url = 'http://www.apache.org/licenses/LICENSE-2.0.txt' - } - } - developers { - developer { - id = 'kevel' - name = 'Kevel' - email = 'engineering@kevel.com' - } - } - scm { - connection = 'scm:git:git://github.com/adzerk/adzerk-decision-sdk-java.git' - developerConnection = 'scm:git:ssh://github.com/adzerk/adzerk-decision-sdk-java.git' - url = 'http://github.com/adzerk/adzerk-decision-sdk-java/' - } - } +if(hasProperty('target') && target == 'android') { - signing { - sign publishing.publications.mavenJava - } + apply plugin: 'com.android.library' + apply plugin: 'com.github.dcendents.android-maven' + + android { + compileSdkVersion 25 + buildToolsVersion '25.0.2' + defaultConfig { + minSdkVersion 14 + targetSdkVersion 25 } - } - repositories { - maven { - def releasesRepoUrl = "$buildDir/repos/releases" - def snapshotsRepoUrl = "$buildDir/repos/snapshots" - url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 } - maven { - name = "GitHubPackages" - url = "https://maven.pkg.github.com/adzerk/adzerk-decision-sdk-java" - credentials { - username = System.getenv("GITHUB_ACTOR") - password = System.getenv("GITHUB_TOKEN") + + // Rename the aar correctly + libraryVariants.all { variant -> + variant.outputs.each { output -> + def outputFile = output.outputFile + if (outputFile != null && outputFile.name.endsWith('.aar')) { + def fileName = "${project.name}-${variant.baseName}-${version}.aar" + output.outputFile = new File(outputFile.parent, fileName) + } } } - maven { - name = "ossrh-staging-api" - url = uri(version.endsWith("SNAPSHOT") - ? "https://central.sonatype.com/repository/maven-snapshots/" - : "https://ossrh-staging-api.central.sonatype.com/service/local/staging/deploy/maven2/") - - credentials { - username = System.getenv("NEXUS_USERNAME") ?: findProperty("nexusUsername") - password = System.getenv("NEXUS_PASSWORD") ?: findProperty("nexusPassword") - } + + dependencies { + provided "jakarta.annotation:jakarta.annotation-api:$jakarta_annotation_version" } } -} -jar { - manifest { - attributes( - "Implementation-Title": project.name, - "Implementation-Version": project.version - ) + afterEvaluate { + android.libraryVariants.all { variant -> + def task = project.tasks.create "jar${variant.name.capitalize()}", Jar + task.description = "Create jar artifact for ${variant.name}" + task.dependsOn variant.javaCompile + task.from variant.javaCompile.destinationDirectory + task.destinationDirectory = project.file("${project.buildDir}/outputs/jar") + task.archiveFileName = "${project.name}-${variant.baseName}-${version}.jar" + artifacts.add('archives', task) + } } -} -repositories { - mavenCentral() -} -sourceSets { - main.java.srcDirs = ['src/main/java'] -} + task sourcesJar(type: Jar) { + from android.sourceSets.main.java.srcDirs + classifier = 'sources' + } -sourceCompatibility = JavaVersion.VERSION_1_8 -targetCompatibility = JavaVersion.VERSION_1_8 + artifacts { + archives sourcesJar + } -task execute(type:JavaExec) { - main = System.getProperty('mainClass') - classpath = sourceSets.main.runtimeClasspath -} +} else { -task javadocJar(type: Jar) { - archiveClassifier.set('javadoc') - from javadoc -} + apply plugin: 'java' + apply plugin: 'maven-publish' -task sourcesJar(type: Jar) { - archiveClassifier.set('sources') - from sourceSets.main.allSource + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + + publishing { + publications { + maven(MavenPublication) { + artifactId = 'adzerk-decision-sdk' + from components.java + } + } + } + + task execute(type:JavaExec) { + main = System.getProperty('mainClass') + classpath = sourceSets.main.runtimeClasspath + } } -artifacts { - archives javadocJar, sourcesJar +ext { + jakarta_annotation_version = "1.3.5" } dependencies { - implementation 'io.swagger:swagger-annotations:1.5.22' implementation "com.google.code.findbugs:jsr305:3.0.2" implementation 'com.squareup.okhttp3:okhttp:4.12.0' implementation 'com.squareup.okhttp3:logging-interceptor:4.12.0' - implementation 'com.google.code.gson:gson:2.8.6' - implementation 'io.gsonfire:gson-fire:1.8.4' - implementation 'org.apache.commons:commons-lang3:3.10' - implementation 'org.threeten:threetenbp:1.4.3' - implementation 'javax.annotation:javax.annotation-api:1.3.2' - implementation 'org.slf4j:slf4j-api:2.0.17' - implementation 'org.apache.logging.log4j:log4j-slf4j2-impl:2.20.0' - testImplementation 'junit:junit:4.13.1' + implementation 'com.google.code.gson:gson:2.9.1' + implementation 'io.gsonfire:gson-fire:1.9.0' + implementation 'jakarta.ws.rs:jakarta.ws.rs-api:2.1.6' + implementation 'org.openapitools:jackson-databind-nullable:0.2.6' + implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.17.0' + implementation "jakarta.annotation:jakarta.annotation-api:$jakarta_annotation_version" + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.10.3' + testImplementation 'org.mockito:mockito-core:3.12.4' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.10.3' } javadoc { options.tags = [ "http.response.details:a:Http Response Details" ] } + +// Use spotless plugin to automatically format code, remove unused import, etc +// To apply changes directly to the file, run `gradlew spotlessApply` +// Ref: https://github.com/diffplug/spotless/tree/main/plugin-gradle +spotless { + // comment out below to run spotless as part of the `check` task + enforceCheck false + + format 'misc', { + // define the files (e.g. '*.gradle', '*.md') to apply `misc` to + target '.gitignore' + + // define the steps to apply to those files + trimTrailingWhitespace() + indentWithSpaces() // Takes an integer argument if you don't like 4 + endWithNewline() + } + java { + // don't need to set target, it is inferred from java + + // apply a specific flavor of google-java-format + googleJavaFormat('1.8').aosp().reflowLongStrings() + + removeUnusedImports() + importOrder() + } +} + +test { + // Enable JUnit 5 (Gradle 4.6+). + useJUnitPlatform() + + // Always run tests, even when nothing changed. + dependsOn 'cleanTest' + + // Show test results. + testLogging { + events "passed", "skipped", "failed" + } + +} diff --git a/build.sbt b/build.sbt new file mode 100644 index 0000000..2939a52 --- /dev/null +++ b/build.sbt @@ -0,0 +1,27 @@ +lazy val root = (project in file(".")). + settings( + organization := "com.adzerk", + name := "adzerk-decision-sdk", + version := "1.0", + scalaVersion := "2.11.12", + scalacOptions ++= Seq("-feature"), + compile / javacOptions ++= Seq("-Xlint:deprecation"), + Compile / packageDoc / publishArtifact := false, + resolvers += Resolver.mavenLocal, + libraryDependencies ++= Seq( + "io.swagger" % "swagger-annotations" % "1.6.5", + "com.squareup.okhttp3" % "okhttp" % "4.12.0", + "com.squareup.okhttp3" % "logging-interceptor" % "4.12.0", + "com.google.code.gson" % "gson" % "2.9.1", + "org.apache.commons" % "commons-lang3" % "3.17.0", + "jakarta.ws.rs" % "jakarta.ws.rs-api" % "2.1.6", + "org.openapitools" % "jackson-databind-nullable" % "0.2.6", + "io.gsonfire" % "gson-fire" % "1.9.0" % "compile", + "jakarta.annotation" % "jakarta.annotation-api" % "1.3.5" % "compile", + "com.google.code.findbugs" % "jsr305" % "3.0.2" % "compile", + "jakarta.annotation" % "jakarta.annotation-api" % "1.3.5" % "compile", + "org.junit.jupiter" % "junit-jupiter-api" % "5.10.3" % "test", + "com.novocode" % "junit-interface" % "0.10" % "test", + "org.mockito" % "mockito-core" % "3.12.4" % "test" + ) + ) diff --git a/docs/ConsentRequest.md b/docs/ConsentRequest.md index 115bd5a..d23dbd6 100644 --- a/docs/ConsentRequest.md +++ b/docs/ConsentRequest.md @@ -5,10 +5,10 @@ ## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**userKey** | **String** | | [optional] -**consent** | **Object** | | [optional] +| Name | Type | Description | Notes | +|------------ | ------------- | ------------- | -------------| +|**userKey** | **String** | | [optional] | +|**consent** | **Object** | | [optional] | ## Implemented Interfaces diff --git a/docs/Content.md b/docs/Content.md index 2251abe..d9eb782 100644 --- a/docs/Content.md +++ b/docs/Content.md @@ -5,13 +5,13 @@ ## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**type** | **String** | | [optional] -**template** | **String** | | [optional] -**customTemplate** | **String** | | [optional] -**data** | **Object** | | [optional] -**body** | **String** | | [optional] +| Name | Type | Description | Notes | +|------------ | ------------- | ------------- | -------------| +|**type** | **String** | | [optional] | +|**template** | **String** | | [optional] | +|**customTemplate** | **String** | | [optional] | +|**data** | **Object** | | [optional] | +|**body** | **String** | | [optional] | ## Implemented Interfaces diff --git a/docs/Decision.md b/docs/Decision.md index aeff408..d6ab7d6 100644 --- a/docs/Decision.md +++ b/docs/Decision.md @@ -5,20 +5,20 @@ ## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**adId** | **Integer** | | [optional] -**advertiserId** | **Integer** | | [optional] -**creativeId** | **Integer** | | [optional] -**flightId** | **Integer** | | [optional] -**campaignId** | **Integer** | | [optional] -**priorityId** | **Integer** | | [optional] -**clickUrl** | **URI** | | [optional] -**contents** | [**List<Content>**](Content.md) | | [optional] -**impressionUrl** | **URI** | | [optional] -**events** | [**List<Event>**](Event.md) | | [optional] -**matchedPoints** | [**List<MatchedPoint>**](MatchedPoint.md) | | [optional] -**pricing** | [**PricingData**](PricingData.md) | | [optional] +| Name | Type | Description | Notes | +|------------ | ------------- | ------------- | -------------| +|**adId** | **Integer** | | [optional] | +|**advertiserId** | **Integer** | | [optional] | +|**creativeId** | **Integer** | | [optional] | +|**flightId** | **Integer** | | [optional] | +|**campaignId** | **Integer** | | [optional] | +|**priorityId** | **Integer** | | [optional] | +|**clickUrl** | **URI** | | [optional] | +|**contents** | [**List<Content>**](Content.md) | | [optional] | +|**impressionUrl** | **URI** | | [optional] | +|**events** | [**List<Event>**](Event.md) | | [optional] | +|**matchedPoints** | [**List<MatchedPoint>**](MatchedPoint.md) | | [optional] | +|**pricing** | [**PricingData**](PricingData.md) | | [optional] | ## Implemented Interfaces diff --git a/docs/DecisionApi.md b/docs/DecisionApi.md index ed104e5..5b0b4d7 100644 --- a/docs/DecisionApi.md +++ b/docs/DecisionApi.md @@ -2,12 +2,12 @@ All URIs are relative to *https://e-23.adzerk.net* -Method | HTTP request | Description -------------- | ------------- | ------------- -[**getDecisions**](DecisionApi.md#getDecisions) | **POST** /api/v2 | +| Method | HTTP request | Description | +|------------- | ------------- | -------------| +| [**getDecisions**](DecisionApi.md#getDecisions) | **POST** /api/v2 | | - + # **getDecisions** > DecisionResponse getDecisions(decisionRequest) @@ -47,9 +47,9 @@ public class Example { ### Parameters -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **decisionRequest** | [**DecisionRequest**](DecisionRequest.md)| | [optional] +| Name | Type | Description | Notes | +|------------- | ------------- | ------------- | -------------| +| **decisionRequest** | [**DecisionRequest**](DecisionRequest.md)| | [optional] | ### Return type @@ -67,6 +67,6 @@ No authorization required ### HTTP response details | Status code | Description | Response headers | |-------------|-------------|------------------| -**400** | Bad Request | - | -**200** | Successful decision request | - | +| **400** | Bad Request | - | +| **200** | Successful decision request | - | diff --git a/docs/DecisionRequest.md b/docs/DecisionRequest.md index 75a6d5e..e2a7569 100644 --- a/docs/DecisionRequest.md +++ b/docs/DecisionRequest.md @@ -5,27 +5,27 @@ ## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**placements** | [**List<Placement>**](Placement.md) | One or more Placement objects | -**user** | [**User**](User.md) | | [optional] -**keywords** | **List<String>** | Keywords for keyword Targeting. Such as `\"keywords\": [\"foo\", \"bar\", \"baz\"]`. | [optional] -**url** | **String** | The current page URL | [optional] -**referrer** | **String** | The referrer URL | [optional] -**ip** | **String** | The IP address. Required for [Geo-Targeting](https://dev.adzerk.com/docs/geo-location) | [optional] -**blockedCreatives** | **List<Integer>** | Numeric creative ids to disregard for ad selection | [optional] -**isMobile** | **Boolean** | If true, only ads containing a single image will be returned | [optional] -**includePricingData** | **Boolean** | If true, return pricing data for the decision in the response | [optional] -**notrack** | **Boolean** | If true, only return ads that are set to honor Do Not Track | [optional] -**enableBotFiltering** | **Boolean** | If making a client-side request, set to true. Defaults to false to ensure a server isn't seen as a bot. See [here](https://dev.adzerk.com/docs/tracking-overview#section-bot-filtering) for more info | [optional] -**enableUserDBIP** | **Boolean** | If true, override the IP address of the request with the IP address supplied on the UserKey. If no IP address is found on the UserKey, this will fall back to the IP address on the request. Requires UserDB | [optional] -**consent** | **Object** | Object that sets the data consent preferences. Other consent settings are available in the GDPR settings documentation. | [optional] -**deviceID** | **String** | RTB requests only - sets an Identifier for Advertisers (IFA or IDFA) | [optional] -**parallel** | **Boolean** | | [optional] -**intendedLatitude** | **Float** | | [optional] -**intendedLongitude** | **Float** | | [optional] -**radius** | **Float** | | [optional] -**includeMatchedPoints** | **Boolean** | | [optional] +| Name | Type | Description | Notes | +|------------ | ------------- | ------------- | -------------| +|**placements** | [**List<Placement>**](Placement.md) | One or more Placement objects | | +|**user** | [**User**](User.md) | | [optional] | +|**keywords** | **List<String>** | Keywords for keyword Targeting. Such as `\"keywords\": [\"foo\", \"bar\", \"baz\"]`. | [optional] | +|**url** | **String** | The current page URL | [optional] | +|**referrer** | **String** | The referrer URL | [optional] | +|**ip** | **String** | The IP address. Required for [Geo-Targeting](https://dev.adzerk.com/docs/geo-location) | [optional] | +|**blockedCreatives** | **List<Integer>** | Numeric creative ids to disregard for ad selection | [optional] | +|**isMobile** | **Boolean** | If true, only ads containing a single image will be returned | [optional] | +|**includePricingData** | **Boolean** | If true, return pricing data for the decision in the response | [optional] | +|**notrack** | **Boolean** | If true, only return ads that are set to honor Do Not Track | [optional] | +|**enableBotFiltering** | **Boolean** | If making a client-side request, set to true. Defaults to false to ensure a server isn't seen as a bot. See [here](https://dev.adzerk.com/docs/tracking-overview#section-bot-filtering) for more info | [optional] | +|**enableUserDBIP** | **Boolean** | If true, override the IP address of the request with the IP address supplied on the UserKey. If no IP address is found on the UserKey, this will fall back to the IP address on the request. Requires UserDB | [optional] | +|**consent** | **Object** | Object that sets the data consent preferences. Other consent settings are available in the GDPR settings documentation. | [optional] | +|**deviceID** | **String** | RTB requests only - sets an Identifier for Advertisers (IFA or IDFA) | [optional] | +|**parallel** | **Boolean** | | [optional] | +|**intendedLatitude** | **Float** | | [optional] | +|**intendedLongitude** | **Float** | | [optional] | +|**radius** | **Float** | | [optional] | +|**includeMatchedPoints** | **Boolean** | | [optional] | ## Implemented Interfaces diff --git a/docs/DecisionResponse.md b/docs/DecisionResponse.md index dc693ed..e4f9e74 100644 --- a/docs/DecisionResponse.md +++ b/docs/DecisionResponse.md @@ -5,11 +5,11 @@ ## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**user** | [**User**](User.md) | | [optional] -**decisions** | [**Map<String, Decision>**](Decision.md) | | [optional] -**explain** | **Object** | | [optional] +| Name | Type | Description | Notes | +|------------ | ------------- | ------------- | -------------| +|**user** | [**User**](User.md) | | [optional] | +|**decisions** | [**Map<String, DecisionResponseDecisionsValue>**](DecisionResponseDecisionsValue.md) | Single decision format with dynamic string key | [optional] | +|**explain** | **Object** | | [optional] | ## Implemented Interfaces diff --git a/docs/DecisionResponseDecisionsValue.md b/docs/DecisionResponseDecisionsValue.md new file mode 100644 index 0000000..fd412ec --- /dev/null +++ b/docs/DecisionResponseDecisionsValue.md @@ -0,0 +1,28 @@ + + +# DecisionResponseDecisionsValue + + +## Properties + +| Name | Type | Description | Notes | +|------------ | ------------- | ------------- | -------------| +|**adId** | **Integer** | | [optional] | +|**advertiserId** | **Integer** | | [optional] | +|**creativeId** | **Integer** | | [optional] | +|**flightId** | **Integer** | | [optional] | +|**campaignId** | **Integer** | | [optional] | +|**priorityId** | **Integer** | | [optional] | +|**clickUrl** | **URI** | | [optional] | +|**contents** | [**List<Content>**](Content.md) | | [optional] | +|**impressionUrl** | **URI** | | [optional] | +|**events** | [**List<Event>**](Event.md) | | [optional] | +|**matchedPoints** | [**List<MatchedPoint>**](MatchedPoint.md) | | [optional] | +|**pricing** | [**PricingData**](PricingData.md) | | [optional] | + + +## Implemented Interfaces + +* Serializable + + diff --git a/docs/Event.md b/docs/Event.md index 95c313a..a3cd0ac 100644 --- a/docs/Event.md +++ b/docs/Event.md @@ -5,10 +5,10 @@ ## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**id** | **Integer** | | [optional] -**url** | **URI** | | [optional] +| Name | Type | Description | Notes | +|------------ | ------------- | ------------- | -------------| +|**id** | **Integer** | | [optional] | +|**url** | **URI** | | [optional] | ## Implemented Interfaces diff --git a/docs/MatchedPoint.md b/docs/MatchedPoint.md index bb4551a..6b94c2c 100644 --- a/docs/MatchedPoint.md +++ b/docs/MatchedPoint.md @@ -5,10 +5,10 @@ ## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**lat** | **String** | | [optional] -**lon** | **String** | | [optional] +| Name | Type | Description | Notes | +|------------ | ------------- | ------------- | -------------| +|**lat** | **String** | | [optional] | +|**lon** | **String** | | [optional] | ## Implemented Interfaces diff --git a/docs/Placement.md b/docs/Placement.md index 94593e8..3d6bd5e 100644 --- a/docs/Placement.md +++ b/docs/Placement.md @@ -5,31 +5,31 @@ ## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**divName** | **String** | A unique name for the placement defined by you | [optional] -**networkId** | **Integer** | The numeric network id | [optional] -**siteId** | **Integer** | The numeric site id | [optional] -**adTypes** | **List<Integer>** | One or more integer ad types. More info [here](https://dev.adzerk.com/docs/ad-sizes) | [optional] -**zoneIds** | **List<Integer>** | Zone IDs to use | [optional] -**campaignId** | **Integer** | A numeric campaign id; if specified, only consider ads in that campaign | [optional] -**flightId** | **Integer** | A numeric ad (flight-creative map) id; if specified, only serve that ad if possible | [optional] -**adId** | **Integer** | A numeric ad (flight-creative map) id; if specified, only serve that ad if possible | [optional] -**clickUrl** | **String** | The ad's click-through URL | [optional] -**properties** | **Object** | A map of key/value pairs used for [Custom Targeting](https://dev.adzerk.com/docs/custom-targeting) | [optional] -**eventIds** | **List<Integer>** | An array of numeric event types. Requests tracking URLs for custom events. See here for [Event Tracking IDs](https://dev.adzerk.com/v1.0/docs/custom-event-tracking) | [optional] -**overrides** | **Object** | An object that overrides values for an advertiser, campaign, flight or ad. Used especially for header bidding | [optional] -**contentKeys** | **Map<String, String>** | A map of key/value pairs used with [ContentDB](https://dev.adzerk.com/docs/contentdb-1). The format is `\"contentKeys\": {\"schema\": \"contentKey\"}` | [optional] -**count** | **Integer** | (BETA) The number of ads to return per placement. Integer between 1 and 20 | [optional] -**proportionality** | **Boolean** | (BETA) If true, fills ads in a multi-winner placement in proportion to the flight's goals | [optional] -**ecpmPartition** | **String** | (BETA) The name of the eCPM Partition that should be used to source eCPM data for auctions | [optional] -**ecpmPartitions** | **List<String>** | (BETA) The names of the eCPM Partitions that should be used to source eCPM data for auctions | [optional] -**eventMultiplier** | **Integer** | | [optional] -**skipSelection** | **Boolean** | | [optional] -**adQuery** | **Object** | | [optional] -**floorPrice** | **Float** | | [optional] -**floorCpc** | **Float** | | [optional] -**skipFilters** | [**SkipFilters**](SkipFilters.md) | | [optional] +| Name | Type | Description | Notes | +|------------ | ------------- | ------------- | -------------| +|**divName** | **String** | A unique name for the placement defined by you | [optional] | +|**networkId** | **Integer** | The numeric network id | [optional] | +|**siteId** | **Integer** | The numeric site id | [optional] | +|**adTypes** | **List<Integer>** | One or more integer ad types. More info [here](https://dev.adzerk.com/docs/ad-sizes) | [optional] | +|**zoneIds** | **List<Integer>** | Zone IDs to use | [optional] | +|**campaignId** | **Integer** | A numeric campaign id; if specified, only consider ads in that campaign | [optional] | +|**flightId** | **Integer** | A numeric ad (flight-creative map) id; if specified, only serve that ad if possible | [optional] | +|**adId** | **Integer** | A numeric ad (flight-creative map) id; if specified, only serve that ad if possible | [optional] | +|**clickUrl** | **String** | The ad's click-through URL | [optional] | +|**properties** | **Object** | A map of key/value pairs used for [Custom Targeting](https://dev.adzerk.com/docs/custom-targeting) | [optional] | +|**eventIds** | **List<Integer>** | An array of numeric event types. Requests tracking URLs for custom events. See here for [Event Tracking IDs](https://dev.adzerk.com/v1.0/docs/custom-event-tracking) | [optional] | +|**overrides** | **Object** | An object that overrides values for an advertiser, campaign, flight or ad. Used especially for header bidding | [optional] | +|**contentKeys** | **Map<String, String>** | A map of key/value pairs used with [ContentDB](https://dev.adzerk.com/docs/contentdb-1). The format is `\"contentKeys\": {\"schema\": \"contentKey\"}` | [optional] | +|**count** | **Integer** | (BETA) The number of ads to return per placement. Integer between 1 and 20 | [optional] | +|**proportionality** | **Boolean** | (BETA) If true, fills ads in a multi-winner placement in proportion to the flight's goals | [optional] | +|**ecpmPartition** | **String** | (BETA) The name of the eCPM Partition that should be used to source eCPM data for auctions | [optional] | +|**ecpmPartitions** | **List<String>** | (BETA) The names of the eCPM Partitions that should be used to source eCPM data for auctions | [optional] | +|**eventMultiplier** | **Integer** | | [optional] | +|**skipSelection** | **Boolean** | | [optional] | +|**adQuery** | **Object** | | [optional] | +|**floorPrice** | **Float** | | [optional] | +|**floorCpc** | **Float** | | [optional] | +|**skipFilters** | [**SkipFilters**](SkipFilters.md) | | [optional] | ## Implemented Interfaces diff --git a/docs/PricingData.md b/docs/PricingData.md index c0fe362..70ba05a 100644 --- a/docs/PricingData.md +++ b/docs/PricingData.md @@ -5,13 +5,13 @@ ## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**price** | **Float** | | [optional] -**clearPrice** | **Float** | | [optional] -**revenue** | **Float** | | [optional] -**rateType** | **Integer** | | [optional] -**eCPM** | **Float** | | [optional] +| Name | Type | Description | Notes | +|------------ | ------------- | ------------- | -------------| +|**price** | **Float** | | [optional] | +|**clearPrice** | **Float** | | [optional] | +|**revenue** | **Float** | | [optional] | +|**rateType** | **Integer** | | [optional] | +|**eCPM** | **Float** | | [optional] | ## Implemented Interfaces diff --git a/docs/SkipFilters.md b/docs/SkipFilters.md index f799300..9626ee1 100644 --- a/docs/SkipFilters.md +++ b/docs/SkipFilters.md @@ -5,16 +5,16 @@ ## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**distance** | **Boolean** | Geodistance filter, which skips geodistance targeting if true. | [optional] -**facet** | **Boolean** | Facet targeting filter, which skips facet targeting if true. | [optional] -**geodistance** | **Boolean** | Geodistance filter, which skips geodistance targeting if true. | [optional] -**geolocation** | **Boolean** | Geolocation filter, which skips location targeting if true. | [optional] -**keyword** | **Boolean** | Keyword limit filter, which skips all (ad and/or flight) keyword targeting if true. | [optional] -**location** | **Boolean** | Geolocation filter, which skips location targeting if true. | [optional] -**placementLimit** | **Boolean** | Placement limit filter, where no advertiser placement limit if true. | [optional] -**siteZone** | **Boolean** | Site/zone limit filter, which skips site/zone targeting if true. | [optional] +| Name | Type | Description | Notes | +|------------ | ------------- | ------------- | -------------| +|**distance** | **Boolean** | Geodistance filter, which skips geodistance targeting if true. | [optional] | +|**facet** | **Boolean** | Facet targeting filter, which skips facet targeting if true. | [optional] | +|**geodistance** | **Boolean** | Geodistance filter, which skips geodistance targeting if true. | [optional] | +|**geolocation** | **Boolean** | Geolocation filter, which skips location targeting if true. | [optional] | +|**keyword** | **Boolean** | Keyword limit filter, which skips all (ad and/or flight) keyword targeting if true. | [optional] | +|**location** | **Boolean** | Geolocation filter, which skips location targeting if true. | [optional] | +|**placementLimit** | **Boolean** | Placement limit filter, where no advertiser placement limit if true. | [optional] | +|**siteZone** | **Boolean** | Site/zone limit filter, which skips site/zone targeting if true. | [optional] | ## Implemented Interfaces diff --git a/docs/User.md b/docs/User.md index 0a5ae31..dc1c829 100644 --- a/docs/User.md +++ b/docs/User.md @@ -6,9 +6,9 @@ Object containing the UserKey used for [UserDB targeting](https://dev.adzerk.com ## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**key** | **String** | The UserKey used for UserDB Targeting | [optional] +| Name | Type | Description | Notes | +|------------ | ------------- | ------------- | -------------| +|**key** | **String** | The UserKey used for UserDB Targeting | [optional] | ## Implemented Interfaces diff --git a/docs/UserdbApi.md b/docs/UserdbApi.md index 34cb3cb..fb976d4 100644 --- a/docs/UserdbApi.md +++ b/docs/UserdbApi.md @@ -2,20 +2,20 @@ All URIs are relative to *https://e-23.adzerk.net* -Method | HTTP request | Description -------------- | ------------- | ------------- -[**addCustomProperties**](UserdbApi.md#addCustomProperties) | **POST** /udb/{networkId}/custom | -[**addInterests**](UserdbApi.md#addInterests) | **GET** /udb/{networkId}/interest/i.gif | -[**addRetargetingSegment**](UserdbApi.md#addRetargetingSegment) | **GET** /udb/{networkId}/rt/{advertiserId}/{retargetingSegmentId}/i.gif | -[**forget**](UserdbApi.md#forget) | **DELETE** /udb/{networkId} | -[**gdprConsent**](UserdbApi.md#gdprConsent) | **POST** /udb/{networkId}/consent | -[**ipOverride**](UserdbApi.md#ipOverride) | **GET** /udb/{networkId}/ip/i.gif | -[**matchUser**](UserdbApi.md#matchUser) | **GET** /udb/{networkId}/sync/i.gif | -[**optOut**](UserdbApi.md#optOut) | **GET** /udb/{networkId}/optout/i.gif | -[**read**](UserdbApi.md#read) | **GET** /udb/{networkId}/read | - - - +| Method | HTTP request | Description | +|------------- | ------------- | -------------| +| [**addCustomProperties**](UserdbApi.md#addCustomProperties) | **POST** /udb/{networkId}/custom | | +| [**addInterests**](UserdbApi.md#addInterests) | **GET** /udb/{networkId}/interest/i.gif | | +| [**addRetargetingSegment**](UserdbApi.md#addRetargetingSegment) | **GET** /udb/{networkId}/rt/{advertiserId}/{retargetingSegmentId}/i.gif | | +| [**forget**](UserdbApi.md#forget) | **DELETE** /udb/{networkId} | | +| [**gdprConsent**](UserdbApi.md#gdprConsent) | **POST** /udb/{networkId}/consent | | +| [**ipOverride**](UserdbApi.md#ipOverride) | **GET** /udb/{networkId}/ip/i.gif | | +| [**matchUser**](UserdbApi.md#matchUser) | **GET** /udb/{networkId}/sync/i.gif | | +| [**optOut**](UserdbApi.md#optOut) | **GET** /udb/{networkId}/optout/i.gif | | +| [**read**](UserdbApi.md#read) | **GET** /udb/{networkId}/read | | + + + # **addCustomProperties** > File addCustomProperties(networkId, userKey, body) @@ -64,11 +64,11 @@ public class Example { ### Parameters -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **networkId** | **Integer**| Your Network Id | - **userKey** | **String**| The User's UserDB Key | - **body** | **Object**| | [optional] +| Name | Type | Description | Notes | +|------------- | ------------- | ------------- | -------------| +| **networkId** | **Integer**| Your Network Id | | +| **userKey** | **String**| The User's UserDB Key | | +| **body** | **Object**| | [optional] | ### Return type @@ -86,9 +86,9 @@ Name | Type | Description | Notes ### HTTP response details | Status code | Description | Response headers | |-------------|-------------|------------------| -**200** | Success | - | +| **200** | Success | - | - + # **addInterests** > File addInterests(networkId, userKey, interest) @@ -130,11 +130,11 @@ public class Example { ### Parameters -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **networkId** | **Integer**| Your Network Id | - **userKey** | **String**| The User's UserDB Key | - **interest** | **String**| Comma Seperated list of interests | +| Name | Type | Description | Notes | +|------------- | ------------- | ------------- | -------------| +| **networkId** | **Integer**| Your Network Id | | +| **userKey** | **String**| The User's UserDB Key | | +| **interest** | **String**| Comma Seperated list of interests | | ### Return type @@ -152,9 +152,9 @@ No authorization required ### HTTP response details | Status code | Description | Response headers | |-------------|-------------|------------------| -**200** | Success | - | +| **200** | Success | - | - + # **addRetargetingSegment** > File addRetargetingSegment(networkId, advertiserId, retargetingSegmentId, userKey) @@ -197,12 +197,12 @@ public class Example { ### Parameters -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **networkId** | **Integer**| Your Network Id | - **advertiserId** | **Integer**| The Advertiser's ID | - **retargetingSegmentId** | **Integer**| The Segment's ID | - **userKey** | **String**| The User's UserDB Key | +| Name | Type | Description | Notes | +|------------- | ------------- | ------------- | -------------| +| **networkId** | **Integer**| Your Network Id | | +| **advertiserId** | **Integer**| The Advertiser's ID | | +| **retargetingSegmentId** | **Integer**| The Segment's ID | | +| **userKey** | **String**| The User's UserDB Key | | ### Return type @@ -220,9 +220,9 @@ No authorization required ### HTTP response details | Status code | Description | Response headers | |-------------|-------------|------------------| -**200** | Success | - | +| **200** | Success | - | - + # **forget** > forget(networkId, userKey) @@ -269,10 +269,10 @@ public class Example { ### Parameters -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **networkId** | **Integer**| Your Network Id | - **userKey** | **String**| The User's UserDB Key | +| Name | Type | Description | Notes | +|------------- | ------------- | ------------- | -------------| +| **networkId** | **Integer**| Your Network Id | | +| **userKey** | **String**| The User's UserDB Key | | ### Return type @@ -290,9 +290,9 @@ null (empty response body) ### HTTP response details | Status code | Description | Response headers | |-------------|-------------|------------------| -**200** | Success | - | +| **200** | Success | - | - + # **gdprConsent** > File gdprConsent(networkId, consentRequest) @@ -340,10 +340,10 @@ public class Example { ### Parameters -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **networkId** | **Integer**| Your Network Id | - **consentRequest** | [**ConsentRequest**](ConsentRequest.md)| | [optional] +| Name | Type | Description | Notes | +|------------- | ------------- | ------------- | -------------| +| **networkId** | **Integer**| Your Network Id | | +| **consentRequest** | [**ConsentRequest**](ConsentRequest.md)| | [optional] | ### Return type @@ -361,9 +361,9 @@ Name | Type | Description | Notes ### HTTP response details | Status code | Description | Response headers | |-------------|-------------|------------------| -**200** | Success | - | +| **200** | Success | - | - + # **ipOverride** > File ipOverride(networkId, userKey, ip) @@ -405,11 +405,11 @@ public class Example { ### Parameters -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **networkId** | **Integer**| Your Network Id | - **userKey** | **String**| The User's UserDB Key | - **ip** | **String**| This is the IP to exclude | +| Name | Type | Description | Notes | +|------------- | ------------- | ------------- | -------------| +| **networkId** | **Integer**| Your Network Id | | +| **userKey** | **String**| The User's UserDB Key | | +| **ip** | **String**| This is the IP to exclude | | ### Return type @@ -427,9 +427,9 @@ No authorization required ### HTTP response details | Status code | Description | Response headers | |-------------|-------------|------------------| -**200** | The updated UserDB record | - | +| **200** | The updated UserDB record | - | - + # **matchUser** > File matchUser(networkId, userKey, partnerId, userId) @@ -472,12 +472,12 @@ public class Example { ### Parameters -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **networkId** | **Integer**| Your Network Id | - **userKey** | **String**| The User's UserDB Key | - **partnerId** | **Integer**| The ID of the RTB provider in Adzerk. Contact Support if you don't have the ID. | - **userId** | **Integer**| This is the UserID the individual RTB provider has of the user. This is NOT the UserDB userkey. | +| Name | Type | Description | Notes | +|------------- | ------------- | ------------- | -------------| +| **networkId** | **Integer**| Your Network Id | | +| **userKey** | **String**| The User's UserDB Key | | +| **partnerId** | **Integer**| The ID of the RTB provider in Adzerk. Contact Support if you don't have the ID. | | +| **userId** | **Integer**| This is the UserID the individual RTB provider has of the user. This is NOT the UserDB userkey. | | ### Return type @@ -495,9 +495,9 @@ No authorization required ### HTTP response details | Status code | Description | Response headers | |-------------|-------------|------------------| -**200** | Success | - | +| **200** | Success | - | - + # **optOut** > File optOut(networkId, userKey) @@ -538,10 +538,10 @@ public class Example { ### Parameters -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **networkId** | **Integer**| Your Network Id | - **userKey** | **String**| The User's UserDB Key | +| Name | Type | Description | Notes | +|------------- | ------------- | ------------- | -------------| +| **networkId** | **Integer**| Your Network Id | | +| **userKey** | **String**| The User's UserDB Key | | ### Return type @@ -559,9 +559,9 @@ No authorization required ### HTTP response details | Status code | Description | Response headers | |-------------|-------------|------------------| -**200** | Sucess | - | +| **200** | Sucess | - | - + # **read** > Object read(networkId, userKey) @@ -602,10 +602,10 @@ public class Example { ### Parameters -Name | Type | Description | Notes -------------- | ------------- | ------------- | ------------- - **networkId** | **Integer**| Your Network Id | - **userKey** | **String**| The User's UserDB Key | +| Name | Type | Description | Notes | +|------------- | ------------- | ------------- | -------------| +| **networkId** | **Integer**| Your Network Id | | +| **userKey** | **String**| The User's UserDB Key | | ### Return type @@ -623,5 +623,5 @@ No authorization required ### HTTP response details | Status code | Description | Response headers | |-------------|-------------|------------------| -**200** | The UserDB record | - | +| **200** | The UserDB record | - | diff --git a/git_push.sh b/git_push.sh index ced3be2..f53a75d 100644 --- a/git_push.sh +++ b/git_push.sh @@ -1,7 +1,7 @@ #!/bin/sh # ref: https://help.github.com/articles/adding-an-existing-project-to-github-using-the-command-line/ # -# Usage example: /bin/sh ./git_push.sh wing328 openapi-pestore-perl "minor update" "gitlab.com" +# Usage example: /bin/sh ./git_push.sh wing328 openapi-petstore-perl "minor update" "gitlab.com" git_user_id=$1 git_repo_id=$2 @@ -38,14 +38,14 @@ git add . git commit -m "$release_note" # Sets the new remote -git_remote=`git remote` +git_remote=$(git remote) if [ "$git_remote" = "" ]; then # git remote not defined if [ "$GIT_TOKEN" = "" ]; then echo "[INFO] \$GIT_TOKEN (environment variable) is not set. Using the git credential in your environment." git remote add origin https://${git_host}/${git_user_id}/${git_repo_id}.git else - git remote add origin https://${git_user_id}:${GIT_TOKEN}@${git_host}/${git_user_id}/${git_repo_id}.git + git remote add origin https://${git_user_id}:"${GIT_TOKEN}"@${git_host}/${git_user_id}/${git_repo_id}.git fi fi @@ -55,4 +55,3 @@ git pull origin master # Pushes (Forces) the changes in the local repository up to the remote repository echo "Git pushing to https://${git_host}/${git_user_id}/${git_repo_id}.git" git push origin master 2>&1 | grep -v 'To https' - diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 7454180f2ae8848c63b8b4dea2cb829da983f2fa..e6441136f3d4ba8a0da8d277868979cfbc8ad796 100644 GIT binary patch literal 43453 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 yu?e%!_ptzGB|8GrCfu%p?(_ zQccdaaVK$5bz;*rnyK{_SQYM>;aES6Qs^lj9lEs6_J+%nIiuQC*fN;z8md>r_~Mfl zU%p5Dt_YT>gQqfr@`cR!$NWr~+`CZb%dn;WtzrAOI>P_JtsB76PYe*<%H(y>qx-`Kq!X_; z<{RpAqYhE=L1r*M)gNF3B8r(<%8mo*SR2hu zccLRZwGARt)Hlo1euqTyM>^!HK*!Q2P;4UYrysje@;(<|$&%vQekbn|0Ruu_Io(w4#%p6ld2Yp7tlA`Y$cciThP zKzNGIMPXX%&Ud0uQh!uQZz|FB`4KGD?3!ND?wQt6!n*f4EmCoJUh&b?;B{|lxs#F- z31~HQ`SF4x$&v00@(P+j1pAaj5!s`)b2RDBp*PB=2IB>oBF!*6vwr7Dp%zpAx*dPr zb@Zjq^XjN?O4QcZ*O+8>)|HlrR>oD*?WQl5ri3R#2?*W6iJ>>kH%KnnME&TT@ZzrHS$Q%LC?n|e>V+D+8D zYc4)QddFz7I8#}y#Wj6>4P%34dZH~OUDb?uP%-E zwjXM(?Sg~1!|wI(RVuxbu)-rH+O=igSho_pDCw(c6b=P zKk4ATlB?bj9+HHlh<_!&z0rx13K3ZrAR8W)!@Y}o`?a*JJsD+twZIv`W)@Y?Amu_u zz``@-e2X}27$i(2=9rvIu5uTUOVhzwu%mNazS|lZb&PT;XE2|B&W1>=B58#*!~D&) zfVmJGg8UdP*fx(>Cj^?yS^zH#o-$Q-*$SnK(ZVFkw+er=>N^7!)FtP3y~Xxnu^nzY zikgB>Nj0%;WOltWIob|}%lo?_C7<``a5hEkx&1ku$|)i>Rh6@3h*`slY=9U}(Ql_< zaNG*J8vb&@zpdhAvv`?{=zDedJ23TD&Zg__snRAH4eh~^oawdYi6A3w8<Ozh@Kw)#bdktM^GVb zrG08?0bG?|NG+w^&JvD*7LAbjED{_Zkc`3H!My>0u5Q}m!+6VokMLXxl`Mkd=g&Xx z-a>m*#G3SLlhbKB!)tnzfWOBV;u;ftU}S!NdD5+YtOjLg?X}dl>7m^gOpihrf1;PY zvll&>dIuUGs{Qnd- zwIR3oIrct8Va^Tm0t#(bJD7c$Z7DO9*7NnRZorrSm`b`cxz>OIC;jSE3DO8`hX955ui`s%||YQtt2 z5DNA&pG-V+4oI2s*x^>-$6J?p=I>C|9wZF8z;VjR??Icg?1w2v5Me+FgAeGGa8(3S z4vg*$>zC-WIVZtJ7}o9{D-7d>zCe|z#<9>CFve-OPAYsneTb^JH!Enaza#j}^mXy1 z+ULn^10+rWLF6j2>Ya@@Kq?26>AqK{A_| zQKb*~F1>sE*=d?A?W7N2j?L09_7n+HGi{VY;MoTGr_)G9)ot$p!-UY5zZ2Xtbm=t z@dpPSGwgH=QtIcEulQNI>S-#ifbnO5EWkI;$A|pxJd885oM+ zGZ0_0gDvG8q2xebj+fbCHYfAXuZStH2j~|d^sBAzo46(K8n59+T6rzBwK)^rfPT+B zyIFw)9YC-V^rhtK`!3jrhmW-sTmM+tPH+;nwjL#-SjQPUZ53L@A>y*rt(#M(qsiB2 zx6B)dI}6Wlsw%bJ8h|(lhkJVogQZA&n{?Vgs6gNSXzuZpEyu*xySy8ro07QZ7Vk1!3tJphN_5V7qOiyK8p z#@jcDD8nmtYi1^l8ml;AF<#IPK?!pqf9D4moYk>d99Im}Jtwj6c#+A;f)CQ*f-hZ< z=p_T86jog%!p)D&5g9taSwYi&eP z#JuEK%+NULWus;0w32-SYFku#i}d~+{Pkho&^{;RxzP&0!RCm3-9K6`>KZpnzS6?L z^H^V*s!8<>x8bomvD%rh>Zp3>Db%kyin;qtl+jAv8Oo~1g~mqGAC&Qi_wy|xEt2iz zWAJEfTV%cl2Cs<1L&DLRVVH05EDq`pH7Oh7sR`NNkL%wi}8n>IXcO40hp+J+sC!W?!krJf!GJNE8uj zg-y~Ns-<~D?yqbzVRB}G>0A^f0!^N7l=$m0OdZuqAOQqLc zX?AEGr1Ht+inZ-Qiwnl@Z0qukd__a!C*CKuGdy5#nD7VUBM^6OCpxCa2A(X;e0&V4 zM&WR8+wErQ7UIc6LY~Q9x%Sn*Tn>>P`^t&idaOEnOd(Ufw#>NoR^1QdhJ8s`h^|R_ zXX`c5*O~Xdvh%q;7L!_!ohf$NfEBmCde|#uVZvEo>OfEq%+Ns7&_f$OR9xsihRpBb z+cjk8LyDm@U{YN>+r46?nn{7Gh(;WhFw6GAxtcKD+YWV?uge>;+q#Xx4!GpRkVZYu zzsF}1)7$?%s9g9CH=Zs+B%M_)+~*j3L0&Q9u7!|+T`^O{xE6qvAP?XWv9_MrZKdo& z%IyU)$Q95AB4!#hT!_dA>4e@zjOBD*Y=XjtMm)V|+IXzjuM;(l+8aA5#Kaz_$rR6! zj>#&^DidYD$nUY(D$mH`9eb|dtV0b{S>H6FBfq>t5`;OxA4Nn{J(+XihF(stSche7$es&~N$epi&PDM_N`As;*9D^L==2Q7Z2zD+CiU(|+-kL*VG+&9!Yb3LgPy?A zm7Z&^qRG_JIxK7-FBzZI3Q<;{`DIxtc48k> zc|0dmX;Z=W$+)qE)~`yn6MdoJ4co;%!`ddy+FV538Y)j(vg}5*k(WK)KWZ3WaOG!8 z!syGn=s{H$odtpqFrT#JGM*utN7B((abXnpDM6w56nhw}OY}0TiTG1#f*VFZr+^-g zbP10`$LPq_;PvrA1XXlyx2uM^mrjTzX}w{yuLo-cOClE8MMk47T25G8M!9Z5ypOSV zAJUBGEg5L2fY)ZGJb^E34R2zJ?}Vf>{~gB!8=5Z) z9y$>5c)=;o0HeHHSuE4U)#vG&KF|I%-cF6f$~pdYJWk_dD}iOA>iA$O$+4%@>JU08 zS`ep)$XLPJ+n0_i@PkF#ri6T8?ZeAot$6JIYHm&P6EB=BiaNY|aA$W0I+nz*zkz_z zkEru!tj!QUffq%)8y0y`T&`fuus-1p>=^hnBiBqD^hXrPs`PY9tU3m0np~rISY09> z`P3s=-kt_cYcxWd{de@}TwSqg*xVhp;E9zCsnXo6z z?f&Sv^U7n4`xr=mXle94HzOdN!2kB~4=%)u&N!+2;z6UYKUDqi-s6AZ!haB;@&B`? z_TRX0%@suz^TRdCb?!vNJYPY8L_}&07uySH9%W^Tc&1pia6y1q#?*Drf}GjGbPjBS zbOPcUY#*$3sL2x4v_i*Y=N7E$mR}J%|GUI(>WEr+28+V z%v5{#e!UF*6~G&%;l*q*$V?&r$Pp^sE^i-0$+RH3ERUUdQ0>rAq2(2QAbG}$y{de( z>{qD~GGuOk559Y@%$?N^1ApVL_a704>8OD%8Y%8B;FCt%AoPu8*D1 zLB5X>b}Syz81pn;xnB}%0FnwazlWfUV)Z-~rZg6~b z6!9J$EcE&sEbzcy?CI~=boWA&eeIa%z(7SE^qgVLz??1Vbc1*aRvc%Mri)AJaAG!p z$X!_9Ds;Zz)f+;%s&dRcJt2==P{^j3bf0M=nJd&xwUGlUFn?H=2W(*2I2Gdu zv!gYCwM10aeus)`RIZSrCK=&oKaO_Ry~D1B5!y0R=%!i2*KfXGYX&gNv_u+n9wiR5 z*e$Zjju&ODRW3phN925%S(jL+bCHv6rZtc?!*`1TyYXT6%Ju=|X;6D@lq$8T zW{Y|e39ioPez(pBH%k)HzFITXHvnD6hw^lIoUMA;qAJ^CU?top1fo@s7xT13Fvn1H z6JWa-6+FJF#x>~+A;D~;VDs26>^oH0EI`IYT2iagy23?nyJ==i{g4%HrAf1-*v zK1)~@&(KkwR7TL}L(A@C_S0G;-GMDy=MJn2$FP5s<%wC)4jC5PXoxrQBFZ_k0P{{s@sz+gX`-!=T8rcB(=7vW}^K6oLWMmp(rwDh}b zwaGGd>yEy6fHv%jM$yJXo5oMAQ>c9j`**}F?MCry;T@47@r?&sKHgVe$MCqk#Z_3S z1GZI~nOEN*P~+UaFGnj{{Jo@16`(qVNtbU>O0Hf57-P>x8Jikp=`s8xWs^dAJ9lCQ z)GFm+=OV%AMVqVATtN@|vp61VVAHRn87}%PC^RAzJ%JngmZTasWBAWsoAqBU+8L8u z4A&Pe?fmTm0?mK-BL9t+{y7o(7jm+RpOhL9KnY#E&qu^}B6=K_dB}*VlSEiC9fn)+V=J;OnN)Ta5v66ic1rG+dGAJ1 z1%Zb_+!$=tQ~lxQrzv3x#CPb?CekEkA}0MYSgx$Jdd}q8+R=ma$|&1a#)TQ=l$1tQ z=tL9&_^vJ)Pk}EDO-va`UCT1m#Uty1{v^A3P~83_#v^ozH}6*9mIjIr;t3Uv%@VeW zGL6(CwCUp)Jq%G0bIG%?{_*Y#5IHf*5M@wPo6A{$Um++Co$wLC=J1aoG93&T7Ho}P z=mGEPP7GbvoG!uD$k(H3A$Z))+i{Hy?QHdk>3xSBXR0j!11O^mEe9RHmw!pvzv?Ua~2_l2Yh~_!s1qS`|0~0)YsbHSz8!mG)WiJE| z2f($6TQtt6L_f~ApQYQKSb=`053LgrQq7G@98#igV>y#i==-nEjQ!XNu9 z~;mE+gtj4IDDNQJ~JVk5Ux6&LCSFL!y=>79kE9=V}J7tD==Ga+IW zX)r7>VZ9dY=V&}DR))xUoV!u(Z|%3ciQi_2jl}3=$Agc(`RPb z8kEBpvY>1FGQ9W$n>Cq=DIpski};nE)`p3IUw1Oz0|wxll^)4dq3;CCY@RyJgFgc# zKouFh!`?Xuo{IMz^xi-h=StCis_M7yq$u) z?XHvw*HP0VgR+KR6wI)jEMX|ssqYvSf*_3W8zVTQzD?3>H!#>InzpSO)@SC8q*ii- z%%h}_#0{4JG;Jm`4zg};BPTGkYamx$Xo#O~lBirRY)q=5M45n{GCfV7h9qwyu1NxOMoP4)jjZMxmT|IQQh0U7C$EbnMN<3)Kk?fFHYq$d|ICu>KbY_hO zTZM+uKHe(cIZfEqyzyYSUBZa8;Fcut-GN!HSA9ius`ltNebF46ZX_BbZNU}}ZOm{M2&nANL9@0qvih15(|`S~z}m&h!u4x~(%MAO$jHRWNfuxWF#B)E&g3ghSQ9|> z(MFaLQj)NE0lowyjvg8z0#m6FIuKE9lDO~Glg}nSb7`~^&#(Lw{}GVOS>U)m8bF}x zVjbXljBm34Cs-yM6TVusr+3kYFjr28STT3g056y3cH5Tmge~ASxBj z%|yb>$eF;WgrcOZf569sDZOVwoo%8>XO>XQOX1OyN9I-SQgrm;U;+#3OI(zrWyow3 zk==|{lt2xrQ%FIXOTejR>;wv(Pb8u8}BUpx?yd(Abh6? zsoO3VYWkeLnF43&@*#MQ9-i-d0t*xN-UEyNKeyNMHw|A(k(_6QKO=nKMCxD(W(Yop zsRQ)QeL4X3Lxp^L%wzi2-WVSsf61dqliPUM7srDB?Wm6Lzn0&{*}|IsKQW;02(Y&| zaTKv|`U(pSzuvR6Rduu$wzK_W-Y-7>7s?G$)U}&uK;<>vU}^^ns@Z!p+9?St1s)dG zK%y6xkPyyS1$~&6v{kl?Md6gwM|>mt6Upm>oa8RLD^8T{0?HC!Z>;(Bob7el(DV6x zi`I)$&E&ngwFS@bi4^xFLAn`=fzTC;aimE^!cMI2n@Vo%Ae-ne`RF((&5y6xsjjAZ zVguVoQ?Z9uk$2ON;ersE%PU*xGO@T*;j1BO5#TuZKEf(mB7|g7pcEA=nYJ{s3vlbg zd4-DUlD{*6o%Gc^N!Nptgay>j6E5;3psI+C3Q!1ZIbeCubW%w4pq9)MSDyB{HLm|k zxv-{$$A*pS@csolri$Ge<4VZ}e~78JOL-EVyrbxKra^d{?|NnPp86!q>t<&IP07?Z z^>~IK^k#OEKgRH+LjllZXk7iA>2cfH6+(e&9ku5poo~6y{GC5>(bRK7hwjiurqAiZ zg*DmtgY}v83IjE&AbiWgMyFbaRUPZ{lYiz$U^&Zt2YjG<%m((&_JUbZcfJ22(>bi5 z!J?<7AySj0JZ&<-qXX;mcV!f~>G=sB0KnjWca4}vrtunD^1TrpfeS^4dvFr!65knK zZh`d;*VOkPs4*-9kL>$GP0`(M!j~B;#x?Ba~&s6CopvO86oM?-? zOw#dIRc;6A6T?B`Qp%^<U5 z19x(ywSH$_N+Io!6;e?`tWaM$`=Db!gzx|lQ${DG!zb1Zl&|{kX0y6xvO1o z220r<-oaS^^R2pEyY;=Qllqpmue|5yI~D|iI!IGt@iod{Opz@*ml^w2bNs)p`M(Io z|E;;m*Xpjd9l)4G#KaWfV(t8YUn@A;nK^#xgv=LtnArX|vWQVuw3}B${h+frU2>9^ z!l6)!Uo4`5k`<<;E(ido7M6lKTgWezNLq>U*=uz&s=cc$1%>VrAeOoUtA|T6gO4>UNqsdK=NF*8|~*sl&wI=x9-EGiq*aqV!(VVXA57 zw9*o6Ir8Lj1npUXvlevtn(_+^X5rzdR>#(}4YcB9O50q97%rW2me5_L=%ffYPUSRc z!vv?Kv>dH994Qi>U(a<0KF6NH5b16enCp+mw^Hb3Xs1^tThFpz!3QuN#}KBbww`(h z7GO)1olDqy6?T$()R7y%NYx*B0k_2IBiZ14&8|JPFxeMF{vSTxF-Vi3+ZOI=Thq2} zyQgjYY1_7^ZQHh{?P))4+qUiQJLi1&{yE>h?~jU%tjdV0h|FENbM3X(KnJdPKc?~k zh=^Ixv*+smUll!DTWH!jrV*wSh*(mx0o6}1@JExzF(#9FXgmTXVoU+>kDe68N)dkQ zH#_98Zv$}lQwjKL@yBd;U(UD0UCl322=pav<=6g>03{O_3oKTq;9bLFX1ia*lw;#K zOiYDcBJf)82->83N_Y(J7Kr_3lE)hAu;)Q(nUVydv+l+nQ$?|%MWTy`t>{havFSQloHwiIkGK9YZ79^9?AZo0ZyQlVR#}lF%dn5n%xYksXf8gnBm=wO7g_^! zauQ-bH1Dc@3ItZ-9D_*pH}p!IG7j8A_o94#~>$LR|TFq zZ-b00*nuw|-5C2lJDCw&8p5N~Z1J&TrcyErds&!l3$eSz%`(*izc;-?HAFD9AHb-| z>)id`QCrzRws^9(#&=pIx9OEf2rmlob8sK&xPCWS+nD~qzU|qG6KwA{zbikcfQrdH z+ zQg>O<`K4L8rN7`GJB0*3<3`z({lWe#K!4AZLsI{%z#ja^OpfjU{!{)x0ZH~RB0W5X zTwN^w=|nA!4PEU2=LR05x~}|B&ZP?#pNgDMwD*ajI6oJqv!L81gu=KpqH22avXf0w zX3HjbCI!n9>l046)5rr5&v5ja!xkKK42zmqHzPx$9Nn_MZk`gLeSLgC=LFf;H1O#B zn=8|^1iRrujHfbgA+8i<9jaXc;CQBAmQvMGQPhFec2H1knCK2x!T`e6soyrqCamX% zTQ4dX_E*8so)E*TB$*io{$c6X)~{aWfaqdTh=xEeGvOAN9H&-t5tEE-qso<+C!2>+ zskX51H-H}#X{A75wqFe-J{?o8Bx|>fTBtl&tcbdR|132Ztqu5X0i-pisB-z8n71%q%>EF}yy5?z=Ve`}hVh{Drv1YWL zW=%ug_&chF11gDv3D6B)Tz5g54H0mDHNjuKZ+)CKFk4Z|$RD zfRuKLW`1B>B?*RUfVd0+u8h3r-{@fZ{k)c!93t1b0+Q9vOaRnEn1*IL>5Z4E4dZ!7 ztp4GP-^1d>8~LMeb}bW!(aAnB1tM_*la=Xx)q(I0Y@__Zd$!KYb8T2VBRw%e$iSdZ zkwdMwd}eV9q*;YvrBFTv1>1+}{H!JK2M*C|TNe$ZSA>UHKk);wz$(F$rXVc|sI^lD zV^?_J!3cLM;GJuBMbftbaRUs$;F}HDEDtIeHQ)^EJJ1F9FKJTGH<(Jj`phE6OuvE) zqK^K`;3S{Y#1M@8yRQwH`?kHMq4tHX#rJ>5lY3DM#o@or4&^_xtBC(|JpGTfrbGkA z2Tu+AyT^pHannww!4^!$5?@5v`LYy~T`qs7SYt$JgrY(w%C+IWA;ZkwEF)u5sDvOK zGk;G>Mh&elvXDcV69J_h02l&O;!{$({fng9Rlc3ID#tmB^FIG^w{HLUpF+iB`|
NnX)EH+Nua)3Y(c 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 QuEJmfE|#`Dqx|px0L@K;Y5)KL diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e750102..b82aa23 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew old mode 100755 new mode 100644 index 1b6c787..9d0ce63 --- a/gradlew +++ b/gradlew @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -69,37 +69,35 @@ app_path=$0 # Need this for daisy-chained symlinks. while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] +APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path +[ -h "$app_path" ] do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac +ls=$( ls -ld "$app_path" ) +link=${ls#*' -> '} +case $link in #( +/*) app_path=$link ;; #( +*) app_path=$APP_HOME$link ;; +esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum warn () { - echo "$*" +echo "$*" } >&2 die () { - echo - echo "$*" - echo - exit 1 +echo +echo "$*" +echo +exit 1 } >&2 # OS specific support (must be 'true' or 'false'). @@ -108,10 +106,10 @@ msys=false darwin=false nonstop=false case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; +CYGWIN* ) cygwin=true ;; #( +Darwin* ) darwin=true ;; #( +MSYS* | MINGW* ) msys=true ;; #( +NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -119,39 +117,46 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME +if [ -x "$JAVA_HOME/jre/sh/java" ] ; then +# IBM's JDK on AIX uses strange locations for the executables +JAVACMD=$JAVA_HOME/jre/sh/java +else +JAVACMD=$JAVA_HOME/bin/java +fi +if [ ! -x "$JAVACMD" ] ; then +die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME Please set the JAVA_HOME variable in your environment to match the location of your Java installation." - fi +fi else - JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +JAVACMD=java +if ! command -v java >/dev/null 2>&1 +then +die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi +fi # Increase the maximum file descriptors if we can. if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac +case $MAX_FD in #( +max*) +# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. +# shellcheck disable=SC2039,SC3045 +MAX_FD=$( ulimit -H -n ) || +warn "Could not query maximum file descriptor limit" +esac +case $MAX_FD in #( +'' | soft) :;; #( +*) +# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. +# shellcheck disable=SC2039,SC3045 +ulimit -n "$MAX_FD" || +warn "Could not set maximum file descriptor limit to $MAX_FD" +esac fi # Collect all arguments for the java command, stacking in reverse order: @@ -164,46 +169,56 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done +APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) +CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + +JAVACMD=$( cygpath --unix "$JAVACMD" ) + +# Now convert the arguments - kludge to limit ourselves to /bin/sh +for arg do +if +case $arg in #( +-*) false ;; # don't mess with options #( +/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath +[ -e "$t" ] ;; #( +*) false ;; +esac +then +arg=$( cygpath --path --ignore --mixed "$arg" ) +fi +# Roll the args list around exactly as many times as the number of +# args, so each arg winds up back in the position where it started, but +# possibly modified. +# +# NB: a `for` loop captures its iteration list before it begins, so +# changing the positional parameters here affects neither the number of +# iterations, nor the values presented in `arg`. +shift # remove old arg +set -- "$@" "$arg" # push replacement arg +done fi -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" +"-Dorg.gradle.appname=$APP_BASE_NAME" \ +-classpath "$CLASSPATH" \ +org.gradle.wrapper.GradleWrapperMain \ +"$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then +die "xargs is not available" +fi # Use "xargs" to parse quoted args. # @@ -225,10 +240,10 @@ set -- \ # eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' +printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | +xargs -n1 | +sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | +tr '\n' ' ' +)" '"$@"' exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index ac1b06f..25da30d 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,89 +1,92 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..70e14a1 --- /dev/null +++ b/pom.xml @@ -0,0 +1,340 @@ + + 4.0.0 + com.adzerk + adzerk-decision-sdk + jar + adzerk-decision-sdk + 1.0 + https://github.com/adzerk/adzerk-decision-sdk-java + OpenAPI Java + + scm:git:git@github.com:openapitools/openapi-generator.git + scm:git:git@github.com:openapitools/openapi-generator.git + https://github.com/openapitools/openapi-generator + + + + + Unlicense + http://unlicense.org + repo + + + + + + OpenAPI-Generator Contributors + team@openapitools.org + Adzerk, Inc. + https://www.adzerk.com + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + true + 128m + 512m + + -Xlint:all + -J-Xss4m + + + + + org.apache.maven.plugins + maven-enforcer-plugin + 3.4.1 + + + enforce-maven + + enforce + + + + + 2.2.0 + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.22.2 + + + + loggerPath + conf/log4j.properties + + + -Xms512m -Xmx1500m + methods + 10 + + + + + org.junit.jupiter + junit-jupiter-engine + ${junit-version} + + + + + maven-dependency-plugin + 3.6.1 + + + package + + copy-dependencies + + + ${project.build.directory}/lib + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.3.0 + + + + test-jar + + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + 3.5.0 + + + add_sources + generate-sources + + add-source + + + + src/main/java + + + + + add_test_sources + generate-test-sources + + add-test-source + + + + src/test/java + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.6.3 + + + attach-javadocs + + jar + + + + + none + + + http.response.details + a + Http Response Details: + + + + + + org.apache.maven.plugins + maven-source-plugin + 3.3.0 + + + attach-sources + + jar-no-fork + + + + + + + com.diffplug.spotless + spotless-maven-plugin + ${spotless.version} + + + + + + + .gitignore + + + + + + true + 4 + + + + + + + + + + 1.8 + + true + + + + + + + + + + + + + + sign-artifacts + + + + org.apache.maven.plugins + maven-gpg-plugin + 3.2.1 + + + sign-artifacts + verify + + sign + + + + + + + + + + + + + com.google.code.findbugs + jsr305 + 3.0.2 + + + com.squareup.okhttp3 + okhttp + ${okhttp-version} + + + com.squareup.okhttp3 + logging-interceptor + ${okhttp-version} + + + com.google.code.gson + gson + ${gson-version} + + + io.gsonfire + gson-fire + ${gson-fire-version} + + + org.apache.commons + commons-lang3 + ${commons-lang3-version} + + + jakarta.annotation + jakarta.annotation-api + ${jakarta-annotation-version} + provided + + + org.openapitools + jackson-databind-nullable + ${jackson-databind-nullable-version} + + + jakarta.ws.rs + jakarta.ws.rs-api + ${jakarta.ws.rs-api-version} + + + + org.junit.jupiter + junit-jupiter-engine + ${junit-version} + test + + + org.junit.platform + junit-platform-runner + ${junit-platform-runner.version} + test + + + + 1.8 + ${java.version} + ${java.version} + 1.9.0 + 4.12.0 + 2.10.1 + 3.17.0 + 0.2.6 + 1.3.5 + 2.0.2 + 5.10.3 + 1.10.0 + 2.1.6 + 1.1.1 + UTF-8 + 2.43.0 + + diff --git a/src/.DS_Store b/src/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..dd372b7e778548fc51010735a0edb92ef453d9d5 GIT binary patch literal 6148 zcmeHKy-veG47MSNNL@OzaSYvw!~=vXNbKF1pcDa8(?lXHOj&p~UWSL@^Vz65h!_!~ zwsiOT{Buses&_FF@%(vJ5KW0F#}H&uMnue`u00DDC(9n|`(kn1)a}S7f7K+5IV z^hlfJ`448tLtoug)pFe|VawkyU)y5#cAolIKlA7VIh zspzva;0&Y;?CWwW_x}a{GNVm?n&K;Gz!~^w3~*L0sySZD?$&RwCwFbYxW*8XxLy

desiredAds; - private Map> desiredAdMap; - - public String getUserAgent() { - return this.userAgent; - } - - public void setUserAgent(String userAgent) { - this.userAgent = userAgent; - } - - public AdditionalOptions userAgent(String userAgent) { - this.userAgent = userAgent; - return this; - } - - public Boolean getIncludeExplanation() { - return this.includeExplanation; - } - - public void setIncludeExplanation(Boolean includeExplanation) { - this.includeExplanation = includeExplanation; - } - - public AdditionalOptions includeExplanation(Boolean includeExplanation) { - this.includeExplanation = includeExplanation; - return this; - } - - public String getApiKey() { - return this.apiKey; - } - - public void setApiKey(String apiKey) { - this.apiKey = apiKey; - } - - public AdditionalOptions apiKey(String apiKey) { - this.apiKey = apiKey; - return this; - } - - public AdditionalOptions desiredAds(List desiredAds) { - this.desiredAds = desiredAds; - return this; - } - - public List getDesiredAds() { - return desiredAds; - } - - public void setDesiredAds(List desiredAds) { - this.desiredAds = desiredAds; - } - - public AdditionalOptions desiredAdMap(Map> desiredAdMap) { - this.desiredAdMap = desiredAdMap; - return this; - } - - public Map> getDesiredAdMap() { - return desiredAdMap; - } - - public void setDesiredAdMap(Map> desiredAdMap) { - this.desiredAdMap = desiredAdMap; - } - - public Boolean hasValues() { - return (this.includeExplanation != null && this.includeExplanation) || this.userAgent != null; - } -} \ No newline at end of file diff --git a/src/main/java/com/adzerk/sdk/Client.java b/src/main/java/com/adzerk/sdk/Client.java deleted file mode 100644 index 6c400a6..0000000 --- a/src/main/java/com/adzerk/sdk/Client.java +++ /dev/null @@ -1,367 +0,0 @@ -package com.adzerk.sdk; - -import java.io.IOException; -import java.lang.reflect.Type; -import java.util.List; -import java.util.Map; - -import com.adzerk.sdk.generated.ApiClient; -import com.adzerk.sdk.generated.ApiException; -import com.adzerk.sdk.generated.ApiResponse; -import com.adzerk.sdk.generated.api.DecisionApi; -import com.adzerk.sdk.generated.api.UserdbApi; -import com.adzerk.sdk.generated.model.ConsentRequest; -import com.adzerk.sdk.generated.model.DecisionRequest; -import com.adzerk.sdk.generated.model.Placement; -import com.adzerk.sdk.model.DecisionResponse; -import com.adzerk.sdk.model.UserRecord; -import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; - -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import okhttp3.HttpUrl; -import okhttp3.Interceptor; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.RequestBody; -import okhttp3.Response; -import okhttp3.Request.Builder; -import okio.Buffer; - -public class Client { - public class DecisionClient { - private String path; - private OkHttpClient httpClient; - private Logger logger; - private ApiClient apiClient; - private DecisionApi decisionApi; - private Integer networkId; - private Integer siteId; - private String apiKey; - - private DecisionClient(String path, OkHttpClient httpClient, Logger logger, int networkId, Integer siteId, String apiKey) { - this.path = path; - this.httpClient = httpClient; - this.logger = logger; - this.apiClient = new ApiClient().setBasePath(path).setHttpClient(httpClient); - this.decisionApi = new DecisionApi(this.apiClient); - this.networkId = networkId; - this.siteId = siteId; - this.apiKey = apiKey; - } - - public DecisionResponse get(DecisionRequest request) throws ApiException { - return this.get(request, new AdditionalOptions()); - } - - class DesiredAdsObj { - private String apiKey; - private List desiredAds; - - DesiredAdsObj(String apiKey, List desiredAds) { - this.apiKey = apiKey; - this.desiredAds = desiredAds; - }; - } - - class DesiredAdMapObj { - private String apiKey; - private Map> desiredAdMap; - - DesiredAdMapObj(String apiKey, Map> desiredAdMap) { - this.apiKey = apiKey; - this.desiredAdMap = desiredAdMap; - }; - } - - public DecisionResponse get(DecisionRequest request, final AdditionalOptions opts) throws ApiException { - Gson gson = new Gson(); - Type t = new TypeToken(){}.getType(); - - List placements = request.getPlacements(); - - if (request.getEnableBotFiltering() == null) { request.setEnableBotFiltering(false); } - - if (placements == null || placements.size() == 0) { - throw new ApiException("Each request requires at least one placement"); - } - - for (int i = 0; i < placements.size(); i++) { - Placement p = placements.get(i); - - if (p.getAdTypes() == null || p.getAdTypes().size() == 0) { - throw new ApiException("Each placement requires at least one ad type"); - } - - if (p.getDivName() == null) { p.setDivName(String.format("div%s", i)); } - if (p.getNetworkId() == null) { p.setNetworkId(this.networkId); } - if (p.getSiteId() == null) { p.setSiteId(this.siteId); } - } - - this.logger.info("Fetching decisions from adzerk API"); - this.logger.info("Using additional parameters: {}", gson.toJson(opts)); - this.logger.info("Processing request: {}", gson.toJson(request)); - - DecisionApi api = this.decisionApi; - - if (opts != null && opts.hasValues()) { - DecisionClient that = this; - this.logger.info("Found additional options. Building..."); - Interceptor optsInterceptor = new Interceptor() { - public okhttp3.Response intercept(Interceptor.Chain chain) throws IOException { - Builder builder = chain.request().newBuilder(); - String userAgent = opts.getUserAgent(); - if (userAgent != null) { - that.logger.info("Setting User-Agent to: {}", userAgent); - builder.removeHeader("User-Agent"); - builder.addHeader("User-Agent", userAgent); - } - if (opts.getIncludeExplanation() != null && opts.getIncludeExplanation()) { - that.logger.info("Setting X-Adzerk-Explain."); - if (opts.getDesiredAds() != null) { - DesiredAdsObj desiredAdsObj= new DesiredAdsObj(opts.getApiKey(), opts.getDesiredAds()); - builder.addHeader("X-Adzerk-Explain", gson.toJson(desiredAdsObj)); - } - if (opts.getDesiredAdMap() != null) { - DesiredAdMapObj desiredAdMapObj= new DesiredAdMapObj(opts.getApiKey(), opts.getDesiredAdMap()); - builder.addHeader("X-Adzerk-Explain", gson.toJson(desiredAdMapObj)); - } - builder.addHeader("X-Adzerk-Explain", opts.getApiKey()); - } - Request request = builder.build(); - return chain.proceed(request); - } - }; - - if (opts.getIncludeExplanation() != null && opts.getIncludeExplanation()) { - this.logger.warn("--------------------------------------------------------------"); - this.logger.warn(" !!! WARNING - WARNING - WARNING !!! "); - this.logger.warn(""); - this.logger.warn("You have opted to include explainer details with this request!"); - this.logger.warn("This will cause performance degradation and should not be done"); - this.logger.warn("in production environments."); - this.logger.warn("--------------------------------------------------------------"); - } - - OkHttpClient httpClient = this.httpClient.newBuilder().addInterceptor(optsInterceptor).build(); - ApiClient apiClient = new ApiClient().setBasePath(this.path).setHttpClient(httpClient); - api = new DecisionApi(apiClient); - } - - this.logger.info("Fetching decisions from Adzerk API"); - this.logger.info("Processing request: {}", gson.toJson(request)); - - ApiResponse apiResponse = - api.getDecisionsWithHttpInfo(request); - if (apiResponse.getStatusCode() >= 200 && apiResponse.getStatusCode() < 300) { - Object response = apiResponse.getData(); - this.logger.info("Received response: {}", gson.toJson(response)); - return gson.fromJson(gson.toJson(response), t); - } else { - this.logger.info("Response status code: {}", apiResponse.getStatusCode()); - throw new ApiException("Bad response with status code: " + apiResponse.getStatusCode()); - } - } - } - - public class UserDbClient { - private UserdbApi userDbApi; - private Integer networkId; - - private UserDbClient(String path, OkHttpClient httpClient, Logger logger, String apiKey, Integer networkId) { - ApiClient apiClient = new ApiClient().setBasePath(path).setHttpClient(httpClient); - apiClient.setApiKey(apiKey); - this.userDbApi = new UserdbApi(apiClient); - this.networkId = networkId; - } - - public void setCustomProperties(String userKey, Object properties) throws ApiException { - this.setCustomProperties(this.networkId, userKey, properties); - } - - public void setCustomProperties(int networkId, String userKey, Object properties) throws ApiException { - this.userDbApi.addCustomProperties(networkId, userKey, properties); - } - - public void addInterest(String userKey, String interest) throws ApiException { - this.addInterest(this.networkId, userKey, interest); - } - - public void addInterest(int networkId, String userKey, String interest) throws ApiException { - this.userDbApi.addInterests(networkId, userKey, interest); - } - - public void addRetargetingSegment(String userKey, int advertiserId, int retargetingSegmentId) throws ApiException { - this.addRetargetingSegment(this.networkId, userKey, advertiserId, retargetingSegmentId); - } - - public void addRetargetingSegment(int networkId, String userKey, int advertiserId, int retargetingSegmentId) throws ApiException { - this.userDbApi.addRetargetingSegment(networkId, advertiserId, retargetingSegmentId, userKey); - } - - public void forget(String userKey) throws ApiException { - this.forget(this.networkId, userKey); - } - - public void forget(int networkId, String userKey) throws ApiException { - this.userDbApi.forget(networkId, userKey); - } - - public void gdprConsent(ConsentRequest consentRequest) throws ApiException { - this.gdprConsent(this.networkId, consentRequest); - } - - public void gdprConsent(int networkId, ConsentRequest consentRequest) throws ApiException { - this.userDbApi.gdprConsent(networkId, consentRequest); - } - - public void ipOverride(String userKey, String ip) throws ApiException { - this.ipOverride(this.networkId, userKey, ip); - } - - public void ipOverride(int networkId, String userKey, String ip) throws ApiException { - this.userDbApi.ipOverride(networkId, userKey, ip); - } - - public void matchUser(String userKey, int partnerId, int userId) throws ApiException { - this.matchUser(this.networkId, userKey, partnerId, userId); - } - - public void matchUser(int networkId, String userKey, int partnerId, int userId) throws ApiException { - this.userDbApi.matchUser(networkId, userKey, partnerId, userId); - } - - public void optOut(String userKey) throws ApiException { - this.optOut(this.networkId, userKey); - } - - public void optOut(int networkId, String userKey) throws ApiException { - this.userDbApi.optOut(networkId, userKey); - } - - public UserRecord read(String userKey) throws ApiException { - return this.read(this.networkId, userKey); - } - - public UserRecord read(int networkId, String userKey) throws ApiException { - Gson gson = new Gson(); - Object user = this.userDbApi.read(networkId, userKey); - Type t = new TypeToken(){}.getType(); - return gson.fromJson(gson.toJson(user), t); - } - } - - public class PixelClient { - private OkHttpClient httpClient; - - public PixelClient(OkHttpClient httpClient) { - this.httpClient = httpClient; - } - - public PixelFireResponse fire(PixelFireOptions opts) throws IOException { - return this.fire(opts, new AdditionalOptions()); - } - - public PixelFireResponse fire(PixelFireOptions opts, AdditionalOptions additionalOpts) throws IOException { - HttpUrl.Builder urlBuilder = HttpUrl.parse(opts.getUrl()).newBuilder(); - if (opts.getRevenueOverride() != null) { - urlBuilder.addQueryParameter("override", opts.getRevenueOverride().toString()); - } - if (opts.getAdditionalRevenue() != null) { - urlBuilder.addQueryParameter("additional", opts.getAdditionalRevenue().toString()); - } - if (opts.getEventMultiplier() != null) { - urlBuilder.addQueryParameter("eventMultiplier", opts.getEventMultiplier().toString()); - } - if (opts.getGrossMerchandiseValue() != null) { - urlBuilder.addQueryParameter("gmv", opts.getGrossMerchandiseValue().toString()); - } - - HttpUrl url = urlBuilder.build(); - Request request = new okhttp3.Request.Builder() - .url(url) - .header("User-Agent", (additionalOpts.getUserAgent() == null ? "OpenAPI-Generator/1.0/java" : additionalOpts.getUserAgent())) - .build(); - - Response response = httpClient.newCall(request).execute(); - - return new PixelFireResponse().statusCode(response.code()).location(response.headers().get("location")); - } - } - - private Logger logger; - private DecisionClient decisionClient; - private UserDbClient userDbClient; - private PixelClient pixelClient; - - public DecisionClient decisions() { - return this.decisionClient; - } - - public UserDbClient userDb() { - return this.userDbClient; - } - - public PixelClient pixels() { - return this.pixelClient; - } - - public Client(ClientOptions params) { - this.logger = LoggerFactory.getLogger(Client.class); - - String protocol = StringUtils.isNotBlank(params.getProtocol()) ? params.getProtocol() : "https"; - String host = StringUtils.isNotBlank(params.getHost()) ? params.getHost() : String.format("e-%s.adzerk.net", params.getNetworkId()); - String path = String.format("%s://%s", protocol, host); - - Interceptor requestInterceptor = new Interceptor() { - public okhttp3.Response intercept(Interceptor.Chain chain) throws IOException { - okhttp3.Request request = chain.request(); - String version = this.getClass().getPackage().getImplementationVersion(); - okhttp3.Request.Builder builder = request.newBuilder().addHeader("X-Adzerk-Sdk-Version", "adzerk-decision-sdk-java:" + version); - String apiKey = params.getApiKey(); - if (apiKey != null) { - builder = builder.addHeader("X-Adzerk-ApiKey", apiKey); - } - - okhttp3.Request newRequest = builder.build(); - - long t1 = System.nanoTime(); - RequestBody body = request.body(); - - logger.info("Request URL: {}", newRequest.url()); - logger.info("Request Headers: {}", newRequest.headers()); - - if (body != null) { - Buffer buffer = new Buffer(); - body.writeTo(buffer); - logger.info("Request Body: {}", buffer.readUtf8()); - } - - okhttp3.Response response = chain.proceed(newRequest); - - long t2 = System.nanoTime(); - logger.info(String.format("Received response for %s in %.1fms%n", - response.request().url(), (t2 - t1) / 1e6d)); - - logger.info("Response Code: {}", response.code()); - logger.info("Response Status Text: {}", response.message()); - - return response; - } - }; - - OkHttpClient httpClient = new okhttp3 - .OkHttpClient - .Builder() - .followRedirects(false) - .addInterceptor(requestInterceptor) - .build(); - - this.decisionClient = new DecisionClient(path, httpClient, logger, params.getNetworkId(), params.getSiteId(), params.getApiKey()); - this.userDbClient = new UserDbClient(path, httpClient, logger, params.getApiKey(), params.getNetworkId()); - this.pixelClient = new PixelClient(httpClient); - } -} diff --git a/src/main/java/com/adzerk/sdk/ClientOptions.java b/src/main/java/com/adzerk/sdk/ClientOptions.java deleted file mode 100644 index 4b1d9ff..0000000 --- a/src/main/java/com/adzerk/sdk/ClientOptions.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.adzerk.sdk; - -public class ClientOptions { - private Integer networkId; - private Integer siteId; - private String protocol; - private String host; - private String path; - private String apiKey; - - public ClientOptions(Integer networkId) { - this.networkId = networkId; - } - - public Integer getNetworkId() { - return networkId; - } - - public void setNetworkId(Integer networkId) { - this.networkId = networkId; - } - - public ClientOptions networkId(Integer networkId) { - this.setNetworkId(networkId); - return this; - } - - public Integer getSiteId() { - return siteId; - } - - public void setSiteId(Integer siteId) { - this.siteId = siteId; - } - - public ClientOptions siteId(Integer siteId) { - this.siteId = siteId; - return this; - } - - public String getProtocol() { - return protocol; - } - - public void setProtocol(String protocol) { - this.protocol = protocol; - } - - public ClientOptions protocol(String protocol) { - this.setProtocol(protocol); - return this; - } - - public String getHost() { - return host; - } - - public void setHost(String host) { - this.host = host; - } - - public ClientOptions host(String host) { - this.setHost(host); - return this; - } - - public String getPath() { - return path; - } - - public void setPath(String path) { - this.path = path; - } - - public ClientOptions path(String path) { - this.setPath(path); - return this; - } - - public String getApiKey() { - return apiKey; - } - - public void setApiKey(String apiKey) { - this.apiKey = apiKey; - } - - public ClientOptions apiKey(String apiKey) { - this.setApiKey(apiKey); - return this; - } -} \ No newline at end of file diff --git a/src/main/java/com/adzerk/sdk/PixelFireOptions.java b/src/main/java/com/adzerk/sdk/PixelFireOptions.java deleted file mode 100644 index de473af..0000000 --- a/src/main/java/com/adzerk/sdk/PixelFireOptions.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.adzerk.sdk; - -import java.math.BigDecimal; - -public class PixelFireOptions { - private String url; - private BigDecimal revenueOverride; - private BigDecimal additionalRevenue; - private Integer eventMultiplier; - private Integer grossMerchandiseValue; - - public String getUrl() { - return this.url; - } - - public void setUrl(String url) { - this.url = url; - } - - public PixelFireOptions url(String url) { - this.url = url; - return this; - } - - public BigDecimal getRevenueOverride() { - return this.revenueOverride; - } - - public void setRevenueOverride(BigDecimal revenueOverride) { - this.revenueOverride = revenueOverride; - } - - public PixelFireOptions revenueOverride(BigDecimal revenueOverride) { - this.revenueOverride = revenueOverride; - return this; - } - - public BigDecimal getAdditionalRevenue() { - return this.additionalRevenue; - } - - public void setAdditionalRevenue(BigDecimal additionalRevenue) { - this.additionalRevenue = additionalRevenue; - } - - public PixelFireOptions additionalRevenue(BigDecimal additionalRevenue) { - this.additionalRevenue = additionalRevenue; - return this; - } - - public Integer getEventMultiplier() { - return this.eventMultiplier; - } - - public void setEventMultiplier(Integer eventMultiplier) { - this.eventMultiplier = eventMultiplier; - } - - public PixelFireOptions eventMultiplier(Integer eventMultiplier) { - this.eventMultiplier = eventMultiplier; - return this; - } - - public Integer getGrossMerchandiseValue() { - return this.grossMerchandiseValue; - } - - public void setGrossMerchandiseValue(Integer grossMerchandiseValue) { - this.grossMerchandiseValue = grossMerchandiseValue; - } - - public PixelFireOptions grossMerchandiseValue(Integer grossMerchandiseValue) { - this.grossMerchandiseValue = grossMerchandiseValue; - return this; - } -} \ No newline at end of file diff --git a/src/main/java/com/adzerk/sdk/PixelFireResponse.java b/src/main/java/com/adzerk/sdk/PixelFireResponse.java deleted file mode 100644 index acd387e..0000000 --- a/src/main/java/com/adzerk/sdk/PixelFireResponse.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.adzerk.sdk; - -public class PixelFireResponse { - private int statusCode; - private String location; - - public int getStatusCode() { - return this.statusCode; - } - - public void setStatusCode(int statusCode) { - this.statusCode = statusCode; - } - - public PixelFireResponse statusCode(int statusCode) { - this.statusCode = statusCode; - return this; - } - - public String getLocation() { - return this.location; - } - - public void setLocation(String location) { - this.location = location; - } - - public PixelFireResponse location(String location) { - this.location = location; - return this; - } -} \ No newline at end of file diff --git a/src/main/java/com/adzerk/sdk/constants/EventType.java b/src/main/java/com/adzerk/sdk/constants/EventType.java deleted file mode 100644 index 458f3d0..0000000 --- a/src/main/java/com/adzerk/sdk/constants/EventType.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.adzerk.sdk.constants; - -public final class EventType { - public static final int VIEW_CONVERSION = 1; - public static final int CLICK_CONVERSION = 2; - public static final int SERVER_TO_SERVER_CONVERSION = 3; - public static final int UPVOTE = 10; - public static final int DOWNVOTE = 11; - public static final int DOWNVOTE_UNINTERESTING = 12; - public static final int DOWNVOTE_MISLEADING = 13; - public static final int DOWNVOTE_OFFENSIVE = 14; - public static final int DOWNVOTE_REPETITIVE = 15; - public static final int DOWNVOTE_OTHER = 16; - public static final int CLOSE_AD = 17; - public static final int LIKE = 20; - public static final int SHARE = 21; - public static final int COMMENT = 22; - public static final int COMMENT_REPLY = 101; - public static final int COMMENT_UPVOTE = 102; - public static final int COMMENT_DOWNVOTE = 103; - public static final int VISIBLE = 30; - public static final int HOVER = 31; - public static final int EXPAND_DIV = 32; - public static final int VIEWABLE_IMPRESSION = 40; - public static final int SHARE_ON_FACEBOOK = 50; - public static final int SHARE_ON_TWITTER = 51; - public static final int SHARE_ON_PINTEREST = 52; - public static final int SHARE_ON_REDDIT = 53; - public static final int SHARE_ON_EMAIL = 54; - public static final int VIDEO_START = 70; - public static final int VIDEO_FIRST_QUARTILE = 71; - public static final int VIDEO_MID_POINT = 72; - public static final int VIDEO_THIRD_QUARTILE = 73; - public static final int VIDEO_COMPLETE = 74; - public static final int VIDEO_MUTE = 75; - public static final int VIDEO_UNMUTE = 76; - public static final int VIDEO_PAUSE = 77; - public static final int VIDEO_REWIND = 78; - public static final int VIDEO_RESUME = 79; - public static final int VIDEO_FULL_SCREEN = 80; - public static final int VIDEO_EXIT_FULL_SCREEN = 81; - public static final int VIDEO_EXPAND = 82; - public static final int VIDEO_COLLAPSE = 83; - public static final int VIDEO_ACCEPT_INVITATION_LINEAR = 84; - public static final int VIDEO_CLOSE_LINEAR = 85; - public static final int VIDEO_SKIP = 86; - public static final int VIDEO_PROGRESS = 87; - public static final int VIDEO_ZERO_SECONDS_VIEWED = 400; - public static final int VIDEO_ONE_SECONDS_VIEWED = 401; - public static final int VIDEO_TWO_SECONDS_VIEWED = 402; - public static final int VIDEO_THREE_SECONDS_VIEWED = 403; - public static final int VIDEO_FOUR_SECONDS_VIEWED = 404; - public static final int VIDEO_FIVE_SECONDS_VIEWED = 405; - public static final int VIDEO_SIX_SECONDS_VIEWED = 406; - public static final int VIDEO_SEVEN_SECONDS_VIEWED = 407; - public static final int VIDEO_EIGHT_SECONDS_VIEWED = 408; - public static final int VIDEO_NINE_SECONDS_VIEWED = 409; - public static final int VIDEO_TEN_SECONDS_VIEWED = 410; - public static final int VIDEO_FIFTEEN_SECONDS_VIEWED = 415; - public static final int VIDEO_TWENTY_SECONDS_VIEWED = 420; - public static final int VIDEO_TWENTY_FIVE_SECONDS_VIEWED = 425; - public static final int VIDEO_THIRTY_SECONDS_VIEWED = 430; -} \ No newline at end of file diff --git a/src/main/java/com/adzerk/sdk/constants/RateType.java b/src/main/java/com/adzerk/sdk/constants/RateType.java deleted file mode 100644 index dd7fea7..0000000 --- a/src/main/java/com/adzerk/sdk/constants/RateType.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.adzerk.sdk.constants; - -public final class RateType { - public static final int FLAT = 1; - public static final int CPM = 2; - public static final int CPC = 3; - public static final int CPA_VIEW = 4; - public static final int CPA_CLICK = 5; - public static final int CPA_VIEW_AND_CLICK = 6; -} \ No newline at end of file diff --git a/src/main/java/com/adzerk/sdk/generated/ApiCallback.java b/src/main/java/com/adzerk/sdk/generated/ApiCallback.java index a891fc6..f48fecc 100644 --- a/src/main/java/com/adzerk/sdk/generated/ApiCallback.java +++ b/src/main/java/com/adzerk/sdk/generated/ApiCallback.java @@ -52,10 +52,10 @@ public interface ApiCallback { void onUploadProgress(long bytesWritten, long contentLength, boolean done); /** - * This is called when the API downlond processing. + * This is called when the API download processing. * * @param bytesRead bytes Read - * @param contentLength content lenngth of the response + * @param contentLength content length of the response * @param done Read end */ void onDownloadProgress(long bytesRead, long contentLength, boolean done); diff --git a/src/main/java/com/adzerk/sdk/generated/ApiClient.java b/src/main/java/com/adzerk/sdk/generated/ApiClient.java index d07a543..7946ace 100644 --- a/src/main/java/com/adzerk/sdk/generated/ApiClient.java +++ b/src/main/java/com/adzerk/sdk/generated/ApiClient.java @@ -18,11 +18,9 @@ import okhttp3.internal.tls.OkHostnameVerifier; import okhttp3.logging.HttpLoggingInterceptor; import okhttp3.logging.HttpLoggingInterceptor.Level; +import okio.Buffer; import okio.BufferedSink; import okio.Okio; -import org.threeten.bp.LocalDate; -import org.threeten.bp.OffsetDateTime; -import org.threeten.bp.format.DateTimeFormatter; import javax.net.ssl.*; import java.io.File; @@ -43,9 +41,13 @@ import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.text.DateFormat; +import java.time.LocalDate; +import java.time.OffsetDateTime; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.Map.Entry; import java.util.concurrent.TimeUnit; +import java.util.function.Supplier; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -54,31 +56,60 @@ import com.adzerk.sdk.generated.auth.HttpBearerAuth; import com.adzerk.sdk.generated.auth.ApiKeyAuth; +/** + *

ApiClient class.

+ */ public class ApiClient { - private String basePath = "https://e-23.adzerk.net"; - private boolean debugging = false; - private Map defaultHeaderMap = new HashMap(); - private Map defaultCookieMap = new HashMap(); - private String tempFolderPath = null; - - private Map authentications; - - private DateFormat dateFormat; - private DateFormat datetimeFormat; - private boolean lenientDatetimeFormat; - private int dateLength; - - private InputStream sslCaCert; - private boolean verifyingSsl; - private KeyManager[] keyManagers; - - private OkHttpClient httpClient; - private JSON json; + protected String basePath = "https://e-23.adzerk.net"; + protected List servers = new ArrayList(Arrays.asList( + new ServerConfiguration( + "{protocol}://e-{networkId}.adzerk.net", + "No description provided", + new HashMap() {{ + put("protocol", new ServerVariable( + "No description provided", + "https", + new HashSet( + Arrays.asList( + "http", + "https" + ) + ) + )); + put("networkId", new ServerVariable( + "Your Adzerk Network Id", + "23", + new HashSet( + ) + )); + }} + ) + )); + protected Integer serverIndex = 0; + protected Map serverVariables = null; + protected boolean debugging = false; + protected Map defaultHeaderMap = new HashMap(); + protected Map defaultCookieMap = new HashMap(); + protected String tempFolderPath = null; + + protected Map authentications; + + protected DateFormat dateFormat; + protected DateFormat datetimeFormat; + protected boolean lenientDatetimeFormat; + protected int dateLength; + + protected InputStream sslCaCert; + protected boolean verifyingSsl; + protected KeyManager[] keyManagers; + + protected OkHttpClient httpClient; + protected JSON json; + + protected HttpLoggingInterceptor loggingInterceptor; - private HttpLoggingInterceptor loggingInterceptor; - - /* + /** * Basic constructor for ApiClient */ public ApiClient() { @@ -91,8 +122,10 @@ public ApiClient() { authentications = Collections.unmodifiableMap(authentications); } - /* + /** * Basic constructor with custom OkHttpClient + * + * @param client a {@link okhttp3.OkHttpClient} object */ public ApiClient(OkHttpClient client) { init(); @@ -105,11 +138,11 @@ public ApiClient(OkHttpClient client) { authentications = Collections.unmodifiableMap(authentications); } - private void initHttpClient() { + protected void initHttpClient() { initHttpClient(Collections.emptyList()); } - private void initHttpClient(List interceptors) { + protected void initHttpClient(List interceptors) { OkHttpClient.Builder builder = new OkHttpClient.Builder(); builder.addNetworkInterceptor(getProgressInterceptor()); for (Interceptor interceptor: interceptors) { @@ -119,7 +152,7 @@ private void initHttpClient(List interceptors) { httpClient = builder.build(); } - private void init() { + protected void init() { verifyingSsl = true; json = new JSON(); @@ -147,6 +180,34 @@ public String getBasePath() { */ public ApiClient setBasePath(String basePath) { this.basePath = basePath; + this.serverIndex = null; + return this; + } + + public List getServers() { + return servers; + } + + public ApiClient setServers(List servers) { + this.servers = servers; + return this; + } + + public Integer getServerIndex() { + return serverIndex; + } + + public ApiClient setServerIndex(Integer serverIndex) { + this.serverIndex = serverIndex; + return this; + } + + public Map getServerVariables() { + return serverVariables; + } + + public ApiClient setServerVariables(Map serverVariables) { + this.serverVariables = serverVariables; return this; } @@ -164,7 +225,7 @@ public OkHttpClient getHttpClient() { * * @param newHttpClient An instance of OkHttpClient * @return Api Client - * @throws NullPointerException when newHttpClient is null + * @throws java.lang.NullPointerException when newHttpClient is null */ public ApiClient setHttpClient(OkHttpClient newHttpClient) { this.httpClient = Objects.requireNonNull(newHttpClient, "HttpClient must not be null!"); @@ -236,6 +297,11 @@ public ApiClient setSslCaCert(InputStream sslCaCert) { return this; } + /** + *

Getter for the field keyManagers.

+ * + * @return an array of {@link javax.net.ssl.KeyManager} objects + */ public KeyManager[] getKeyManagers() { return keyManagers; } @@ -253,32 +319,67 @@ public ApiClient setKeyManagers(KeyManager[] managers) { return this; } + /** + *

Getter for the field dateFormat.

+ * + * @return a {@link java.text.DateFormat} object + */ public DateFormat getDateFormat() { return dateFormat; } + /** + *

Setter for the field dateFormat.

+ * + * @param dateFormat a {@link java.text.DateFormat} object + * @return a {@link com.adzerk.sdk.generated.ApiClient} object + */ public ApiClient setDateFormat(DateFormat dateFormat) { - this.json.setDateFormat(dateFormat); + JSON.setDateFormat(dateFormat); return this; } + /** + *

Set SqlDateFormat.

+ * + * @param dateFormat a {@link java.text.DateFormat} object + * @return a {@link com.adzerk.sdk.generated.ApiClient} object + */ public ApiClient setSqlDateFormat(DateFormat dateFormat) { - this.json.setSqlDateFormat(dateFormat); + JSON.setSqlDateFormat(dateFormat); return this; } + /** + *

Set OffsetDateTimeFormat.

+ * + * @param dateFormat a {@link java.time.format.DateTimeFormatter} object + * @return a {@link com.adzerk.sdk.generated.ApiClient} object + */ public ApiClient setOffsetDateTimeFormat(DateTimeFormatter dateFormat) { - this.json.setOffsetDateTimeFormat(dateFormat); + JSON.setOffsetDateTimeFormat(dateFormat); return this; } + /** + *

Set LocalDateFormat.

+ * + * @param dateFormat a {@link java.time.format.DateTimeFormatter} object + * @return a {@link com.adzerk.sdk.generated.ApiClient} object + */ public ApiClient setLocalDateFormat(DateTimeFormatter dateFormat) { - this.json.setLocalDateFormat(dateFormat); + JSON.setLocalDateFormat(dateFormat); return this; } + /** + *

Set LenientOnJson.

+ * + * @param lenientOnJson a boolean + * @return a {@link com.adzerk.sdk.generated.ApiClient} object + */ public ApiClient setLenientOnJson(boolean lenientOnJson) { - this.json.setLenientOnJson(lenientOnJson); + JSON.setLenientOnJson(lenientOnJson); return this; } @@ -371,6 +472,31 @@ public void setAccessToken(String accessToken) { throw new RuntimeException("No OAuth2 authentication configured!"); } + /** + * Helper method to set credentials for AWSV4 Signature + * + * @param accessKey Access Key + * @param secretKey Secret Key + * @param region Region + * @param service Service to access to + */ + public void setAWS4Configuration(String accessKey, String secretKey, String region, String service) { + throw new RuntimeException("No AWS4 authentication configured!"); + } + + /** + * Helper method to set credentials for AWSV4 Signature + * + * @param accessKey Access Key + * @param secretKey Secret Key + * @param sessionToken Session Token + * @param region Region + * @param service Service to access to + */ + public void setAWS4Configuration(String accessKey, String secretKey, String sessionToken, String region, String service) { + throw new RuntimeException("No AWS4 authentication configured!"); + } + /** * Set the User-Agent header's value (by adding to the default header map). * @@ -441,7 +567,7 @@ public ApiClient setDebugging(boolean debugging) { /** * The path of temporary folder used to store downloaded files from endpoints * with file response. The default value is null, i.e. using - * the system's default tempopary folder. + * the system's default temporary folder. * * @see
createTempFile * @return Temporary folder path @@ -473,7 +599,7 @@ public int getConnectTimeout() { /** * Sets the connect timeout (in milliseconds). * A value of 0 means no timeout, otherwise values must be between 1 and - * {@link Integer#MAX_VALUE}. + * {@link java.lang.Integer#MAX_VALUE}. * * @param connectionTimeout connection timeout in milliseconds * @return Api client @@ -495,7 +621,7 @@ public int getReadTimeout() { /** * Sets the read timeout (in milliseconds). * A value of 0 means no timeout, otherwise values must be between 1 and - * {@link Integer#MAX_VALUE}. + * {@link java.lang.Integer#MAX_VALUE}. * * @param readTimeout read timeout in milliseconds * @return Api client @@ -517,7 +643,7 @@ public int getWriteTimeout() { /** * Sets the write timeout (in milliseconds). * A value of 0 means no timeout, otherwise values must be between 1 and - * {@link Integer#MAX_VALUE}. + * {@link java.lang.Integer#MAX_VALUE}. * * @param writeTimeout connection timeout in milliseconds * @return Api client @@ -539,7 +665,7 @@ public String parameterToString(Object param) { return ""; } else if (param instanceof Date || param instanceof OffsetDateTime || param instanceof LocalDate) { //Serialize to json string and remove the " enclosing characters - String jsonStr = json.serialize(param); + String jsonStr = JSON.serialize(param); return jsonStr.substring(1, jsonStr.length() - 1); } else if (param instanceof Collection) { StringBuilder b = new StringBuilder(); @@ -547,7 +673,7 @@ public String parameterToString(Object param) { if (b.length() > 0) { b.append(","); } - b.append(String.valueOf(o)); + b.append(o); } return b.toString(); } else { @@ -626,6 +752,31 @@ public List parameterToPairs(String collectionFormat, String name, Collect return params; } + /** + * Formats the specified free-form query parameters to a list of {@code Pair} objects. + * + * @param value The free-form query parameters. + * @return A list of {@code Pair} objects. + */ + public List freeFormParameterToPairs(Object value) { + List params = new ArrayList<>(); + + // preconditions + if (value == null || !(value instanceof Map )) { + return params; + } + + @SuppressWarnings("unchecked") + final Map valuesMap = (Map) value; + + for (Map.Entry entry : valuesMap.entrySet()) { + params.add(new Pair(entry.getKey(), parameterToString(entry.getValue()))); + } + + return params; + } + + /** * Formats the specified collection path parameter to a string value. * @@ -668,7 +819,7 @@ public String collectionPathParameterToString(String collectionFormat, Collectio * @return The sanitized filename */ public String sanitizeFilename(String filename) { - return filename.replaceAll(".*[/\\\\]", ""); + return filename.replaceFirst("^.*[/\\\\]", ""); } /** @@ -715,17 +866,23 @@ public String selectHeaderAccept(String[] accepts) { * * @param contentTypes The Content-Type array to select from * @return The Content-Type header to use. If the given array is empty, - * or matches "any", JSON will be used. + * returns null. If it matches "any", JSON will be used. */ public String selectHeaderContentType(String[] contentTypes) { - if (contentTypes.length == 0 || contentTypes[0].equals("*/*")) { + if (contentTypes.length == 0) { + return null; + } + + if (contentTypes[0].equals("*/*")) { return "application/json"; } + for (String contentType : contentTypes) { if (isJsonMime(contentType)) { return contentType; } } + return contentTypes[0]; } @@ -751,7 +908,7 @@ public String escapeString(String str) { * @param response HTTP response * @param returnType The type of the Java object * @return The deserialized Java object - * @throws ApiException If fail to deserialize response body, i.e. cannot read response body + * @throws com.adzerk.sdk.generated.ApiException If fail to deserialize response body, i.e. cannot read response body * or the Content-Type of the response is not supported. */ @SuppressWarnings("unchecked") @@ -772,17 +929,8 @@ public T deserialize(Response response, Type returnType) throws ApiException return (T) downloadFileFromResponse(response); } - String respBody; - try { - if (response.body() != null) - respBody = response.body().string(); - else - respBody = null; - } catch (IOException e) { - throw new ApiException(e); - } - - if (respBody == null || "".equals(respBody)) { + ResponseBody respBody = response.body(); + if (respBody == null) { return null; } @@ -791,17 +939,25 @@ public T deserialize(Response response, Type returnType) throws ApiException // ensuring a default content type contentType = "application/json"; } - if (isJsonMime(contentType)) { - return json.deserialize(respBody, returnType); - } else if (returnType.equals(String.class)) { - // Expecting string, return the raw response body. - return (T) respBody; - } else { - throw new ApiException( + try { + if (isJsonMime(contentType)) { + return JSON.deserialize(respBody.byteStream(), returnType); + } else if (returnType.equals(String.class)) { + String respBodyString = respBody.string(); + if (respBodyString.isEmpty()) { + return null; + } + // Expecting string, return the raw response body. + return (T) respBodyString; + } else { + throw new ApiException( "Content type \"" + contentType + "\" is not supported for type: " + returnType, response.code(), response.headers().toMultimap(), - respBody); + response.body().string()); + } + } catch (IOException e) { + throw new ApiException(e); } } @@ -812,7 +968,7 @@ public T deserialize(Response response, Type returnType) throws ApiException * @param obj The Java object * @param contentType The request Content-Type * @return The serialized request body - * @throws ApiException If fail to serialize the given object + * @throws com.adzerk.sdk.generated.ApiException If fail to serialize the given object */ public RequestBody serialize(Object obj, String contentType) throws ApiException { if (obj instanceof byte[]) { @@ -821,14 +977,18 @@ public RequestBody serialize(Object obj, String contentType) throws ApiException } else if (obj instanceof File) { // File body parameter support. return RequestBody.create((File) obj, MediaType.parse(contentType)); + } else if ("text/plain".equals(contentType) && obj instanceof String) { + return RequestBody.create((String) obj, MediaType.parse(contentType)); } else if (isJsonMime(contentType)) { String content; if (obj != null) { - content = json.serialize(obj); + content = JSON.serialize(obj); } else { content = null; } return RequestBody.create(content, MediaType.parse(contentType)); + } else if (obj instanceof String) { + return RequestBody.create((String) obj, MediaType.parse(contentType)); } else { throw new ApiException("Content type \"" + contentType + "\" is not supported"); } @@ -838,7 +998,7 @@ public RequestBody serialize(Object obj, String contentType) throws ApiException * Download file from the given response. * * @param response An instance of the Response object - * @throws ApiException If fail to read file content from response and write to disk + * @throws com.adzerk.sdk.generated.ApiException If fail to read file content from response and write to disk * @return Downloaded file */ public File downloadFileFromResponse(Response response) throws ApiException { @@ -858,7 +1018,7 @@ public File downloadFileFromResponse(Response response) throws ApiException { * * @param response An instance of the Response object * @return Prepared file for the download - * @throws IOException If fail to prepare file for download + * @throws java.io.IOException If fail to prepare file for download */ public File prepareDownloadFile(Response response) throws IOException { String filename = null; @@ -902,7 +1062,7 @@ public File prepareDownloadFile(Response response) throws IOException { * @param Type * @param call An instance of the Call object * @return ApiResponse<T> - * @throws ApiException If fail to execute the call + * @throws com.adzerk.sdk.generated.ApiException If fail to execute the call */ public ApiResponse execute(Call call) throws ApiException { return execute(call, null); @@ -917,7 +1077,7 @@ public ApiResponse execute(Call call) throws ApiException { * @return ApiResponse object containing response status, headers and * data, which is a Java object deserialized from response body and would be null * when returnType is null. - * @throws ApiException If fail to execute the call + * @throws com.adzerk.sdk.generated.ApiException If fail to execute the call */ public ApiResponse execute(Call call, Type returnType) throws ApiException { try { @@ -981,7 +1141,7 @@ public void onResponse(Call call, Response response) throws IOException { * @param response Response * @param returnType Return type * @return Type - * @throws ApiException If the response has an unsuccessful status code or + * @throws com.adzerk.sdk.generated.ApiException If the response has an unsuccessful status code or * fail to deserialize the response body */ public T handleResponse(Response response, Type returnType) throws ApiException { @@ -1016,6 +1176,7 @@ public T handleResponse(Response response, Type returnType) throws ApiExcept /** * Build HTTP call with the given options. * + * @param baseUrl The base URL * @param path The sub-path of the HTTP URL * @param method The request method, one of "GET", "HEAD", "OPTIONS", "POST", "PUT", "PATCH" and "DELETE" * @param queryParams The query parameters @@ -1027,10 +1188,10 @@ public T handleResponse(Response response, Type returnType) throws ApiExcept * @param authNames The authentications to apply * @param callback Callback for upload/download progress * @return The HTTP call - * @throws ApiException If fail to serialize the request body object + * @throws com.adzerk.sdk.generated.ApiException If fail to serialize the request body object */ - public Call buildCall(String path, String method, List queryParams, List collectionQueryParams, Object body, Map headerParams, Map cookieParams, Map formParams, String[] authNames, ApiCallback callback) throws ApiException { - Request request = buildRequest(path, method, queryParams, collectionQueryParams, body, headerParams, cookieParams, formParams, authNames, callback); + public Call buildCall(String baseUrl, String path, String method, List queryParams, List collectionQueryParams, Object body, Map headerParams, Map cookieParams, Map formParams, String[] authNames, ApiCallback callback) throws ApiException { + Request request = buildRequest(baseUrl, path, method, queryParams, collectionQueryParams, body, headerParams, cookieParams, formParams, authNames, callback); return httpClient.newCall(request); } @@ -1038,6 +1199,7 @@ public Call buildCall(String path, String method, List queryParams, List

queryParams, List

queryParams, List collectionQueryParams, Object body, Map headerParams, Map cookieParams, Map formParams, String[] authNames, ApiCallback callback) throws ApiException { - updateParamsForAuth(authNames, queryParams, headerParams, cookieParams); - - final String url = buildUrl(path, queryParams, collectionQueryParams); - final Request.Builder reqBuilder = new Request.Builder().url(url); - processHeaderParams(headerParams, reqBuilder); - processCookieParams(cookieParams, reqBuilder); - - String contentType = (String) headerParams.get("Content-Type"); - // ensuring a default content type - if (contentType == null) { - contentType = "application/json"; - } + public Request buildRequest(String baseUrl, String path, String method, List queryParams, List collectionQueryParams, Object body, Map headerParams, Map cookieParams, Map formParams, String[] authNames, ApiCallback callback) throws ApiException { + final String url = buildUrl(baseUrl, path, queryParams, collectionQueryParams); + // prepare HTTP request body RequestBody reqBody; + String contentType = headerParams.get("Content-Type"); + String contentTypePure = contentType; + if (contentTypePure != null && contentTypePure.contains(";")) { + contentTypePure = contentType.substring(0, contentType.indexOf(";")); + } if (!HttpMethod.permitsRequestBody(method)) { reqBody = null; - } else if ("application/x-www-form-urlencoded".equals(contentType)) { + } else if ("application/x-www-form-urlencoded".equals(contentTypePure)) { reqBody = buildRequestBodyFormEncoding(formParams); - } else if ("multipart/form-data".equals(contentType)) { + } else if ("multipart/form-data".equals(contentTypePure)) { reqBody = buildRequestBodyMultipart(formParams); } else if (body == null) { if ("DELETE".equals(method)) { @@ -1078,12 +1235,21 @@ public Request buildRequest(String path, String method, List queryParams, reqBody = null; } else { // use an empty request body (for POST, PUT and PATCH) - reqBody = RequestBody.create("", MediaType.parse(contentType)); + reqBody = RequestBody.create("", contentType == null ? null : MediaType.parse(contentType)); } } else { reqBody = serialize(body, contentType); } + List updatedQueryParams = new ArrayList<>(queryParams); + + // update parameters with authentication settings + updateParamsForAuth(authNames, updatedQueryParams, headerParams, cookieParams, requestBodyToString(reqBody), method, URI.create(url)); + + final Request.Builder reqBuilder = new Request.Builder().url(buildUrl(baseUrl, path, updatedQueryParams, collectionQueryParams)); + processHeaderParams(headerParams, reqBuilder); + processCookieParams(cookieParams, reqBuilder); + // Associate callback with request (if not null) so interceptor can // access it when creating ProgressResponseBody reqBuilder.tag(callback); @@ -1103,14 +1269,30 @@ public Request buildRequest(String path, String method, List queryParams, /** * Build full URL by concatenating base path, the given sub path and query parameters. * + * @param baseUrl The base URL * @param path The sub path * @param queryParams The query parameters * @param collectionQueryParams The collection query parameters * @return The full URL */ - public String buildUrl(String path, List queryParams, List collectionQueryParams) { + public String buildUrl(String baseUrl, String path, List queryParams, List collectionQueryParams) { final StringBuilder url = new StringBuilder(); - url.append(basePath).append(path); + if (baseUrl != null) { + url.append(baseUrl).append(path); + } else { + String baseURL; + if (serverIndex != null) { + if (serverIndex < 0 || serverIndex >= servers.size()) { + throw new ArrayIndexOutOfBoundsException(String.format( + "Invalid index %d when selecting the host settings. Must be less than %d", serverIndex, servers.size() + )); + } + baseURL = servers.get(serverIndex).URL(serverVariables); + } else { + baseURL = basePath; + } + url.append(baseURL).append(path); + } if (queryParams != null && !queryParams.isEmpty()) { // support (constant) query string in `path`, e.g. "/posts?draft=1" @@ -1190,14 +1372,19 @@ public void processCookieParams(Map cookieParams, Request.Builde * @param queryParams List of query parameters * @param headerParams Map of header parameters * @param cookieParams Map of cookie parameters + * @param payload HTTP request body + * @param method HTTP method + * @param uri URI + * @throws com.adzerk.sdk.generated.ApiException If fails to update the parameters */ - public void updateParamsForAuth(String[] authNames, List queryParams, Map headerParams, Map cookieParams) { + public void updateParamsForAuth(String[] authNames, List queryParams, Map headerParams, + Map cookieParams, String payload, String method, URI uri) throws ApiException { for (String authName : authNames) { Authentication auth = authentications.get(authName); if (auth == null) { throw new RuntimeException("Authentication undefined: " + authName); } - auth.applyToParams(queryParams, headerParams, cookieParams); + auth.applyToParams(queryParams, headerParams, cookieParams, payload, method, uri); } } @@ -1227,12 +1414,18 @@ public RequestBody buildRequestBodyMultipart(Map formParams) { for (Entry param : formParams.entrySet()) { if (param.getValue() instanceof File) { File file = (File) param.getValue(); - Headers partHeaders = Headers.of("Content-Disposition", "form-data; name=\"" + param.getKey() + "\"; filename=\"" + file.getName() + "\""); - MediaType mediaType = MediaType.parse(guessContentTypeFromFile(file)); - mpBuilder.addPart(partHeaders, RequestBody.create(file, mediaType)); + addPartToMultiPartBuilder(mpBuilder, param.getKey(), file); + } else if (param.getValue() instanceof List) { + List list = (List) param.getValue(); + for (Object item: list) { + if (item instanceof File) { + addPartToMultiPartBuilder(mpBuilder, param.getKey(), (File) item); + } else { + addPartToMultiPartBuilder(mpBuilder, param.getKey(), param.getValue()); + } + } } else { - Headers partHeaders = Headers.of("Content-Disposition", "form-data; name=\"" + param.getKey() + "\""); - mpBuilder.addPart(partHeaders, RequestBody.create(parameterToString(param.getValue()), null)); + addPartToMultiPartBuilder(mpBuilder, param.getKey(), param.getValue()); } } return mpBuilder.build(); @@ -1253,11 +1446,49 @@ public String guessContentTypeFromFile(File file) { } } + /** + * Add a Content-Disposition Header for the given key and file to the MultipartBody Builder. + * + * @param mpBuilder MultipartBody.Builder + * @param key The key of the Header element + * @param file The file to add to the Header + */ + protected void addPartToMultiPartBuilder(MultipartBody.Builder mpBuilder, String key, File file) { + Headers partHeaders = Headers.of("Content-Disposition", "form-data; name=\"" + key + "\"; filename=\"" + file.getName() + "\""); + MediaType mediaType = MediaType.parse(guessContentTypeFromFile(file)); + mpBuilder.addPart(partHeaders, RequestBody.create(file, mediaType)); + } + + /** + * Add a Content-Disposition Header for the given key and complex object to the MultipartBody Builder. + * + * @param mpBuilder MultipartBody.Builder + * @param key The key of the Header element + * @param obj The complex object to add to the Header + */ + protected void addPartToMultiPartBuilder(MultipartBody.Builder mpBuilder, String key, Object obj) { + RequestBody requestBody; + if (obj instanceof String) { + requestBody = RequestBody.create((String) obj, MediaType.parse("text/plain")); + } else { + String content; + if (obj != null) { + content = JSON.serialize(obj); + } else { + content = null; + } + requestBody = RequestBody.create(content, MediaType.parse("application/json")); + } + + Headers partHeaders = Headers.of("Content-Disposition", "form-data; name=\"" + key + "\""); + mpBuilder.addPart(partHeaders, requestBody); + } + /** * Get network interceptor to add it to the httpClient to track download progress for * async requests. */ - private Interceptor getProgressInterceptor() { + protected Interceptor getProgressInterceptor() { return new Interceptor() { @Override public Response intercept(Interceptor.Chain chain) throws IOException { @@ -1278,7 +1509,7 @@ public Response intercept(Interceptor.Chain chain) throws IOException { * Apply SSL related settings to httpClient according to the current values of * verifyingSsl and sslCaCert. */ - private void applySslSettings() { + protected void applySslSettings() { try { TrustManager[] trustManagers; HostnameVerifier hostnameVerifier; @@ -1320,7 +1551,7 @@ public boolean verify(String hostname, SSLSession session) { KeyStore caKeyStore = newEmptyKeyStore(password); int index = 0; for (Certificate certificate : certificates) { - String certificateAlias = "ca" + Integer.toString(index++); + String certificateAlias = "ca" + (index++); caKeyStore.setCertificateEntry(certificateAlias, certificate); } trustManagerFactory.init(caKeyStore); @@ -1340,7 +1571,7 @@ public boolean verify(String hostname, SSLSession session) { } } - private KeyStore newEmptyKeyStore(char[] password) throws GeneralSecurityException { + protected KeyStore newEmptyKeyStore(char[] password) throws GeneralSecurityException { try { KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); keyStore.load(null, password); @@ -1349,4 +1580,26 @@ private KeyStore newEmptyKeyStore(char[] password) throws GeneralSecurityExcepti throw new AssertionError(e); } } + + /** + * Convert the HTTP request body to a string. + * + * @param requestBody The HTTP request object + * @return The string representation of the HTTP request body + * @throws com.adzerk.sdk.generated.ApiException If fail to serialize the request body object into a string + */ + protected String requestBodyToString(RequestBody requestBody) throws ApiException { + if (requestBody != null) { + try { + final Buffer buffer = new Buffer(); + requestBody.writeTo(buffer); + return buffer.readUtf8(); + } catch (final IOException e) { + throw new ApiException(e); + } + } + + // empty http request body + return ""; + } } diff --git a/src/main/java/com/adzerk/sdk/generated/ApiException.java b/src/main/java/com/adzerk/sdk/generated/ApiException.java index 481c871..959f456 100644 --- a/src/main/java/com/adzerk/sdk/generated/ApiException.java +++ b/src/main/java/com/adzerk/sdk/generated/ApiException.java @@ -16,22 +16,51 @@ import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-07-16T01:15:27.717Z[Etc/UTC]") + +/** + *

ApiException class.

+ */ +@SuppressWarnings("serial") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-08-11T14:42:50.054336-03:00[America/Argentina/Cordoba]", comments = "Generator version: 7.14.0") public class ApiException extends Exception { + private static final long serialVersionUID = 1L; + private int code = 0; private Map> responseHeaders = null; private String responseBody = null; + /** + *

Constructor for ApiException.

+ */ public ApiException() {} + /** + *

Constructor for ApiException.

+ * + * @param throwable a {@link java.lang.Throwable} object + */ public ApiException(Throwable throwable) { super(throwable); } + /** + *

Constructor for ApiException.

+ * + * @param message the error message + */ public ApiException(String message) { super(message); } + /** + *

Constructor for ApiException.

+ * + * @param message the error message + * @param throwable a {@link java.lang.Throwable} object + * @param code HTTP status code + * @param responseHeaders a {@link java.util.Map} of HTTP response headers + * @param responseBody the response body + */ public ApiException(String message, Throwable throwable, int code, Map> responseHeaders, String responseBody) { super(message, throwable); this.code = code; @@ -39,23 +68,60 @@ public ApiException(String message, Throwable throwable, int code, MapConstructor for ApiException.

+ * + * @param message the error message + * @param code HTTP status code + * @param responseHeaders a {@link java.util.Map} of HTTP response headers + * @param responseBody the response body + */ public ApiException(String message, int code, Map> responseHeaders, String responseBody) { this(message, (Throwable) null, code, responseHeaders, responseBody); } + /** + *

Constructor for ApiException.

+ * + * @param message the error message + * @param throwable a {@link java.lang.Throwable} object + * @param code HTTP status code + * @param responseHeaders a {@link java.util.Map} of HTTP response headers + */ public ApiException(String message, Throwable throwable, int code, Map> responseHeaders) { this(message, throwable, code, responseHeaders, null); } + /** + *

Constructor for ApiException.

+ * + * @param code HTTP status code + * @param responseHeaders a {@link java.util.Map} of HTTP response headers + * @param responseBody the response body + */ public ApiException(int code, Map> responseHeaders, String responseBody) { - this((String) null, (Throwable) null, code, responseHeaders, responseBody); + this("Response Code: " + code + " Response Body: " + responseBody, (Throwable) null, code, responseHeaders, responseBody); } + /** + *

Constructor for ApiException.

+ * + * @param code HTTP status code + * @param message a {@link java.lang.String} object + */ public ApiException(int code, String message) { super(message); this.code = code; } + /** + *

Constructor for ApiException.

+ * + * @param code HTTP status code + * @param message the error message + * @param responseHeaders a {@link java.util.Map} of HTTP response headers + * @param responseBody the response body + */ public ApiException(int code, String message, Map> responseHeaders, String responseBody) { this(code, message); this.responseHeaders = responseHeaders; @@ -88,4 +154,14 @@ public Map> getResponseHeaders() { public String getResponseBody() { return responseBody; } + + /** + * Get the exception message including HTTP response data. + * + * @return The exception message + */ + public String getMessage() { + return String.format("Message: %s%nHTTP response code: %s%nHTTP response body: %s%nHTTP response headers: %s", + super.getMessage(), this.getCode(), this.getResponseBody(), this.getResponseHeaders()); + } } diff --git a/src/main/java/com/adzerk/sdk/generated/ApiResponse.java b/src/main/java/com/adzerk/sdk/generated/ApiResponse.java index 0c05a15..fdce0be 100644 --- a/src/main/java/com/adzerk/sdk/generated/ApiResponse.java +++ b/src/main/java/com/adzerk/sdk/generated/ApiResponse.java @@ -18,8 +18,6 @@ /** * API response returned by API call. - * - * @param The type of data that is deserialized from response body */ public class ApiResponse { final private int statusCode; @@ -27,6 +25,8 @@ public class ApiResponse { final private T data; /** + *

Constructor for ApiResponse.

+ * * @param statusCode The status code of HTTP response * @param headers The headers of HTTP response */ @@ -35,6 +35,8 @@ public ApiResponse(int statusCode, Map> headers) { } /** + *

Constructor for ApiResponse.

+ * * @param statusCode The status code of HTTP response * @param headers The headers of HTTP response * @param data The object deserialized from response bod @@ -45,14 +47,29 @@ public ApiResponse(int statusCode, Map> headers, T data) { this.data = data; } + /** + *

Get the status code.

+ * + * @return the status code + */ public int getStatusCode() { return statusCode; } + /** + *

Get the headers.

+ * + * @return a {@link java.util.Map} of headers + */ public Map> getHeaders() { return headers; } + /** + *

Get the data.

+ * + * @return the data + */ public T getData() { return data; } diff --git a/src/main/java/com/adzerk/sdk/generated/Configuration.java b/src/main/java/com/adzerk/sdk/generated/Configuration.java index ab4d824..603bf3c 100644 --- a/src/main/java/com/adzerk/sdk/generated/Configuration.java +++ b/src/main/java/com/adzerk/sdk/generated/Configuration.java @@ -13,27 +13,51 @@ package com.adzerk.sdk.generated; -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-07-16T01:15:27.717Z[Etc/UTC]") +import java.util.Objects; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Supplier; + +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-08-11T14:42:50.054336-03:00[America/Argentina/Cordoba]", comments = "Generator version: 7.14.0") public class Configuration { - private static ApiClient defaultApiClient = new ApiClient(); - - /** - * Get the default API client, which would be used when creating API - * instances without providing an API client. - * - * @return Default API client - */ - public static ApiClient getDefaultApiClient() { - return defaultApiClient; - } + public static final String VERSION = "1.0"; + + private static final AtomicReference defaultApiClient = new AtomicReference<>(); + private static volatile Supplier apiClientFactory = ApiClient::new; - /** - * Set the default API client, which would be used when creating API - * instances without providing an API client. - * - * @param apiClient API client - */ - public static void setDefaultApiClient(ApiClient apiClient) { - defaultApiClient = apiClient; + /** + * Get the default API client, which would be used when creating API instances without providing an API client. + * + * @return Default API client + */ + public static ApiClient getDefaultApiClient() { + ApiClient client = defaultApiClient.get(); + if (client == null) { + client = defaultApiClient.updateAndGet(val -> { + if (val != null) { // changed by another thread + return val; + } + return apiClientFactory.get(); + }); } -} + return client; + } + + /** + * Set the default API client, which would be used when creating API instances without providing an API client. + * + * @param apiClient API client + */ + public static void setDefaultApiClient(ApiClient apiClient) { + defaultApiClient.set(apiClient); + } + + /** + * set the callback used to create new ApiClient objects + */ + public static void setApiClientFactory(Supplier factory) { + apiClientFactory = Objects.requireNonNull(factory); + } + + private Configuration() { + } +} \ No newline at end of file diff --git a/src/main/java/com/adzerk/sdk/generated/JSON.java b/src/main/java/com/adzerk/sdk/generated/JSON.java index d2426d5..3bf0bf7 100644 --- a/src/main/java/com/adzerk/sdk/generated/JSON.java +++ b/src/main/java/com/adzerk/sdk/generated/JSON.java @@ -23,32 +23,40 @@ import com.google.gson.JsonElement; import io.gsonfire.GsonFireBuilder; import io.gsonfire.TypeSelector; -import org.threeten.bp.LocalDate; -import org.threeten.bp.OffsetDateTime; -import org.threeten.bp.format.DateTimeFormatter; -import com.adzerk.sdk.generated.model.*; import okio.ByteString; import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; import java.io.StringReader; import java.lang.reflect.Type; +import java.nio.charset.StandardCharsets; import java.text.DateFormat; import java.text.ParseException; import java.text.ParsePosition; +import java.time.LocalDate; +import java.time.OffsetDateTime; +import java.time.format.DateTimeFormatter; import java.util.Date; import java.util.Locale; import java.util.Map; import java.util.HashMap; +/* + * A JSON utility class + * + * NOTE: in the future, this class may be converted to static, which may break + * backward-compatibility + */ public class JSON { - private Gson gson; - private boolean isLenientOnJson = false; - private DateTypeAdapter dateTypeAdapter = new DateTypeAdapter(); - private SqlDateTypeAdapter sqlDateTypeAdapter = new SqlDateTypeAdapter(); - private OffsetDateTimeTypeAdapter offsetDateTimeTypeAdapter = new OffsetDateTimeTypeAdapter(); - private LocalDateTypeAdapter localDateTypeAdapter = new LocalDateTypeAdapter(); - private ByteArrayAdapter byteArrayAdapter = new ByteArrayAdapter(); + private static Gson gson; + private static boolean isLenientOnJson = false; + private static DateTypeAdapter dateTypeAdapter = new DateTypeAdapter(); + private static SqlDateTypeAdapter sqlDateTypeAdapter = new SqlDateTypeAdapter(); + private static OffsetDateTimeTypeAdapter offsetDateTimeTypeAdapter = new OffsetDateTimeTypeAdapter(); + private static LocalDateTypeAdapter localDateTypeAdapter = new LocalDateTypeAdapter(); + private static ByteArrayAdapter byteArrayAdapter = new ByteArrayAdapter(); @SuppressWarnings("unchecked") public static GsonBuilder createGson() { @@ -81,14 +89,26 @@ private static Class getClassByDiscriminator(Map classByDiscriminatorValue, Stri return clazz; } - public JSON() { - gson = createGson() - .registerTypeAdapter(Date.class, dateTypeAdapter) - .registerTypeAdapter(java.sql.Date.class, sqlDateTypeAdapter) - .registerTypeAdapter(OffsetDateTime.class, offsetDateTimeTypeAdapter) - .registerTypeAdapter(LocalDate.class, localDateTypeAdapter) - .registerTypeAdapter(byte[].class, byteArrayAdapter) - .create(); + static { + GsonBuilder gsonBuilder = createGson(); + gsonBuilder.registerTypeAdapter(Date.class, dateTypeAdapter); + gsonBuilder.registerTypeAdapter(java.sql.Date.class, sqlDateTypeAdapter); + gsonBuilder.registerTypeAdapter(OffsetDateTime.class, offsetDateTimeTypeAdapter); + gsonBuilder.registerTypeAdapter(LocalDate.class, localDateTypeAdapter); + gsonBuilder.registerTypeAdapter(byte[].class, byteArrayAdapter); + gsonBuilder.registerTypeAdapterFactory(new com.adzerk.sdk.generated.model.ConsentRequest.CustomTypeAdapterFactory()); + gsonBuilder.registerTypeAdapterFactory(new com.adzerk.sdk.generated.model.Content.CustomTypeAdapterFactory()); + gsonBuilder.registerTypeAdapterFactory(new com.adzerk.sdk.generated.model.Decision.CustomTypeAdapterFactory()); + gsonBuilder.registerTypeAdapterFactory(new com.adzerk.sdk.generated.model.DecisionRequest.CustomTypeAdapterFactory()); + gsonBuilder.registerTypeAdapterFactory(new com.adzerk.sdk.generated.model.DecisionResponse.CustomTypeAdapterFactory()); + gsonBuilder.registerTypeAdapterFactory(new com.adzerk.sdk.generated.model.DecisionResponseDecisionsValue.CustomTypeAdapterFactory()); + gsonBuilder.registerTypeAdapterFactory(new com.adzerk.sdk.generated.model.Event.CustomTypeAdapterFactory()); + gsonBuilder.registerTypeAdapterFactory(new com.adzerk.sdk.generated.model.MatchedPoint.CustomTypeAdapterFactory()); + gsonBuilder.registerTypeAdapterFactory(new com.adzerk.sdk.generated.model.Placement.CustomTypeAdapterFactory()); + gsonBuilder.registerTypeAdapterFactory(new com.adzerk.sdk.generated.model.PricingData.CustomTypeAdapterFactory()); + gsonBuilder.registerTypeAdapterFactory(new com.adzerk.sdk.generated.model.SkipFilters.CustomTypeAdapterFactory()); + gsonBuilder.registerTypeAdapterFactory(new com.adzerk.sdk.generated.model.User.CustomTypeAdapterFactory()); + gson = gsonBuilder.create(); } /** @@ -96,7 +116,7 @@ public JSON() { * * @return Gson */ - public Gson getGson() { + public static Gson getGson() { return gson; } @@ -104,16 +124,13 @@ public Gson getGson() { * Set Gson. * * @param gson Gson - * @return JSON */ - public JSON setGson(Gson gson) { - this.gson = gson; - return this; + public static void setGson(Gson gson) { + JSON.gson = gson; } - public JSON setLenientOnJson(boolean lenientOnJson) { + public static void setLenientOnJson(boolean lenientOnJson) { isLenientOnJson = lenientOnJson; - return this; } /** @@ -122,7 +139,7 @@ public JSON setLenientOnJson(boolean lenientOnJson) { * @param obj Object * @return String representation of the JSON */ - public String serialize(Object obj) { + public static String serialize(Object obj) { return gson.toJson(obj); } @@ -135,7 +152,7 @@ public String serialize(Object obj) { * @return The deserialized Java object */ @SuppressWarnings("unchecked") - public T deserialize(String body, Type returnType) { + public static T deserialize(String body, Type returnType) { try { if (isLenientOnJson) { JsonReader jsonReader = new JsonReader(new StringReader(body)); @@ -156,10 +173,32 @@ public T deserialize(String body, Type returnType) { } } + /** + * Deserialize the given JSON InputStream to a Java object. + * + * @param Type + * @param inputStream The JSON InputStream + * @param returnType The type to deserialize into + * @return The deserialized Java object + */ + @SuppressWarnings("unchecked") + public static T deserialize(InputStream inputStream, Type returnType) throws IOException { + try (InputStreamReader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8)) { + if (isLenientOnJson) { + // see https://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/google/gson/stream/JsonReader.html#setLenient(boolean) + JsonReader jsonReader = new JsonReader(reader); + jsonReader.setLenient(true); + return gson.fromJson(jsonReader, returnType); + } else { + return gson.fromJson(reader, returnType); + } + } + } + /** * Gson TypeAdapter for Byte Array type */ - public class ByteArrayAdapter extends TypeAdapter { + public static class ByteArrayAdapter extends TypeAdapter { @Override public void write(JsonWriter out, byte[] value) throws IOException { @@ -231,7 +270,7 @@ public OffsetDateTime read(JsonReader in) throws IOException { /** * Gson TypeAdapter for JSR310 LocalDate type */ - public class LocalDateTypeAdapter extends TypeAdapter { + public static class LocalDateTypeAdapter extends TypeAdapter { private DateTimeFormatter formatter; @@ -269,14 +308,12 @@ public LocalDate read(JsonReader in) throws IOException { } } - public JSON setOffsetDateTimeFormat(DateTimeFormatter dateFormat) { + public static void setOffsetDateTimeFormat(DateTimeFormatter dateFormat) { offsetDateTimeTypeAdapter.setFormat(dateFormat); - return this; } - public JSON setLocalDateFormat(DateTimeFormatter dateFormat) { + public static void setLocalDateFormat(DateTimeFormatter dateFormat) { localDateTypeAdapter.setFormat(dateFormat); - return this; } /** @@ -390,14 +427,11 @@ public Date read(JsonReader in) throws IOException { } } - public JSON setDateFormat(DateFormat dateFormat) { + public static void setDateFormat(DateFormat dateFormat) { dateTypeAdapter.setFormat(dateFormat); - return this; } - public JSON setSqlDateFormat(DateFormat dateFormat) { + public static void setSqlDateFormat(DateFormat dateFormat) { sqlDateTypeAdapter.setFormat(dateFormat); - return this; } - } diff --git a/src/main/java/com/adzerk/sdk/generated/Pair.java b/src/main/java/com/adzerk/sdk/generated/Pair.java index b6db0fb..2cb49de 100644 --- a/src/main/java/com/adzerk/sdk/generated/Pair.java +++ b/src/main/java/com/adzerk/sdk/generated/Pair.java @@ -13,7 +13,7 @@ package com.adzerk.sdk.generated; -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-07-16T01:15:27.717Z[Etc/UTC]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-08-11T14:42:50.054336-03:00[America/Argentina/Cordoba]", comments = "Generator version: 7.14.0") public class Pair { private String name = ""; private String value = ""; @@ -52,10 +52,6 @@ private boolean isValidString(String arg) { return false; } - if (arg.trim().isEmpty()) { - return false; - } - return true; } } diff --git a/src/main/java/com/adzerk/sdk/generated/ProgressResponseBody.java b/src/main/java/com/adzerk/sdk/generated/ProgressResponseBody.java index e2b0215..2f113b4 100644 --- a/src/main/java/com/adzerk/sdk/generated/ProgressResponseBody.java +++ b/src/main/java/com/adzerk/sdk/generated/ProgressResponseBody.java @@ -68,5 +68,3 @@ public long read(Buffer sink, long byteCount) throws IOException { }; } } - - diff --git a/src/main/java/com/adzerk/sdk/generated/ServerConfiguration.java b/src/main/java/com/adzerk/sdk/generated/ServerConfiguration.java index 1588927..da60fd2 100644 --- a/src/main/java/com/adzerk/sdk/generated/ServerConfiguration.java +++ b/src/main/java/com/adzerk/sdk/generated/ServerConfiguration.java @@ -1,3 +1,16 @@ +/* + * Adzerk Decision API + * Adzerk Decision API + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + package com.adzerk.sdk.generated; import java.util.Map; @@ -5,6 +18,7 @@ /** * Representing a Server configuration. */ +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-08-11T14:42:50.054336-03:00[America/Argentina/Cordoba]", comments = "Generator version: 7.14.0") public class ServerConfiguration { public String URL; public String description; @@ -12,7 +26,7 @@ public class ServerConfiguration { /** * @param URL A URL to the target host. - * @param description A describtion of the host designated by the URL. + * @param description A description of the host designated by the URL. * @param variables A map between a variable name and its value. The value is used for substitution in the server's URL template. */ public ServerConfiguration(String URL, String description, Map variables) { @@ -39,10 +53,10 @@ public String URL(Map variables) { if (variables != null && variables.containsKey(name)) { value = variables.get(name); if (serverVariable.enumValues.size() > 0 && !serverVariable.enumValues.contains(value)) { - throw new RuntimeException("The variable " + name + " in the server URL has invalid value " + value + "."); + throw new IllegalArgumentException("The variable " + name + " in the server URL has invalid value " + value + "."); } } - url = url.replaceAll("\\{" + name + "\\}", value); + url = url.replace("{" + name + "}", value); } return url; } diff --git a/src/main/java/com/adzerk/sdk/generated/ServerVariable.java b/src/main/java/com/adzerk/sdk/generated/ServerVariable.java index 445cef2..449cc29 100644 --- a/src/main/java/com/adzerk/sdk/generated/ServerVariable.java +++ b/src/main/java/com/adzerk/sdk/generated/ServerVariable.java @@ -1,3 +1,16 @@ +/* + * Adzerk Decision API + * Adzerk Decision API + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + package com.adzerk.sdk.generated; import java.util.HashSet; @@ -5,6 +18,7 @@ /** * Representing a Server Variable for server URL template substitution. */ +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-08-11T14:42:50.054336-03:00[America/Argentina/Cordoba]", comments = "Generator version: 7.14.0") public class ServerVariable { public String description; public String defaultValue; diff --git a/src/main/java/com/adzerk/sdk/generated/StringUtil.java b/src/main/java/com/adzerk/sdk/generated/StringUtil.java index 24b4fe2..26c16b0 100644 --- a/src/main/java/com/adzerk/sdk/generated/StringUtil.java +++ b/src/main/java/com/adzerk/sdk/generated/StringUtil.java @@ -16,7 +16,7 @@ import java.util.Collection; import java.util.Iterator; -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-07-16T01:15:27.717Z[Etc/UTC]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-08-11T14:42:50.054336-03:00[America/Argentina/Cordoba]", comments = "Generator version: 7.14.0") public class StringUtil { /** * Check if the given array contains the given value (with case-insensitive comparison). diff --git a/src/main/java/com/adzerk/sdk/generated/api/DecisionApi.java b/src/main/java/com/adzerk/sdk/generated/api/DecisionApi.java index 41d03b7..9ce3750 100644 --- a/src/main/java/com/adzerk/sdk/generated/api/DecisionApi.java +++ b/src/main/java/com/adzerk/sdk/generated/api/DecisionApi.java @@ -38,6 +38,8 @@ public class DecisionApi { private ApiClient localVarApiClient; + private int localHostIndex; + private String localCustomBaseUrl; public DecisionApi() { this(Configuration.getDefaultApiClient()); @@ -55,6 +57,22 @@ public void setApiClient(ApiClient apiClient) { this.localVarApiClient = apiClient; } + public int getHostIndex() { + return localHostIndex; + } + + public void setHostIndex(int hostIndex) { + this.localHostIndex = hostIndex; + } + + public String getCustomBaseUrl() { + return localCustomBaseUrl; + } + + public void setCustomBaseUrl(String customBaseUrl) { + this.localCustomBaseUrl = customBaseUrl; + } + /** * Build call for getDecisions * @param decisionRequest (optional) @@ -62,13 +80,27 @@ public void setApiClient(ApiClient apiClient) { * @return Call to execute * @throws ApiException If fail to serialize the request body object * @http.response.details - +
+
Response Details
Status Code Description Response Headers
400 Bad Request -
200 Successful decision request -
*/ - public okhttp3.Call getDecisionsCall(DecisionRequest decisionRequest, final ApiCallback _callback) throws ApiException { + public okhttp3.Call getDecisionsCall(@javax.annotation.Nullable DecisionRequest decisionRequest, final ApiCallback _callback) throws ApiException { + String basePath = null; + // Operation Servers + String[] localBasePaths = new String[] { }; + + // Determine Base Path to Use + if (localCustomBaseUrl != null){ + basePath = localCustomBaseUrl; + } else if ( localBasePaths.length > 0 ) { + basePath = localBasePaths[localHostIndex]; + } else { + basePath = null; + } + Object localVarPostBody = decisionRequest; // create path and map variables @@ -92,18 +124,17 @@ public okhttp3.Call getDecisionsCall(DecisionRequest decisionRequest, final ApiC "application/json" }; final String localVarContentType = localVarApiClient.selectHeaderContentType(localVarContentTypes); - localVarHeaderParams.put("Content-Type", localVarContentType); + if (localVarContentType != null) { + localVarHeaderParams.put("Content-Type", localVarContentType); + } String[] localVarAuthNames = new String[] { }; - return localVarApiClient.buildCall(localVarPath, "POST", localVarQueryParams, localVarCollectionQueryParams, localVarPostBody, localVarHeaderParams, localVarCookieParams, localVarFormParams, localVarAuthNames, _callback); + return localVarApiClient.buildCall(basePath, localVarPath, "POST", localVarQueryParams, localVarCollectionQueryParams, localVarPostBody, localVarHeaderParams, localVarCookieParams, localVarFormParams, localVarAuthNames, _callback); } @SuppressWarnings("rawtypes") - private okhttp3.Call getDecisionsValidateBeforeCall(DecisionRequest decisionRequest, final ApiCallback _callback) throws ApiException { - - - okhttp3.Call localVarCall = getDecisionsCall(decisionRequest, _callback); - return localVarCall; + private okhttp3.Call getDecisionsValidateBeforeCall(@javax.annotation.Nullable DecisionRequest decisionRequest, final ApiCallback _callback) throws ApiException { + return getDecisionsCall(decisionRequest, _callback); } @@ -114,13 +145,14 @@ private okhttp3.Call getDecisionsValidateBeforeCall(DecisionRequest decisionRequ * @return DecisionResponse * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body * @http.response.details - +
+
Response Details
Status Code Description Response Headers
400 Bad Request -
200 Successful decision request -
*/ - public DecisionResponse getDecisions(DecisionRequest decisionRequest) throws ApiException { + public DecisionResponse getDecisions(@javax.annotation.Nullable DecisionRequest decisionRequest) throws ApiException { ApiResponse localVarResp = getDecisionsWithHttpInfo(decisionRequest); return localVarResp.getData(); } @@ -132,13 +164,14 @@ public DecisionResponse getDecisions(DecisionRequest decisionRequest) throws Api * @return ApiResponse<DecisionResponse> * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body * @http.response.details - +
+
Response Details
Status Code Description Response Headers
400 Bad Request -
200 Successful decision request -
*/ - public ApiResponse getDecisionsWithHttpInfo(DecisionRequest decisionRequest) throws ApiException { + public ApiResponse getDecisionsWithHttpInfo(@javax.annotation.Nullable DecisionRequest decisionRequest) throws ApiException { okhttp3.Call localVarCall = getDecisionsValidateBeforeCall(decisionRequest, null); Type localVarReturnType = new TypeToken(){}.getType(); return localVarApiClient.execute(localVarCall, localVarReturnType); @@ -152,13 +185,14 @@ public ApiResponse getDecisionsWithHttpInfo(DecisionRequest de * @return The request call * @throws ApiException If fail to process the API call, e.g. serializing the request body object * @http.response.details - +
+
Response Details
Status Code Description Response Headers
400 Bad Request -
200 Successful decision request -
*/ - public okhttp3.Call getDecisionsAsync(DecisionRequest decisionRequest, final ApiCallback _callback) throws ApiException { + public okhttp3.Call getDecisionsAsync(@javax.annotation.Nullable DecisionRequest decisionRequest, final ApiCallback _callback) throws ApiException { okhttp3.Call localVarCall = getDecisionsValidateBeforeCall(decisionRequest, _callback); Type localVarReturnType = new TypeToken(){}.getType(); diff --git a/src/main/java/com/adzerk/sdk/generated/api/UserdbApi.java b/src/main/java/com/adzerk/sdk/generated/api/UserdbApi.java index 8896be2..86cafc8 100644 --- a/src/main/java/com/adzerk/sdk/generated/api/UserdbApi.java +++ b/src/main/java/com/adzerk/sdk/generated/api/UserdbApi.java @@ -38,6 +38,8 @@ public class UserdbApi { private ApiClient localVarApiClient; + private int localHostIndex; + private String localCustomBaseUrl; public UserdbApi() { this(Configuration.getDefaultApiClient()); @@ -55,6 +57,22 @@ public void setApiClient(ApiClient apiClient) { this.localVarApiClient = apiClient; } + public int getHostIndex() { + return localHostIndex; + } + + public void setHostIndex(int hostIndex) { + this.localHostIndex = hostIndex; + } + + public String getCustomBaseUrl() { + return localCustomBaseUrl; + } + + public void setCustomBaseUrl(String customBaseUrl) { + this.localCustomBaseUrl = customBaseUrl; + } + /** * Build call for addCustomProperties * @param networkId Your Network Id (required) @@ -64,17 +82,31 @@ public void setApiClient(ApiClient apiClient) { * @return Call to execute * @throws ApiException If fail to serialize the request body object * @http.response.details - +
+
Response Details
Status Code Description Response Headers
200 Success -
*/ - public okhttp3.Call addCustomPropertiesCall(Integer networkId, String userKey, Object body, final ApiCallback _callback) throws ApiException { + public okhttp3.Call addCustomPropertiesCall(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull String userKey, @javax.annotation.Nullable Object body, final ApiCallback _callback) throws ApiException { + String basePath = null; + // Operation Servers + String[] localBasePaths = new String[] { }; + + // Determine Base Path to Use + if (localCustomBaseUrl != null){ + basePath = localCustomBaseUrl; + } else if ( localBasePaths.length > 0 ) { + basePath = localBasePaths[localHostIndex]; + } else { + basePath = null; + } + Object localVarPostBody = body; // create path and map variables String localVarPath = "/udb/{networkId}/custom" - .replaceAll("\\{" + "networkId" + "\\}", localVarApiClient.escapeString(networkId.toString())); + .replace("{" + "networkId" + "}", localVarApiClient.escapeString(networkId.toString())); List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); @@ -98,28 +130,27 @@ public okhttp3.Call addCustomPropertiesCall(Integer networkId, String userKey, O "application/json" }; final String localVarContentType = localVarApiClient.selectHeaderContentType(localVarContentTypes); - localVarHeaderParams.put("Content-Type", localVarContentType); + if (localVarContentType != null) { + localVarHeaderParams.put("Content-Type", localVarContentType); + } String[] localVarAuthNames = new String[] { "ApiKeyAuth" }; - return localVarApiClient.buildCall(localVarPath, "POST", localVarQueryParams, localVarCollectionQueryParams, localVarPostBody, localVarHeaderParams, localVarCookieParams, localVarFormParams, localVarAuthNames, _callback); + return localVarApiClient.buildCall(basePath, localVarPath, "POST", localVarQueryParams, localVarCollectionQueryParams, localVarPostBody, localVarHeaderParams, localVarCookieParams, localVarFormParams, localVarAuthNames, _callback); } @SuppressWarnings("rawtypes") - private okhttp3.Call addCustomPropertiesValidateBeforeCall(Integer networkId, String userKey, Object body, final ApiCallback _callback) throws ApiException { - + private okhttp3.Call addCustomPropertiesValidateBeforeCall(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull String userKey, @javax.annotation.Nullable Object body, final ApiCallback _callback) throws ApiException { // verify the required parameter 'networkId' is set if (networkId == null) { throw new ApiException("Missing the required parameter 'networkId' when calling addCustomProperties(Async)"); } - + // verify the required parameter 'userKey' is set if (userKey == null) { throw new ApiException("Missing the required parameter 'userKey' when calling addCustomProperties(Async)"); } - - okhttp3.Call localVarCall = addCustomPropertiesCall(networkId, userKey, body, _callback); - return localVarCall; + return addCustomPropertiesCall(networkId, userKey, body, _callback); } @@ -132,12 +163,13 @@ private okhttp3.Call addCustomPropertiesValidateBeforeCall(Integer networkId, St * @return File * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body * @http.response.details - +
+
Response Details
Status Code Description Response Headers
200 Success -
*/ - public File addCustomProperties(Integer networkId, String userKey, Object body) throws ApiException { + public File addCustomProperties(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull String userKey, @javax.annotation.Nullable Object body) throws ApiException { ApiResponse localVarResp = addCustomPropertiesWithHttpInfo(networkId, userKey, body); return localVarResp.getData(); } @@ -151,12 +183,13 @@ public File addCustomProperties(Integer networkId, String userKey, Object body) * @return ApiResponse<File> * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body * @http.response.details - +
+
Response Details
Status Code Description Response Headers
200 Success -
*/ - public ApiResponse addCustomPropertiesWithHttpInfo(Integer networkId, String userKey, Object body) throws ApiException { + public ApiResponse addCustomPropertiesWithHttpInfo(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull String userKey, @javax.annotation.Nullable Object body) throws ApiException { okhttp3.Call localVarCall = addCustomPropertiesValidateBeforeCall(networkId, userKey, body, null); Type localVarReturnType = new TypeToken(){}.getType(); return localVarApiClient.execute(localVarCall, localVarReturnType); @@ -172,12 +205,13 @@ public ApiResponse addCustomPropertiesWithHttpInfo(Integer networkId, Stri * @return The request call * @throws ApiException If fail to process the API call, e.g. serializing the request body object * @http.response.details - +
+
Response Details
Status Code Description Response Headers
200 Success -
*/ - public okhttp3.Call addCustomPropertiesAsync(Integer networkId, String userKey, Object body, final ApiCallback _callback) throws ApiException { + public okhttp3.Call addCustomPropertiesAsync(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull String userKey, @javax.annotation.Nullable Object body, final ApiCallback _callback) throws ApiException { okhttp3.Call localVarCall = addCustomPropertiesValidateBeforeCall(networkId, userKey, body, _callback); Type localVarReturnType = new TypeToken(){}.getType(); @@ -193,17 +227,31 @@ public okhttp3.Call addCustomPropertiesAsync(Integer networkId, String userKey, * @return Call to execute * @throws ApiException If fail to serialize the request body object * @http.response.details - +
+
Response Details
Status Code Description Response Headers
200 Success -
*/ - public okhttp3.Call addInterestsCall(Integer networkId, String userKey, String interest, final ApiCallback _callback) throws ApiException { + public okhttp3.Call addInterestsCall(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull String userKey, @javax.annotation.Nonnull String interest, final ApiCallback _callback) throws ApiException { + String basePath = null; + // Operation Servers + String[] localBasePaths = new String[] { }; + + // Determine Base Path to Use + if (localCustomBaseUrl != null){ + basePath = localCustomBaseUrl; + } else if ( localBasePaths.length > 0 ) { + basePath = localBasePaths[localHostIndex]; + } else { + basePath = null; + } + Object localVarPostBody = null; // create path and map variables String localVarPath = "/udb/{networkId}/interest/i.gif" - .replaceAll("\\{" + "networkId" + "\\}", localVarApiClient.escapeString(networkId.toString())); + .replace("{" + "networkId" + "}", localVarApiClient.escapeString(networkId.toString())); List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); @@ -228,36 +276,34 @@ public okhttp3.Call addInterestsCall(Integer networkId, String userKey, String i } final String[] localVarContentTypes = { - }; final String localVarContentType = localVarApiClient.selectHeaderContentType(localVarContentTypes); - localVarHeaderParams.put("Content-Type", localVarContentType); + if (localVarContentType != null) { + localVarHeaderParams.put("Content-Type", localVarContentType); + } String[] localVarAuthNames = new String[] { }; - return localVarApiClient.buildCall(localVarPath, "GET", localVarQueryParams, localVarCollectionQueryParams, localVarPostBody, localVarHeaderParams, localVarCookieParams, localVarFormParams, localVarAuthNames, _callback); + return localVarApiClient.buildCall(basePath, localVarPath, "GET", localVarQueryParams, localVarCollectionQueryParams, localVarPostBody, localVarHeaderParams, localVarCookieParams, localVarFormParams, localVarAuthNames, _callback); } @SuppressWarnings("rawtypes") - private okhttp3.Call addInterestsValidateBeforeCall(Integer networkId, String userKey, String interest, final ApiCallback _callback) throws ApiException { - + private okhttp3.Call addInterestsValidateBeforeCall(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull String userKey, @javax.annotation.Nonnull String interest, final ApiCallback _callback) throws ApiException { // verify the required parameter 'networkId' is set if (networkId == null) { throw new ApiException("Missing the required parameter 'networkId' when calling addInterests(Async)"); } - + // verify the required parameter 'userKey' is set if (userKey == null) { throw new ApiException("Missing the required parameter 'userKey' when calling addInterests(Async)"); } - + // verify the required parameter 'interest' is set if (interest == null) { throw new ApiException("Missing the required parameter 'interest' when calling addInterests(Async)"); } - - okhttp3.Call localVarCall = addInterestsCall(networkId, userKey, interest, _callback); - return localVarCall; + return addInterestsCall(networkId, userKey, interest, _callback); } @@ -270,12 +316,13 @@ private okhttp3.Call addInterestsValidateBeforeCall(Integer networkId, String us * @return File * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body * @http.response.details - +
+
Response Details
Status Code Description Response Headers
200 Success -
*/ - public File addInterests(Integer networkId, String userKey, String interest) throws ApiException { + public File addInterests(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull String userKey, @javax.annotation.Nonnull String interest) throws ApiException { ApiResponse localVarResp = addInterestsWithHttpInfo(networkId, userKey, interest); return localVarResp.getData(); } @@ -289,12 +336,13 @@ public File addInterests(Integer networkId, String userKey, String interest) thr * @return ApiResponse<File> * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body * @http.response.details - +
+
Response Details
Status Code Description Response Headers
200 Success -
*/ - public ApiResponse addInterestsWithHttpInfo(Integer networkId, String userKey, String interest) throws ApiException { + public ApiResponse addInterestsWithHttpInfo(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull String userKey, @javax.annotation.Nonnull String interest) throws ApiException { okhttp3.Call localVarCall = addInterestsValidateBeforeCall(networkId, userKey, interest, null); Type localVarReturnType = new TypeToken(){}.getType(); return localVarApiClient.execute(localVarCall, localVarReturnType); @@ -310,12 +358,13 @@ public ApiResponse addInterestsWithHttpInfo(Integer networkId, String user * @return The request call * @throws ApiException If fail to process the API call, e.g. serializing the request body object * @http.response.details - +
+
Response Details
Status Code Description Response Headers
200 Success -
*/ - public okhttp3.Call addInterestsAsync(Integer networkId, String userKey, String interest, final ApiCallback _callback) throws ApiException { + public okhttp3.Call addInterestsAsync(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull String userKey, @javax.annotation.Nonnull String interest, final ApiCallback _callback) throws ApiException { okhttp3.Call localVarCall = addInterestsValidateBeforeCall(networkId, userKey, interest, _callback); Type localVarReturnType = new TypeToken(){}.getType(); @@ -332,19 +381,33 @@ public okhttp3.Call addInterestsAsync(Integer networkId, String userKey, String * @return Call to execute * @throws ApiException If fail to serialize the request body object * @http.response.details - +
+
Response Details
Status Code Description Response Headers
200 Success -
*/ - public okhttp3.Call addRetargetingSegmentCall(Integer networkId, Integer advertiserId, Integer retargetingSegmentId, String userKey, final ApiCallback _callback) throws ApiException { + public okhttp3.Call addRetargetingSegmentCall(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull Integer advertiserId, @javax.annotation.Nonnull Integer retargetingSegmentId, @javax.annotation.Nonnull String userKey, final ApiCallback _callback) throws ApiException { + String basePath = null; + // Operation Servers + String[] localBasePaths = new String[] { }; + + // Determine Base Path to Use + if (localCustomBaseUrl != null){ + basePath = localCustomBaseUrl; + } else if ( localBasePaths.length > 0 ) { + basePath = localBasePaths[localHostIndex]; + } else { + basePath = null; + } + Object localVarPostBody = null; // create path and map variables String localVarPath = "/udb/{networkId}/rt/{advertiserId}/{retargetingSegmentId}/i.gif" - .replaceAll("\\{" + "networkId" + "\\}", localVarApiClient.escapeString(networkId.toString())) - .replaceAll("\\{" + "advertiserId" + "\\}", localVarApiClient.escapeString(advertiserId.toString())) - .replaceAll("\\{" + "retargetingSegmentId" + "\\}", localVarApiClient.escapeString(retargetingSegmentId.toString())); + .replace("{" + "networkId" + "}", localVarApiClient.escapeString(networkId.toString())) + .replace("{" + "advertiserId" + "}", localVarApiClient.escapeString(advertiserId.toString())) + .replace("{" + "retargetingSegmentId" + "}", localVarApiClient.escapeString(retargetingSegmentId.toString())); List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); @@ -365,41 +428,39 @@ public okhttp3.Call addRetargetingSegmentCall(Integer networkId, Integer adverti } final String[] localVarContentTypes = { - }; final String localVarContentType = localVarApiClient.selectHeaderContentType(localVarContentTypes); - localVarHeaderParams.put("Content-Type", localVarContentType); + if (localVarContentType != null) { + localVarHeaderParams.put("Content-Type", localVarContentType); + } String[] localVarAuthNames = new String[] { }; - return localVarApiClient.buildCall(localVarPath, "GET", localVarQueryParams, localVarCollectionQueryParams, localVarPostBody, localVarHeaderParams, localVarCookieParams, localVarFormParams, localVarAuthNames, _callback); + return localVarApiClient.buildCall(basePath, localVarPath, "GET", localVarQueryParams, localVarCollectionQueryParams, localVarPostBody, localVarHeaderParams, localVarCookieParams, localVarFormParams, localVarAuthNames, _callback); } @SuppressWarnings("rawtypes") - private okhttp3.Call addRetargetingSegmentValidateBeforeCall(Integer networkId, Integer advertiserId, Integer retargetingSegmentId, String userKey, final ApiCallback _callback) throws ApiException { - + private okhttp3.Call addRetargetingSegmentValidateBeforeCall(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull Integer advertiserId, @javax.annotation.Nonnull Integer retargetingSegmentId, @javax.annotation.Nonnull String userKey, final ApiCallback _callback) throws ApiException { // verify the required parameter 'networkId' is set if (networkId == null) { throw new ApiException("Missing the required parameter 'networkId' when calling addRetargetingSegment(Async)"); } - + // verify the required parameter 'advertiserId' is set if (advertiserId == null) { throw new ApiException("Missing the required parameter 'advertiserId' when calling addRetargetingSegment(Async)"); } - + // verify the required parameter 'retargetingSegmentId' is set if (retargetingSegmentId == null) { throw new ApiException("Missing the required parameter 'retargetingSegmentId' when calling addRetargetingSegment(Async)"); } - + // verify the required parameter 'userKey' is set if (userKey == null) { throw new ApiException("Missing the required parameter 'userKey' when calling addRetargetingSegment(Async)"); } - - okhttp3.Call localVarCall = addRetargetingSegmentCall(networkId, advertiserId, retargetingSegmentId, userKey, _callback); - return localVarCall; + return addRetargetingSegmentCall(networkId, advertiserId, retargetingSegmentId, userKey, _callback); } @@ -413,12 +474,13 @@ private okhttp3.Call addRetargetingSegmentValidateBeforeCall(Integer networkId, * @return File * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body * @http.response.details - +
+
Response Details
Status Code Description Response Headers
200 Success -
*/ - public File addRetargetingSegment(Integer networkId, Integer advertiserId, Integer retargetingSegmentId, String userKey) throws ApiException { + public File addRetargetingSegment(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull Integer advertiserId, @javax.annotation.Nonnull Integer retargetingSegmentId, @javax.annotation.Nonnull String userKey) throws ApiException { ApiResponse localVarResp = addRetargetingSegmentWithHttpInfo(networkId, advertiserId, retargetingSegmentId, userKey); return localVarResp.getData(); } @@ -433,12 +495,13 @@ public File addRetargetingSegment(Integer networkId, Integer advertiserId, Integ * @return ApiResponse<File> * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body * @http.response.details - +
+
Response Details
Status Code Description Response Headers
200 Success -
*/ - public ApiResponse addRetargetingSegmentWithHttpInfo(Integer networkId, Integer advertiserId, Integer retargetingSegmentId, String userKey) throws ApiException { + public ApiResponse addRetargetingSegmentWithHttpInfo(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull Integer advertiserId, @javax.annotation.Nonnull Integer retargetingSegmentId, @javax.annotation.Nonnull String userKey) throws ApiException { okhttp3.Call localVarCall = addRetargetingSegmentValidateBeforeCall(networkId, advertiserId, retargetingSegmentId, userKey, null); Type localVarReturnType = new TypeToken(){}.getType(); return localVarApiClient.execute(localVarCall, localVarReturnType); @@ -455,12 +518,13 @@ public ApiResponse addRetargetingSegmentWithHttpInfo(Integer networkId, In * @return The request call * @throws ApiException If fail to process the API call, e.g. serializing the request body object * @http.response.details - +
+
Response Details
Status Code Description Response Headers
200 Success -
*/ - public okhttp3.Call addRetargetingSegmentAsync(Integer networkId, Integer advertiserId, Integer retargetingSegmentId, String userKey, final ApiCallback _callback) throws ApiException { + public okhttp3.Call addRetargetingSegmentAsync(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull Integer advertiserId, @javax.annotation.Nonnull Integer retargetingSegmentId, @javax.annotation.Nonnull String userKey, final ApiCallback _callback) throws ApiException { okhttp3.Call localVarCall = addRetargetingSegmentValidateBeforeCall(networkId, advertiserId, retargetingSegmentId, userKey, _callback); Type localVarReturnType = new TypeToken(){}.getType(); @@ -475,17 +539,31 @@ public okhttp3.Call addRetargetingSegmentAsync(Integer networkId, Integer advert * @return Call to execute * @throws ApiException If fail to serialize the request body object * @http.response.details - +
+
Response Details
Status Code Description Response Headers
200 Success -
*/ - public okhttp3.Call forgetCall(Integer networkId, String userKey, final ApiCallback _callback) throws ApiException { + public okhttp3.Call forgetCall(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull String userKey, final ApiCallback _callback) throws ApiException { + String basePath = null; + // Operation Servers + String[] localBasePaths = new String[] { }; + + // Determine Base Path to Use + if (localCustomBaseUrl != null){ + basePath = localCustomBaseUrl; + } else if ( localBasePaths.length > 0 ) { + basePath = localBasePaths[localHostIndex]; + } else { + basePath = null; + } + Object localVarPostBody = null; // create path and map variables String localVarPath = "/udb/{networkId}" - .replaceAll("\\{" + "networkId" + "\\}", localVarApiClient.escapeString(networkId.toString())); + .replace("{" + "networkId" + "}", localVarApiClient.escapeString(networkId.toString())); List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); @@ -498,7 +576,6 @@ public okhttp3.Call forgetCall(Integer networkId, String userKey, final ApiCallb } final String[] localVarAccepts = { - }; final String localVarAccept = localVarApiClient.selectHeaderAccept(localVarAccepts); if (localVarAccept != null) { @@ -506,31 +583,29 @@ public okhttp3.Call forgetCall(Integer networkId, String userKey, final ApiCallb } final String[] localVarContentTypes = { - }; final String localVarContentType = localVarApiClient.selectHeaderContentType(localVarContentTypes); - localVarHeaderParams.put("Content-Type", localVarContentType); + if (localVarContentType != null) { + localVarHeaderParams.put("Content-Type", localVarContentType); + } String[] localVarAuthNames = new String[] { "ApiKeyAuth" }; - return localVarApiClient.buildCall(localVarPath, "DELETE", localVarQueryParams, localVarCollectionQueryParams, localVarPostBody, localVarHeaderParams, localVarCookieParams, localVarFormParams, localVarAuthNames, _callback); + return localVarApiClient.buildCall(basePath, localVarPath, "DELETE", localVarQueryParams, localVarCollectionQueryParams, localVarPostBody, localVarHeaderParams, localVarCookieParams, localVarFormParams, localVarAuthNames, _callback); } @SuppressWarnings("rawtypes") - private okhttp3.Call forgetValidateBeforeCall(Integer networkId, String userKey, final ApiCallback _callback) throws ApiException { - + private okhttp3.Call forgetValidateBeforeCall(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull String userKey, final ApiCallback _callback) throws ApiException { // verify the required parameter 'networkId' is set if (networkId == null) { throw new ApiException("Missing the required parameter 'networkId' when calling forget(Async)"); } - + // verify the required parameter 'userKey' is set if (userKey == null) { throw new ApiException("Missing the required parameter 'userKey' when calling forget(Async)"); } - - okhttp3.Call localVarCall = forgetCall(networkId, userKey, _callback); - return localVarCall; + return forgetCall(networkId, userKey, _callback); } @@ -541,12 +616,13 @@ private okhttp3.Call forgetValidateBeforeCall(Integer networkId, String userKey, * @param userKey The User's UserDB Key (required) * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body * @http.response.details - +
+
Response Details
Status Code Description Response Headers
200 Success -
*/ - public void forget(Integer networkId, String userKey) throws ApiException { + public void forget(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull String userKey) throws ApiException { forgetWithHttpInfo(networkId, userKey); } @@ -558,12 +634,13 @@ public void forget(Integer networkId, String userKey) throws ApiException { * @return ApiResponse<Void> * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body * @http.response.details - +
+
Response Details
Status Code Description Response Headers
200 Success -
*/ - public ApiResponse forgetWithHttpInfo(Integer networkId, String userKey) throws ApiException { + public ApiResponse forgetWithHttpInfo(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull String userKey) throws ApiException { okhttp3.Call localVarCall = forgetValidateBeforeCall(networkId, userKey, null); return localVarApiClient.execute(localVarCall); } @@ -577,12 +654,13 @@ public ApiResponse forgetWithHttpInfo(Integer networkId, String userKey) t * @return The request call * @throws ApiException If fail to process the API call, e.g. serializing the request body object * @http.response.details - +
+
Response Details
Status Code Description Response Headers
200 Success -
*/ - public okhttp3.Call forgetAsync(Integer networkId, String userKey, final ApiCallback _callback) throws ApiException { + public okhttp3.Call forgetAsync(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull String userKey, final ApiCallback _callback) throws ApiException { okhttp3.Call localVarCall = forgetValidateBeforeCall(networkId, userKey, _callback); localVarApiClient.executeAsync(localVarCall, _callback); @@ -596,17 +674,31 @@ public okhttp3.Call forgetAsync(Integer networkId, String userKey, final ApiCall * @return Call to execute * @throws ApiException If fail to serialize the request body object * @http.response.details - +
+
Response Details
Status Code Description Response Headers
200 Success -
*/ - public okhttp3.Call gdprConsentCall(Integer networkId, ConsentRequest consentRequest, final ApiCallback _callback) throws ApiException { + public okhttp3.Call gdprConsentCall(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nullable ConsentRequest consentRequest, final ApiCallback _callback) throws ApiException { + String basePath = null; + // Operation Servers + String[] localBasePaths = new String[] { }; + + // Determine Base Path to Use + if (localCustomBaseUrl != null){ + basePath = localCustomBaseUrl; + } else if ( localBasePaths.length > 0 ) { + basePath = localBasePaths[localHostIndex]; + } else { + basePath = null; + } + Object localVarPostBody = consentRequest; // create path and map variables String localVarPath = "/udb/{networkId}/consent" - .replaceAll("\\{" + "networkId" + "\\}", localVarApiClient.escapeString(networkId.toString())); + .replace("{" + "networkId" + "}", localVarApiClient.escapeString(networkId.toString())); List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); @@ -626,23 +718,22 @@ public okhttp3.Call gdprConsentCall(Integer networkId, ConsentRequest consentReq "application/json" }; final String localVarContentType = localVarApiClient.selectHeaderContentType(localVarContentTypes); - localVarHeaderParams.put("Content-Type", localVarContentType); + if (localVarContentType != null) { + localVarHeaderParams.put("Content-Type", localVarContentType); + } String[] localVarAuthNames = new String[] { "ApiKeyAuth" }; - return localVarApiClient.buildCall(localVarPath, "POST", localVarQueryParams, localVarCollectionQueryParams, localVarPostBody, localVarHeaderParams, localVarCookieParams, localVarFormParams, localVarAuthNames, _callback); + return localVarApiClient.buildCall(basePath, localVarPath, "POST", localVarQueryParams, localVarCollectionQueryParams, localVarPostBody, localVarHeaderParams, localVarCookieParams, localVarFormParams, localVarAuthNames, _callback); } @SuppressWarnings("rawtypes") - private okhttp3.Call gdprConsentValidateBeforeCall(Integer networkId, ConsentRequest consentRequest, final ApiCallback _callback) throws ApiException { - + private okhttp3.Call gdprConsentValidateBeforeCall(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nullable ConsentRequest consentRequest, final ApiCallback _callback) throws ApiException { // verify the required parameter 'networkId' is set if (networkId == null) { throw new ApiException("Missing the required parameter 'networkId' when calling gdprConsent(Async)"); } - - okhttp3.Call localVarCall = gdprConsentCall(networkId, consentRequest, _callback); - return localVarCall; + return gdprConsentCall(networkId, consentRequest, _callback); } @@ -654,12 +745,13 @@ private okhttp3.Call gdprConsentValidateBeforeCall(Integer networkId, ConsentReq * @return File * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body * @http.response.details - +
+
Response Details
Status Code Description Response Headers
200 Success -
*/ - public File gdprConsent(Integer networkId, ConsentRequest consentRequest) throws ApiException { + public File gdprConsent(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nullable ConsentRequest consentRequest) throws ApiException { ApiResponse localVarResp = gdprConsentWithHttpInfo(networkId, consentRequest); return localVarResp.getData(); } @@ -672,12 +764,13 @@ public File gdprConsent(Integer networkId, ConsentRequest consentRequest) throws * @return ApiResponse<File> * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body * @http.response.details - +
+
Response Details
Status Code Description Response Headers
200 Success -
*/ - public ApiResponse gdprConsentWithHttpInfo(Integer networkId, ConsentRequest consentRequest) throws ApiException { + public ApiResponse gdprConsentWithHttpInfo(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nullable ConsentRequest consentRequest) throws ApiException { okhttp3.Call localVarCall = gdprConsentValidateBeforeCall(networkId, consentRequest, null); Type localVarReturnType = new TypeToken(){}.getType(); return localVarApiClient.execute(localVarCall, localVarReturnType); @@ -692,12 +785,13 @@ public ApiResponse gdprConsentWithHttpInfo(Integer networkId, ConsentReque * @return The request call * @throws ApiException If fail to process the API call, e.g. serializing the request body object * @http.response.details - +
+
Response Details
Status Code Description Response Headers
200 Success -
*/ - public okhttp3.Call gdprConsentAsync(Integer networkId, ConsentRequest consentRequest, final ApiCallback _callback) throws ApiException { + public okhttp3.Call gdprConsentAsync(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nullable ConsentRequest consentRequest, final ApiCallback _callback) throws ApiException { okhttp3.Call localVarCall = gdprConsentValidateBeforeCall(networkId, consentRequest, _callback); Type localVarReturnType = new TypeToken(){}.getType(); @@ -713,17 +807,31 @@ public okhttp3.Call gdprConsentAsync(Integer networkId, ConsentRequest consentRe * @return Call to execute * @throws ApiException If fail to serialize the request body object * @http.response.details - +
+
Response Details
Status Code Description Response Headers
200 The updated UserDB record -
*/ - public okhttp3.Call ipOverrideCall(Integer networkId, String userKey, String ip, final ApiCallback _callback) throws ApiException { + public okhttp3.Call ipOverrideCall(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull String userKey, @javax.annotation.Nonnull String ip, final ApiCallback _callback) throws ApiException { + String basePath = null; + // Operation Servers + String[] localBasePaths = new String[] { }; + + // Determine Base Path to Use + if (localCustomBaseUrl != null){ + basePath = localCustomBaseUrl; + } else if ( localBasePaths.length > 0 ) { + basePath = localBasePaths[localHostIndex]; + } else { + basePath = null; + } + Object localVarPostBody = null; // create path and map variables String localVarPath = "/udb/{networkId}/ip/i.gif" - .replaceAll("\\{" + "networkId" + "\\}", localVarApiClient.escapeString(networkId.toString())); + .replace("{" + "networkId" + "}", localVarApiClient.escapeString(networkId.toString())); List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); @@ -748,36 +856,34 @@ public okhttp3.Call ipOverrideCall(Integer networkId, String userKey, String ip, } final String[] localVarContentTypes = { - }; final String localVarContentType = localVarApiClient.selectHeaderContentType(localVarContentTypes); - localVarHeaderParams.put("Content-Type", localVarContentType); + if (localVarContentType != null) { + localVarHeaderParams.put("Content-Type", localVarContentType); + } String[] localVarAuthNames = new String[] { }; - return localVarApiClient.buildCall(localVarPath, "GET", localVarQueryParams, localVarCollectionQueryParams, localVarPostBody, localVarHeaderParams, localVarCookieParams, localVarFormParams, localVarAuthNames, _callback); + return localVarApiClient.buildCall(basePath, localVarPath, "GET", localVarQueryParams, localVarCollectionQueryParams, localVarPostBody, localVarHeaderParams, localVarCookieParams, localVarFormParams, localVarAuthNames, _callback); } @SuppressWarnings("rawtypes") - private okhttp3.Call ipOverrideValidateBeforeCall(Integer networkId, String userKey, String ip, final ApiCallback _callback) throws ApiException { - + private okhttp3.Call ipOverrideValidateBeforeCall(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull String userKey, @javax.annotation.Nonnull String ip, final ApiCallback _callback) throws ApiException { // verify the required parameter 'networkId' is set if (networkId == null) { throw new ApiException("Missing the required parameter 'networkId' when calling ipOverride(Async)"); } - + // verify the required parameter 'userKey' is set if (userKey == null) { throw new ApiException("Missing the required parameter 'userKey' when calling ipOverride(Async)"); } - + // verify the required parameter 'ip' is set if (ip == null) { throw new ApiException("Missing the required parameter 'ip' when calling ipOverride(Async)"); } - - okhttp3.Call localVarCall = ipOverrideCall(networkId, userKey, ip, _callback); - return localVarCall; + return ipOverrideCall(networkId, userKey, ip, _callback); } @@ -790,12 +896,13 @@ private okhttp3.Call ipOverrideValidateBeforeCall(Integer networkId, String user * @return File * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body * @http.response.details - +
+
Response Details
Status Code Description Response Headers
200 The updated UserDB record -
*/ - public File ipOverride(Integer networkId, String userKey, String ip) throws ApiException { + public File ipOverride(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull String userKey, @javax.annotation.Nonnull String ip) throws ApiException { ApiResponse localVarResp = ipOverrideWithHttpInfo(networkId, userKey, ip); return localVarResp.getData(); } @@ -809,12 +916,13 @@ public File ipOverride(Integer networkId, String userKey, String ip) throws ApiE * @return ApiResponse<File> * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body * @http.response.details - +
+
Response Details
Status Code Description Response Headers
200 The updated UserDB record -
*/ - public ApiResponse ipOverrideWithHttpInfo(Integer networkId, String userKey, String ip) throws ApiException { + public ApiResponse ipOverrideWithHttpInfo(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull String userKey, @javax.annotation.Nonnull String ip) throws ApiException { okhttp3.Call localVarCall = ipOverrideValidateBeforeCall(networkId, userKey, ip, null); Type localVarReturnType = new TypeToken(){}.getType(); return localVarApiClient.execute(localVarCall, localVarReturnType); @@ -830,12 +938,13 @@ public ApiResponse ipOverrideWithHttpInfo(Integer networkId, String userKe * @return The request call * @throws ApiException If fail to process the API call, e.g. serializing the request body object * @http.response.details - +
+
Response Details
Status Code Description Response Headers
200 The updated UserDB record -
*/ - public okhttp3.Call ipOverrideAsync(Integer networkId, String userKey, String ip, final ApiCallback _callback) throws ApiException { + public okhttp3.Call ipOverrideAsync(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull String userKey, @javax.annotation.Nonnull String ip, final ApiCallback _callback) throws ApiException { okhttp3.Call localVarCall = ipOverrideValidateBeforeCall(networkId, userKey, ip, _callback); Type localVarReturnType = new TypeToken(){}.getType(); @@ -852,17 +961,31 @@ public okhttp3.Call ipOverrideAsync(Integer networkId, String userKey, String ip * @return Call to execute * @throws ApiException If fail to serialize the request body object * @http.response.details - +
+
Response Details
Status Code Description Response Headers
200 Success -
*/ - public okhttp3.Call matchUserCall(Integer networkId, String userKey, Integer partnerId, Integer userId, final ApiCallback _callback) throws ApiException { + public okhttp3.Call matchUserCall(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull String userKey, @javax.annotation.Nonnull Integer partnerId, @javax.annotation.Nonnull Integer userId, final ApiCallback _callback) throws ApiException { + String basePath = null; + // Operation Servers + String[] localBasePaths = new String[] { }; + + // Determine Base Path to Use + if (localCustomBaseUrl != null){ + basePath = localCustomBaseUrl; + } else if ( localBasePaths.length > 0 ) { + basePath = localBasePaths[localHostIndex]; + } else { + basePath = null; + } + Object localVarPostBody = null; // create path and map variables String localVarPath = "/udb/{networkId}/sync/i.gif" - .replaceAll("\\{" + "networkId" + "\\}", localVarApiClient.escapeString(networkId.toString())); + .replace("{" + "networkId" + "}", localVarApiClient.escapeString(networkId.toString())); List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); @@ -891,41 +1014,39 @@ public okhttp3.Call matchUserCall(Integer networkId, String userKey, Integer par } final String[] localVarContentTypes = { - }; final String localVarContentType = localVarApiClient.selectHeaderContentType(localVarContentTypes); - localVarHeaderParams.put("Content-Type", localVarContentType); + if (localVarContentType != null) { + localVarHeaderParams.put("Content-Type", localVarContentType); + } String[] localVarAuthNames = new String[] { }; - return localVarApiClient.buildCall(localVarPath, "GET", localVarQueryParams, localVarCollectionQueryParams, localVarPostBody, localVarHeaderParams, localVarCookieParams, localVarFormParams, localVarAuthNames, _callback); + return localVarApiClient.buildCall(basePath, localVarPath, "GET", localVarQueryParams, localVarCollectionQueryParams, localVarPostBody, localVarHeaderParams, localVarCookieParams, localVarFormParams, localVarAuthNames, _callback); } @SuppressWarnings("rawtypes") - private okhttp3.Call matchUserValidateBeforeCall(Integer networkId, String userKey, Integer partnerId, Integer userId, final ApiCallback _callback) throws ApiException { - + private okhttp3.Call matchUserValidateBeforeCall(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull String userKey, @javax.annotation.Nonnull Integer partnerId, @javax.annotation.Nonnull Integer userId, final ApiCallback _callback) throws ApiException { // verify the required parameter 'networkId' is set if (networkId == null) { throw new ApiException("Missing the required parameter 'networkId' when calling matchUser(Async)"); } - + // verify the required parameter 'userKey' is set if (userKey == null) { throw new ApiException("Missing the required parameter 'userKey' when calling matchUser(Async)"); } - + // verify the required parameter 'partnerId' is set if (partnerId == null) { throw new ApiException("Missing the required parameter 'partnerId' when calling matchUser(Async)"); } - + // verify the required parameter 'userId' is set if (userId == null) { throw new ApiException("Missing the required parameter 'userId' when calling matchUser(Async)"); } - - okhttp3.Call localVarCall = matchUserCall(networkId, userKey, partnerId, userId, _callback); - return localVarCall; + return matchUserCall(networkId, userKey, partnerId, userId, _callback); } @@ -939,12 +1060,13 @@ private okhttp3.Call matchUserValidateBeforeCall(Integer networkId, String userK * @return File * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body * @http.response.details - +
+
Response Details
Status Code Description Response Headers
200 Success -
*/ - public File matchUser(Integer networkId, String userKey, Integer partnerId, Integer userId) throws ApiException { + public File matchUser(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull String userKey, @javax.annotation.Nonnull Integer partnerId, @javax.annotation.Nonnull Integer userId) throws ApiException { ApiResponse localVarResp = matchUserWithHttpInfo(networkId, userKey, partnerId, userId); return localVarResp.getData(); } @@ -959,12 +1081,13 @@ public File matchUser(Integer networkId, String userKey, Integer partnerId, Inte * @return ApiResponse<File> * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body * @http.response.details - +
+
Response Details
Status Code Description Response Headers
200 Success -
*/ - public ApiResponse matchUserWithHttpInfo(Integer networkId, String userKey, Integer partnerId, Integer userId) throws ApiException { + public ApiResponse matchUserWithHttpInfo(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull String userKey, @javax.annotation.Nonnull Integer partnerId, @javax.annotation.Nonnull Integer userId) throws ApiException { okhttp3.Call localVarCall = matchUserValidateBeforeCall(networkId, userKey, partnerId, userId, null); Type localVarReturnType = new TypeToken(){}.getType(); return localVarApiClient.execute(localVarCall, localVarReturnType); @@ -981,12 +1104,13 @@ public ApiResponse matchUserWithHttpInfo(Integer networkId, String userKey * @return The request call * @throws ApiException If fail to process the API call, e.g. serializing the request body object * @http.response.details - +
+
Response Details
Status Code Description Response Headers
200 Success -
*/ - public okhttp3.Call matchUserAsync(Integer networkId, String userKey, Integer partnerId, Integer userId, final ApiCallback _callback) throws ApiException { + public okhttp3.Call matchUserAsync(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull String userKey, @javax.annotation.Nonnull Integer partnerId, @javax.annotation.Nonnull Integer userId, final ApiCallback _callback) throws ApiException { okhttp3.Call localVarCall = matchUserValidateBeforeCall(networkId, userKey, partnerId, userId, _callback); Type localVarReturnType = new TypeToken(){}.getType(); @@ -1001,17 +1125,31 @@ public okhttp3.Call matchUserAsync(Integer networkId, String userKey, Integer pa * @return Call to execute * @throws ApiException If fail to serialize the request body object * @http.response.details - +
+
Response Details
Status Code Description Response Headers
200 Sucess -
*/ - public okhttp3.Call optOutCall(Integer networkId, String userKey, final ApiCallback _callback) throws ApiException { + public okhttp3.Call optOutCall(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull String userKey, final ApiCallback _callback) throws ApiException { + String basePath = null; + // Operation Servers + String[] localBasePaths = new String[] { }; + + // Determine Base Path to Use + if (localCustomBaseUrl != null){ + basePath = localCustomBaseUrl; + } else if ( localBasePaths.length > 0 ) { + basePath = localBasePaths[localHostIndex]; + } else { + basePath = null; + } + Object localVarPostBody = null; // create path and map variables String localVarPath = "/udb/{networkId}/optout/i.gif" - .replaceAll("\\{" + "networkId" + "\\}", localVarApiClient.escapeString(networkId.toString())); + .replace("{" + "networkId" + "}", localVarApiClient.escapeString(networkId.toString())); List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); @@ -1032,31 +1170,29 @@ public okhttp3.Call optOutCall(Integer networkId, String userKey, final ApiCallb } final String[] localVarContentTypes = { - }; final String localVarContentType = localVarApiClient.selectHeaderContentType(localVarContentTypes); - localVarHeaderParams.put("Content-Type", localVarContentType); + if (localVarContentType != null) { + localVarHeaderParams.put("Content-Type", localVarContentType); + } String[] localVarAuthNames = new String[] { }; - return localVarApiClient.buildCall(localVarPath, "GET", localVarQueryParams, localVarCollectionQueryParams, localVarPostBody, localVarHeaderParams, localVarCookieParams, localVarFormParams, localVarAuthNames, _callback); + return localVarApiClient.buildCall(basePath, localVarPath, "GET", localVarQueryParams, localVarCollectionQueryParams, localVarPostBody, localVarHeaderParams, localVarCookieParams, localVarFormParams, localVarAuthNames, _callback); } @SuppressWarnings("rawtypes") - private okhttp3.Call optOutValidateBeforeCall(Integer networkId, String userKey, final ApiCallback _callback) throws ApiException { - + private okhttp3.Call optOutValidateBeforeCall(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull String userKey, final ApiCallback _callback) throws ApiException { // verify the required parameter 'networkId' is set if (networkId == null) { throw new ApiException("Missing the required parameter 'networkId' when calling optOut(Async)"); } - + // verify the required parameter 'userKey' is set if (userKey == null) { throw new ApiException("Missing the required parameter 'userKey' when calling optOut(Async)"); } - - okhttp3.Call localVarCall = optOutCall(networkId, userKey, _callback); - return localVarCall; + return optOutCall(networkId, userKey, _callback); } @@ -1068,12 +1204,13 @@ private okhttp3.Call optOutValidateBeforeCall(Integer networkId, String userKey, * @return File * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body * @http.response.details - +
+
Response Details
Status Code Description Response Headers
200 Sucess -
*/ - public File optOut(Integer networkId, String userKey) throws ApiException { + public File optOut(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull String userKey) throws ApiException { ApiResponse localVarResp = optOutWithHttpInfo(networkId, userKey); return localVarResp.getData(); } @@ -1086,12 +1223,13 @@ public File optOut(Integer networkId, String userKey) throws ApiException { * @return ApiResponse<File> * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body * @http.response.details - +
+
Response Details
Status Code Description Response Headers
200 Sucess -
*/ - public ApiResponse optOutWithHttpInfo(Integer networkId, String userKey) throws ApiException { + public ApiResponse optOutWithHttpInfo(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull String userKey) throws ApiException { okhttp3.Call localVarCall = optOutValidateBeforeCall(networkId, userKey, null); Type localVarReturnType = new TypeToken(){}.getType(); return localVarApiClient.execute(localVarCall, localVarReturnType); @@ -1106,12 +1244,13 @@ public ApiResponse optOutWithHttpInfo(Integer networkId, String userKey) t * @return The request call * @throws ApiException If fail to process the API call, e.g. serializing the request body object * @http.response.details - +
+
Response Details
Status Code Description Response Headers
200 Sucess -
*/ - public okhttp3.Call optOutAsync(Integer networkId, String userKey, final ApiCallback _callback) throws ApiException { + public okhttp3.Call optOutAsync(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull String userKey, final ApiCallback _callback) throws ApiException { okhttp3.Call localVarCall = optOutValidateBeforeCall(networkId, userKey, _callback); Type localVarReturnType = new TypeToken(){}.getType(); @@ -1126,17 +1265,31 @@ public okhttp3.Call optOutAsync(Integer networkId, String userKey, final ApiCall * @return Call to execute * @throws ApiException If fail to serialize the request body object * @http.response.details - +
+
Response Details
Status Code Description Response Headers
200 The UserDB record -
*/ - public okhttp3.Call readCall(Integer networkId, String userKey, final ApiCallback _callback) throws ApiException { + public okhttp3.Call readCall(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull String userKey, final ApiCallback _callback) throws ApiException { + String basePath = null; + // Operation Servers + String[] localBasePaths = new String[] { }; + + // Determine Base Path to Use + if (localCustomBaseUrl != null){ + basePath = localCustomBaseUrl; + } else if ( localBasePaths.length > 0 ) { + basePath = localBasePaths[localHostIndex]; + } else { + basePath = null; + } + Object localVarPostBody = null; // create path and map variables String localVarPath = "/udb/{networkId}/read" - .replaceAll("\\{" + "networkId" + "\\}", localVarApiClient.escapeString(networkId.toString())); + .replace("{" + "networkId" + "}", localVarApiClient.escapeString(networkId.toString())); List localVarQueryParams = new ArrayList(); List localVarCollectionQueryParams = new ArrayList(); @@ -1157,31 +1310,29 @@ public okhttp3.Call readCall(Integer networkId, String userKey, final ApiCallbac } final String[] localVarContentTypes = { - }; final String localVarContentType = localVarApiClient.selectHeaderContentType(localVarContentTypes); - localVarHeaderParams.put("Content-Type", localVarContentType); + if (localVarContentType != null) { + localVarHeaderParams.put("Content-Type", localVarContentType); + } String[] localVarAuthNames = new String[] { }; - return localVarApiClient.buildCall(localVarPath, "GET", localVarQueryParams, localVarCollectionQueryParams, localVarPostBody, localVarHeaderParams, localVarCookieParams, localVarFormParams, localVarAuthNames, _callback); + return localVarApiClient.buildCall(basePath, localVarPath, "GET", localVarQueryParams, localVarCollectionQueryParams, localVarPostBody, localVarHeaderParams, localVarCookieParams, localVarFormParams, localVarAuthNames, _callback); } @SuppressWarnings("rawtypes") - private okhttp3.Call readValidateBeforeCall(Integer networkId, String userKey, final ApiCallback _callback) throws ApiException { - + private okhttp3.Call readValidateBeforeCall(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull String userKey, final ApiCallback _callback) throws ApiException { // verify the required parameter 'networkId' is set if (networkId == null) { throw new ApiException("Missing the required parameter 'networkId' when calling read(Async)"); } - + // verify the required parameter 'userKey' is set if (userKey == null) { throw new ApiException("Missing the required parameter 'userKey' when calling read(Async)"); } - - okhttp3.Call localVarCall = readCall(networkId, userKey, _callback); - return localVarCall; + return readCall(networkId, userKey, _callback); } @@ -1193,12 +1344,13 @@ private okhttp3.Call readValidateBeforeCall(Integer networkId, String userKey, f * @return Object * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body * @http.response.details - +
+
Response Details
Status Code Description Response Headers
200 The UserDB record -
*/ - public Object read(Integer networkId, String userKey) throws ApiException { + public Object read(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull String userKey) throws ApiException { ApiResponse localVarResp = readWithHttpInfo(networkId, userKey); return localVarResp.getData(); } @@ -1211,12 +1363,13 @@ public Object read(Integer networkId, String userKey) throws ApiException { * @return ApiResponse<Object> * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body * @http.response.details - +
+
Response Details
Status Code Description Response Headers
200 The UserDB record -
*/ - public ApiResponse readWithHttpInfo(Integer networkId, String userKey) throws ApiException { + public ApiResponse readWithHttpInfo(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull String userKey) throws ApiException { okhttp3.Call localVarCall = readValidateBeforeCall(networkId, userKey, null); Type localVarReturnType = new TypeToken(){}.getType(); return localVarApiClient.execute(localVarCall, localVarReturnType); @@ -1231,12 +1384,13 @@ public ApiResponse readWithHttpInfo(Integer networkId, String userKey) t * @return The request call * @throws ApiException If fail to process the API call, e.g. serializing the request body object * @http.response.details - +
+
Response Details
Status Code Description Response Headers
200 The UserDB record -
*/ - public okhttp3.Call readAsync(Integer networkId, String userKey, final ApiCallback _callback) throws ApiException { + public okhttp3.Call readAsync(@javax.annotation.Nonnull Integer networkId, @javax.annotation.Nonnull String userKey, final ApiCallback _callback) throws ApiException { okhttp3.Call localVarCall = readValidateBeforeCall(networkId, userKey, _callback); Type localVarReturnType = new TypeToken(){}.getType(); diff --git a/src/main/java/com/adzerk/sdk/generated/auth/ApiKeyAuth.java b/src/main/java/com/adzerk/sdk/generated/auth/ApiKeyAuth.java index 5fc9b80..82a6815 100644 --- a/src/main/java/com/adzerk/sdk/generated/auth/ApiKeyAuth.java +++ b/src/main/java/com/adzerk/sdk/generated/auth/ApiKeyAuth.java @@ -13,12 +13,14 @@ package com.adzerk.sdk.generated.auth; +import com.adzerk.sdk.generated.ApiException; import com.adzerk.sdk.generated.Pair; +import java.net.URI; import java.util.Map; import java.util.List; -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-07-16T01:15:27.717Z[Etc/UTC]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-08-11T14:42:50.054336-03:00[America/Argentina/Cordoba]", comments = "Generator version: 7.14.0") public class ApiKeyAuth implements Authentication { private final String location; private final String paramName; @@ -56,7 +58,8 @@ public void setApiKeyPrefix(String apiKeyPrefix) { } @Override - public void applyToParams(List queryParams, Map headerParams, Map cookieParams) { + public void applyToParams(List queryParams, Map headerParams, Map cookieParams, + String payload, String method, URI uri) throws ApiException { if (apiKey == null) { return; } diff --git a/src/main/java/com/adzerk/sdk/generated/auth/Authentication.java b/src/main/java/com/adzerk/sdk/generated/auth/Authentication.java index 7ab1162..10198ca 100644 --- a/src/main/java/com/adzerk/sdk/generated/auth/Authentication.java +++ b/src/main/java/com/adzerk/sdk/generated/auth/Authentication.java @@ -14,10 +14,13 @@ package com.adzerk.sdk.generated.auth; import com.adzerk.sdk.generated.Pair; +import com.adzerk.sdk.generated.ApiException; +import java.net.URI; import java.util.Map; import java.util.List; +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-08-11T14:42:50.054336-03:00[America/Argentina/Cordoba]", comments = "Generator version: 7.14.0") public interface Authentication { /** * Apply authentication settings to header and query params. @@ -25,6 +28,10 @@ public interface Authentication { * @param queryParams List of query parameters * @param headerParams Map of header parameters * @param cookieParams Map of cookie parameters + * @param payload HTTP request body + * @param method HTTP method + * @param uri URI + * @throws ApiException if failed to update the parameters */ - void applyToParams(List queryParams, Map headerParams, Map cookieParams); + void applyToParams(List queryParams, Map headerParams, Map cookieParams, String payload, String method, URI uri) throws ApiException; } diff --git a/src/main/java/com/adzerk/sdk/generated/auth/HttpBasicAuth.java b/src/main/java/com/adzerk/sdk/generated/auth/HttpBasicAuth.java index 6dc6582..421f060 100644 --- a/src/main/java/com/adzerk/sdk/generated/auth/HttpBasicAuth.java +++ b/src/main/java/com/adzerk/sdk/generated/auth/HttpBasicAuth.java @@ -14,14 +14,14 @@ package com.adzerk.sdk.generated.auth; import com.adzerk.sdk.generated.Pair; +import com.adzerk.sdk.generated.ApiException; import okhttp3.Credentials; +import java.net.URI; import java.util.Map; import java.util.List; -import java.io.UnsupportedEncodingException; - public class HttpBasicAuth implements Authentication { private String username; private String password; @@ -43,7 +43,8 @@ public void setPassword(String password) { } @Override - public void applyToParams(List queryParams, Map headerParams, Map cookieParams) { + public void applyToParams(List queryParams, Map headerParams, Map cookieParams, + String payload, String method, URI uri) throws ApiException { if (username == null && password == null) { return; } diff --git a/src/main/java/com/adzerk/sdk/generated/auth/HttpBearerAuth.java b/src/main/java/com/adzerk/sdk/generated/auth/HttpBearerAuth.java index 86b92fc..c3f257d 100644 --- a/src/main/java/com/adzerk/sdk/generated/auth/HttpBearerAuth.java +++ b/src/main/java/com/adzerk/sdk/generated/auth/HttpBearerAuth.java @@ -13,15 +13,19 @@ package com.adzerk.sdk.generated.auth; +import com.adzerk.sdk.generated.ApiException; import com.adzerk.sdk.generated.Pair; -import java.util.Map; +import java.net.URI; import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.Supplier; -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-07-16T01:15:27.717Z[Etc/UTC]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-08-11T14:42:50.054336-03:00[America/Argentina/Cordoba]", comments = "Generator version: 7.14.0") public class HttpBearerAuth implements Authentication { private final String scheme; - private String bearerToken; + private Supplier tokenSupplier; public HttpBearerAuth(String scheme) { this.scheme = scheme; @@ -33,7 +37,7 @@ public HttpBearerAuth(String scheme) { * @return The bearer token */ public String getBearerToken() { - return bearerToken; + return tokenSupplier.get(); } /** @@ -42,12 +46,23 @@ public String getBearerToken() { * @param bearerToken The bearer token to send in the Authorization header */ public void setBearerToken(String bearerToken) { - this.bearerToken = bearerToken; + this.tokenSupplier = () -> bearerToken; + } + + /** + * Sets the supplier of tokens, which together with the scheme, will be sent as the value of the Authorization header. + * + * @param tokenSupplier The supplier of bearer tokens to send in the Authorization header + */ + public void setBearerToken(Supplier tokenSupplier) { + this.tokenSupplier = tokenSupplier; } @Override - public void applyToParams(List queryParams, Map headerParams, Map cookieParams) { - if(bearerToken == null) { + public void applyToParams(List queryParams, Map headerParams, Map cookieParams, + String payload, String method, URI uri) throws ApiException { + String bearerToken = Optional.ofNullable(tokenSupplier).map(Supplier::get).orElse(null); + if (bearerToken == null) { return; } diff --git a/src/main/java/com/adzerk/sdk/generated/model/AbstractOpenApiSchema.java b/src/main/java/com/adzerk/sdk/generated/model/AbstractOpenApiSchema.java new file mode 100644 index 0000000..f7bda46 --- /dev/null +++ b/src/main/java/com/adzerk/sdk/generated/model/AbstractOpenApiSchema.java @@ -0,0 +1,146 @@ +/* + * Adzerk Decision API + * Adzerk Decision API + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package com.adzerk.sdk.generated.model; + +import com.adzerk.sdk.generated.ApiException; +import java.util.Objects; +import java.lang.reflect.Type; +import java.util.Map; + +/** + * Abstract class for oneOf,anyOf schemas defined in OpenAPI spec + */ +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-08-11T14:42:50.054336-03:00[America/Argentina/Cordoba]", comments = "Generator version: 7.14.0") +public abstract class AbstractOpenApiSchema { + + // store the actual instance of the schema/object + private Object instance; + + // is nullable + private Boolean isNullable; + + // schema type (e.g. oneOf, anyOf) + private final String schemaType; + + public AbstractOpenApiSchema(String schemaType, Boolean isNullable) { + this.schemaType = schemaType; + this.isNullable = isNullable; + } + + /** + * Get the list of oneOf/anyOf composed schemas allowed to be stored in this object + * + * @return an instance of the actual schema/object + */ + public abstract Map> getSchemas(); + + /** + * Get the actual instance + * + * @return an instance of the actual schema/object + */ + //@JsonValue + public Object getActualInstance() {return instance;} + + /** + * Set the actual instance + * + * @param instance the actual instance of the schema/object + */ + public void setActualInstance(Object instance) {this.instance = instance;} + + /** + * Get the instant recursively when the schemas defined in oneOf/anyof happen to be oneOf/anyOf schema as well + * + * @return an instance of the actual schema/object + */ + public Object getActualInstanceRecursively() { + return getActualInstanceRecursively(this); + } + + private Object getActualInstanceRecursively(AbstractOpenApiSchema object) { + if (object.getActualInstance() == null) { + return null; + } else if (object.getActualInstance() instanceof AbstractOpenApiSchema) { + return getActualInstanceRecursively((AbstractOpenApiSchema)object.getActualInstance()); + } else { + return object.getActualInstance(); + } + } + + /** + * Get the schema type (e.g. anyOf, oneOf) + * + * @return the schema type + */ + public String getSchemaType() { + return schemaType; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("class ").append(getClass()).append(" {\n"); + sb.append(" instance: ").append(toIndentedString(instance)).append("\n"); + sb.append(" isNullable: ").append(toIndentedString(isNullable)).append("\n"); + sb.append(" schemaType: ").append(toIndentedString(schemaType)).append("\n"); + sb.append("}"); + return sb.toString(); + } + + /** + * Convert the given object to string with each line indented by 4 spaces + * (except the first line). + */ + private String toIndentedString(Object o) { + if (o == null) { + return "null"; + } + return o.toString().replace("\n", "\n "); + } + + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + AbstractOpenApiSchema a = (AbstractOpenApiSchema) o; + return Objects.equals(this.instance, a.instance) && + Objects.equals(this.isNullable, a.isNullable) && + Objects.equals(this.schemaType, a.schemaType); + } + + @Override + public int hashCode() { + return Objects.hash(instance, isNullable, schemaType); + } + + /** + * Is nullable + * + * @return true if it's nullable + */ + public Boolean isNullable() { + if (Boolean.TRUE.equals(isNullable)) { + return Boolean.TRUE; + } else { + return Boolean.FALSE; + } + } + + + +} diff --git a/src/main/java/com/adzerk/sdk/generated/model/ConsentRequest.java b/src/main/java/com/adzerk/sdk/generated/model/ConsentRequest.java index 1fabd9e..b95e5d1 100644 --- a/src/main/java/com/adzerk/sdk/generated/model/ConsentRequest.java +++ b/src/main/java/com/adzerk/sdk/generated/model/ConsentRequest.java @@ -14,79 +14,97 @@ package com.adzerk.sdk.generated.model; import java.util.Objects; -import java.util.Arrays; import com.google.gson.TypeAdapter; import com.google.gson.annotations.JsonAdapter; import com.google.gson.annotations.SerializedName; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; import java.io.IOException; +import java.util.Arrays; import java.io.Serializable; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.google.gson.TypeAdapterFactory; +import com.google.gson.reflect.TypeToken; +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; +import java.io.IOException; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import com.adzerk.sdk.generated.JSON; + /** * ConsentRequest */ -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-07-16T01:15:27.717Z[Etc/UTC]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-08-11T14:42:50.054336-03:00[America/Argentina/Cordoba]", comments = "Generator version: 7.14.0") public class ConsentRequest implements Serializable { private static final long serialVersionUID = 1L; public static final String SERIALIZED_NAME_USER_KEY = "userKey"; @SerializedName(SERIALIZED_NAME_USER_KEY) + @javax.annotation.Nullable private String userKey; public static final String SERIALIZED_NAME_CONSENT = "consent"; @SerializedName(SERIALIZED_NAME_CONSENT) + @javax.annotation.Nullable private Object consent; + public ConsentRequest() { + } - public ConsentRequest userKey(String userKey) { - + public ConsentRequest userKey(@javax.annotation.Nullable String userKey) { this.userKey = userKey; return this; } - /** + /** * Get userKey * @return userKey - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public String getUserKey() { return userKey; } - - public void setUserKey(String userKey) { + public void setUserKey(@javax.annotation.Nullable String userKey) { this.userKey = userKey; } - public ConsentRequest consent(Object consent) { - + public ConsentRequest consent(@javax.annotation.Nullable Object consent) { this.consent = consent; return this; } - /** + /** * Get consent * @return consent - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public Object getConsent() { return consent; } - - public void setConsent(Object consent) { + public void setConsent(@javax.annotation.Nullable Object consent) { this.consent = consent; } + @Override public boolean equals(Object o) { if (this == o) { @@ -126,5 +144,91 @@ private String toIndentedString(Object o) { return o.toString().replace("\n", "\n "); } + + public static HashSet openapiFields; + public static HashSet openapiRequiredFields; + + static { + // a set of all properties/fields (JSON key names) + openapiFields = new HashSet(Arrays.asList("userKey", "consent")); + + // a set of required properties/fields (JSON key names) + openapiRequiredFields = new HashSet(0); + } + + /** + * Validates the JSON Element and throws an exception if issues found + * + * @param jsonElement JSON Element + * @throws IOException if the JSON Element is invalid with respect to ConsentRequest + */ + public static void validateJsonElement(JsonElement jsonElement) throws IOException { + if (jsonElement == null) { + if (!ConsentRequest.openapiRequiredFields.isEmpty()) { // has required fields but JSON element is null + throw new IllegalArgumentException(String.format("The required field(s) %s in ConsentRequest is not found in the empty JSON string", ConsentRequest.openapiRequiredFields.toString())); + } + } + + Set> entries = jsonElement.getAsJsonObject().entrySet(); + // check to see if the JSON string contains additional fields + for (Map.Entry entry : entries) { + if (!ConsentRequest.openapiFields.contains(entry.getKey())) { + throw new IllegalArgumentException(String.format("The field `%s` in the JSON string is not defined in the `ConsentRequest` properties. JSON: %s", entry.getKey(), jsonElement.toString())); + } + } + JsonObject jsonObj = jsonElement.getAsJsonObject(); + if ((jsonObj.get("userKey") != null && !jsonObj.get("userKey").isJsonNull()) && !jsonObj.get("userKey").isJsonPrimitive()) { + throw new IllegalArgumentException(String.format("Expected the field `userKey` to be a primitive type in the JSON string but got `%s`", jsonObj.get("userKey").toString())); + } + } + + public static class CustomTypeAdapterFactory implements TypeAdapterFactory { + @SuppressWarnings("unchecked") + @Override + public TypeAdapter create(Gson gson, TypeToken type) { + if (!ConsentRequest.class.isAssignableFrom(type.getRawType())) { + return null; // this class only serializes 'ConsentRequest' and its subtypes + } + final TypeAdapter elementAdapter = gson.getAdapter(JsonElement.class); + final TypeAdapter thisAdapter + = gson.getDelegateAdapter(this, TypeToken.get(ConsentRequest.class)); + + return (TypeAdapter) new TypeAdapter() { + @Override + public void write(JsonWriter out, ConsentRequest value) throws IOException { + JsonObject obj = thisAdapter.toJsonTree(value).getAsJsonObject(); + elementAdapter.write(out, obj); + } + + @Override + public ConsentRequest read(JsonReader in) throws IOException { + JsonElement jsonElement = elementAdapter.read(in); + validateJsonElement(jsonElement); + return thisAdapter.fromJsonTree(jsonElement); + } + + }.nullSafe(); + } + } + + /** + * Create an instance of ConsentRequest given an JSON string + * + * @param jsonString JSON string + * @return An instance of ConsentRequest + * @throws IOException if the JSON string is invalid with respect to ConsentRequest + */ + public static ConsentRequest fromJson(String jsonString) throws IOException { + return JSON.getGson().fromJson(jsonString, ConsentRequest.class); + } + + /** + * Convert an instance of ConsentRequest to an JSON string + * + * @return JSON string + */ + public String toJson() { + return JSON.getGson().toJson(this); + } } diff --git a/src/main/java/com/adzerk/sdk/generated/model/Content.java b/src/main/java/com/adzerk/sdk/generated/model/Content.java index 23df3f6..025259c 100644 --- a/src/main/java/com/adzerk/sdk/generated/model/Content.java +++ b/src/main/java/com/adzerk/sdk/generated/model/Content.java @@ -14,160 +14,169 @@ package com.adzerk.sdk.generated.model; import java.util.Objects; -import java.util.Arrays; import com.google.gson.TypeAdapter; import com.google.gson.annotations.JsonAdapter; import com.google.gson.annotations.SerializedName; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; import java.io.IOException; +import java.util.Arrays; import java.io.Serializable; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.google.gson.TypeAdapterFactory; +import com.google.gson.reflect.TypeToken; +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; +import java.io.IOException; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import com.adzerk.sdk.generated.JSON; + /** * Content */ -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-07-16T01:15:27.717Z[Etc/UTC]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-08-11T14:42:50.054336-03:00[America/Argentina/Cordoba]", comments = "Generator version: 7.14.0") public class Content implements Serializable { private static final long serialVersionUID = 1L; public static final String SERIALIZED_NAME_TYPE = "type"; @SerializedName(SERIALIZED_NAME_TYPE) + @javax.annotation.Nullable private String type; public static final String SERIALIZED_NAME_TEMPLATE = "template"; @SerializedName(SERIALIZED_NAME_TEMPLATE) + @javax.annotation.Nullable private String template; public static final String SERIALIZED_NAME_CUSTOM_TEMPLATE = "customTemplate"; @SerializedName(SERIALIZED_NAME_CUSTOM_TEMPLATE) + @javax.annotation.Nullable private String customTemplate; public static final String SERIALIZED_NAME_DATA = "data"; @SerializedName(SERIALIZED_NAME_DATA) + @javax.annotation.Nullable private Object data; public static final String SERIALIZED_NAME_BODY = "body"; @SerializedName(SERIALIZED_NAME_BODY) + @javax.annotation.Nullable private String body; + public Content() { + } - public Content type(String type) { - + public Content type(@javax.annotation.Nullable String type) { this.type = type; return this; } - /** + /** * Get type * @return type - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public String getType() { return type; } - - public void setType(String type) { + public void setType(@javax.annotation.Nullable String type) { this.type = type; } - public Content template(String template) { - + public Content template(@javax.annotation.Nullable String template) { this.template = template; return this; } - /** + /** * Get template * @return template - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public String getTemplate() { return template; } - - public void setTemplate(String template) { + public void setTemplate(@javax.annotation.Nullable String template) { this.template = template; } - public Content customTemplate(String customTemplate) { - + public Content customTemplate(@javax.annotation.Nullable String customTemplate) { this.customTemplate = customTemplate; return this; } - /** + /** * Get customTemplate * @return customTemplate - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public String getCustomTemplate() { return customTemplate; } - - public void setCustomTemplate(String customTemplate) { + public void setCustomTemplate(@javax.annotation.Nullable String customTemplate) { this.customTemplate = customTemplate; } - public Content data(Object data) { - + public Content data(@javax.annotation.Nullable Object data) { this.data = data; return this; } - /** + /** * Get data * @return data - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public Object getData() { return data; } - - public void setData(Object data) { + public void setData(@javax.annotation.Nullable Object data) { this.data = data; } - public Content body(String body) { - + public Content body(@javax.annotation.Nullable String body) { this.body = body; return this; } - /** + /** * Get body * @return body - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public String getBody() { return body; } - - public void setBody(String body) { + public void setBody(@javax.annotation.Nullable String body) { this.body = body; } + @Override public boolean equals(Object o) { if (this == o) { @@ -213,5 +222,100 @@ private String toIndentedString(Object o) { return o.toString().replace("\n", "\n "); } + + public static HashSet openapiFields; + public static HashSet openapiRequiredFields; + + static { + // a set of all properties/fields (JSON key names) + openapiFields = new HashSet(Arrays.asList("type", "template", "customTemplate", "data", "body")); + + // a set of required properties/fields (JSON key names) + openapiRequiredFields = new HashSet(0); + } + + /** + * Validates the JSON Element and throws an exception if issues found + * + * @param jsonElement JSON Element + * @throws IOException if the JSON Element is invalid with respect to Content + */ + public static void validateJsonElement(JsonElement jsonElement) throws IOException { + if (jsonElement == null) { + if (!Content.openapiRequiredFields.isEmpty()) { // has required fields but JSON element is null + throw new IllegalArgumentException(String.format("The required field(s) %s in Content is not found in the empty JSON string", Content.openapiRequiredFields.toString())); + } + } + + Set> entries = jsonElement.getAsJsonObject().entrySet(); + // check to see if the JSON string contains additional fields + for (Map.Entry entry : entries) { + if (!Content.openapiFields.contains(entry.getKey())) { + throw new IllegalArgumentException(String.format("The field `%s` in the JSON string is not defined in the `Content` properties. JSON: %s", entry.getKey(), jsonElement.toString())); + } + } + JsonObject jsonObj = jsonElement.getAsJsonObject(); + if ((jsonObj.get("type") != null && !jsonObj.get("type").isJsonNull()) && !jsonObj.get("type").isJsonPrimitive()) { + throw new IllegalArgumentException(String.format("Expected the field `type` to be a primitive type in the JSON string but got `%s`", jsonObj.get("type").toString())); + } + if ((jsonObj.get("template") != null && !jsonObj.get("template").isJsonNull()) && !jsonObj.get("template").isJsonPrimitive()) { + throw new IllegalArgumentException(String.format("Expected the field `template` to be a primitive type in the JSON string but got `%s`", jsonObj.get("template").toString())); + } + if ((jsonObj.get("customTemplate") != null && !jsonObj.get("customTemplate").isJsonNull()) && !jsonObj.get("customTemplate").isJsonPrimitive()) { + throw new IllegalArgumentException(String.format("Expected the field `customTemplate` to be a primitive type in the JSON string but got `%s`", jsonObj.get("customTemplate").toString())); + } + if ((jsonObj.get("body") != null && !jsonObj.get("body").isJsonNull()) && !jsonObj.get("body").isJsonPrimitive()) { + throw new IllegalArgumentException(String.format("Expected the field `body` to be a primitive type in the JSON string but got `%s`", jsonObj.get("body").toString())); + } + } + + public static class CustomTypeAdapterFactory implements TypeAdapterFactory { + @SuppressWarnings("unchecked") + @Override + public TypeAdapter create(Gson gson, TypeToken type) { + if (!Content.class.isAssignableFrom(type.getRawType())) { + return null; // this class only serializes 'Content' and its subtypes + } + final TypeAdapter elementAdapter = gson.getAdapter(JsonElement.class); + final TypeAdapter thisAdapter + = gson.getDelegateAdapter(this, TypeToken.get(Content.class)); + + return (TypeAdapter) new TypeAdapter() { + @Override + public void write(JsonWriter out, Content value) throws IOException { + JsonObject obj = thisAdapter.toJsonTree(value).getAsJsonObject(); + elementAdapter.write(out, obj); + } + + @Override + public Content read(JsonReader in) throws IOException { + JsonElement jsonElement = elementAdapter.read(in); + validateJsonElement(jsonElement); + return thisAdapter.fromJsonTree(jsonElement); + } + + }.nullSafe(); + } + } + + /** + * Create an instance of Content given an JSON string + * + * @param jsonString JSON string + * @return An instance of Content + * @throws IOException if the JSON string is invalid with respect to Content + */ + public static Content fromJson(String jsonString) throws IOException { + return JSON.getGson().fromJson(jsonString, Content.class); + } + + /** + * Convert an instance of Content to an JSON string + * + * @return JSON string + */ + public String toJson() { + return JSON.getGson().toJson(this); + } } diff --git a/src/main/java/com/adzerk/sdk/generated/model/Decision.java b/src/main/java/com/adzerk/sdk/generated/model/Decision.java index 3be0691..a562b4d 100644 --- a/src/main/java/com/adzerk/sdk/generated/model/Decision.java +++ b/src/main/java/com/adzerk/sdk/generated/model/Decision.java @@ -14,7 +14,6 @@ package com.adzerk.sdk.generated.model; import java.util.Objects; -import java.util.Arrays; import com.adzerk.sdk.generated.model.Content; import com.adzerk.sdk.generated.model.Event; import com.adzerk.sdk.generated.model.MatchedPoint; @@ -24,370 +23,359 @@ import com.google.gson.annotations.SerializedName; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; import java.io.IOException; import java.net.URI; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.io.Serializable; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.google.gson.TypeAdapterFactory; +import com.google.gson.reflect.TypeToken; +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; +import java.io.IOException; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import com.adzerk.sdk.generated.JSON; + /** * Decision */ -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-07-16T01:15:27.717Z[Etc/UTC]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-08-11T14:42:50.054336-03:00[America/Argentina/Cordoba]", comments = "Generator version: 7.14.0") public class Decision implements Serializable { private static final long serialVersionUID = 1L; public static final String SERIALIZED_NAME_AD_ID = "adId"; @SerializedName(SERIALIZED_NAME_AD_ID) + @javax.annotation.Nullable private Integer adId; public static final String SERIALIZED_NAME_ADVERTISER_ID = "advertiserId"; @SerializedName(SERIALIZED_NAME_ADVERTISER_ID) + @javax.annotation.Nullable private Integer advertiserId; public static final String SERIALIZED_NAME_CREATIVE_ID = "creativeId"; @SerializedName(SERIALIZED_NAME_CREATIVE_ID) + @javax.annotation.Nullable private Integer creativeId; public static final String SERIALIZED_NAME_FLIGHT_ID = "flightId"; @SerializedName(SERIALIZED_NAME_FLIGHT_ID) + @javax.annotation.Nullable private Integer flightId; public static final String SERIALIZED_NAME_CAMPAIGN_ID = "campaignId"; @SerializedName(SERIALIZED_NAME_CAMPAIGN_ID) + @javax.annotation.Nullable private Integer campaignId; public static final String SERIALIZED_NAME_PRIORITY_ID = "priorityId"; @SerializedName(SERIALIZED_NAME_PRIORITY_ID) + @javax.annotation.Nullable private Integer priorityId; public static final String SERIALIZED_NAME_CLICK_URL = "clickUrl"; @SerializedName(SERIALIZED_NAME_CLICK_URL) + @javax.annotation.Nullable private URI clickUrl; public static final String SERIALIZED_NAME_CONTENTS = "contents"; @SerializedName(SERIALIZED_NAME_CONTENTS) - private List contents = null; + @javax.annotation.Nullable + private List contents = new ArrayList<>(); public static final String SERIALIZED_NAME_IMPRESSION_URL = "impressionUrl"; @SerializedName(SERIALIZED_NAME_IMPRESSION_URL) + @javax.annotation.Nullable private URI impressionUrl; public static final String SERIALIZED_NAME_EVENTS = "events"; @SerializedName(SERIALIZED_NAME_EVENTS) - private List events = null; + @javax.annotation.Nullable + private List events = new ArrayList<>(); public static final String SERIALIZED_NAME_MATCHED_POINTS = "matchedPoints"; @SerializedName(SERIALIZED_NAME_MATCHED_POINTS) - private List matchedPoints = null; + @javax.annotation.Nullable + private List matchedPoints = new ArrayList<>(); public static final String SERIALIZED_NAME_PRICING = "pricing"; @SerializedName(SERIALIZED_NAME_PRICING) + @javax.annotation.Nullable private PricingData pricing; + public Decision() { + } - public Decision adId(Integer adId) { - + public Decision adId(@javax.annotation.Nullable Integer adId) { this.adId = adId; return this; } - /** + /** * Get adId * @return adId - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public Integer getAdId() { return adId; } - - public void setAdId(Integer adId) { + public void setAdId(@javax.annotation.Nullable Integer adId) { this.adId = adId; } - public Decision advertiserId(Integer advertiserId) { - + public Decision advertiserId(@javax.annotation.Nullable Integer advertiserId) { this.advertiserId = advertiserId; return this; } - /** + /** * Get advertiserId * @return advertiserId - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public Integer getAdvertiserId() { return advertiserId; } - - public void setAdvertiserId(Integer advertiserId) { + public void setAdvertiserId(@javax.annotation.Nullable Integer advertiserId) { this.advertiserId = advertiserId; } - public Decision creativeId(Integer creativeId) { - + public Decision creativeId(@javax.annotation.Nullable Integer creativeId) { this.creativeId = creativeId; return this; } - /** + /** * Get creativeId * @return creativeId - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public Integer getCreativeId() { return creativeId; } - - public void setCreativeId(Integer creativeId) { + public void setCreativeId(@javax.annotation.Nullable Integer creativeId) { this.creativeId = creativeId; } - public Decision flightId(Integer flightId) { - + public Decision flightId(@javax.annotation.Nullable Integer flightId) { this.flightId = flightId; return this; } - /** + /** * Get flightId * @return flightId - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public Integer getFlightId() { return flightId; } - - public void setFlightId(Integer flightId) { + public void setFlightId(@javax.annotation.Nullable Integer flightId) { this.flightId = flightId; } - public Decision campaignId(Integer campaignId) { - + public Decision campaignId(@javax.annotation.Nullable Integer campaignId) { this.campaignId = campaignId; return this; } - /** + /** * Get campaignId * @return campaignId - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public Integer getCampaignId() { return campaignId; } - - public void setCampaignId(Integer campaignId) { + public void setCampaignId(@javax.annotation.Nullable Integer campaignId) { this.campaignId = campaignId; } - public Decision priorityId(Integer priorityId) { - + public Decision priorityId(@javax.annotation.Nullable Integer priorityId) { this.priorityId = priorityId; return this; } - /** + /** * Get priorityId * @return priorityId - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public Integer getPriorityId() { return priorityId; } - - public void setPriorityId(Integer priorityId) { + public void setPriorityId(@javax.annotation.Nullable Integer priorityId) { this.priorityId = priorityId; } - public Decision clickUrl(URI clickUrl) { - + public Decision clickUrl(@javax.annotation.Nullable URI clickUrl) { this.clickUrl = clickUrl; return this; } - /** + /** * Get clickUrl * @return clickUrl - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public URI getClickUrl() { return clickUrl; } - - public void setClickUrl(URI clickUrl) { + public void setClickUrl(@javax.annotation.Nullable URI clickUrl) { this.clickUrl = clickUrl; } - public Decision contents(List contents) { - + public Decision contents(@javax.annotation.Nullable List contents) { this.contents = contents; return this; } public Decision addContentsItem(Content contentsItem) { if (this.contents == null) { - this.contents = new ArrayList(); + this.contents = new ArrayList<>(); } this.contents.add(contentsItem); return this; } - /** + /** * Get contents * @return contents - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public List getContents() { return contents; } - - public void setContents(List contents) { + public void setContents(@javax.annotation.Nullable List contents) { this.contents = contents; } - public Decision impressionUrl(URI impressionUrl) { - + public Decision impressionUrl(@javax.annotation.Nullable URI impressionUrl) { this.impressionUrl = impressionUrl; return this; } - /** + /** * Get impressionUrl * @return impressionUrl - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public URI getImpressionUrl() { return impressionUrl; } - - public void setImpressionUrl(URI impressionUrl) { + public void setImpressionUrl(@javax.annotation.Nullable URI impressionUrl) { this.impressionUrl = impressionUrl; } - public Decision events(List events) { - + public Decision events(@javax.annotation.Nullable List events) { this.events = events; return this; } public Decision addEventsItem(Event eventsItem) { if (this.events == null) { - this.events = new ArrayList(); + this.events = new ArrayList<>(); } this.events.add(eventsItem); return this; } - /** + /** * Get events * @return events - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public List getEvents() { return events; } - - public void setEvents(List events) { + public void setEvents(@javax.annotation.Nullable List events) { this.events = events; } - public Decision matchedPoints(List matchedPoints) { - + public Decision matchedPoints(@javax.annotation.Nullable List matchedPoints) { this.matchedPoints = matchedPoints; return this; } public Decision addMatchedPointsItem(MatchedPoint matchedPointsItem) { if (this.matchedPoints == null) { - this.matchedPoints = new ArrayList(); + this.matchedPoints = new ArrayList<>(); } this.matchedPoints.add(matchedPointsItem); return this; } - /** + /** * Get matchedPoints * @return matchedPoints - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public List getMatchedPoints() { return matchedPoints; } - - public void setMatchedPoints(List matchedPoints) { + public void setMatchedPoints(@javax.annotation.Nullable List matchedPoints) { this.matchedPoints = matchedPoints; } - public Decision pricing(PricingData pricing) { - + public Decision pricing(@javax.annotation.Nullable PricingData pricing) { this.pricing = pricing; return this; } - /** + /** * Get pricing * @return pricing - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public PricingData getPricing() { return pricing; } - - public void setPricing(PricingData pricing) { + public void setPricing(@javax.annotation.Nullable PricingData pricing) { this.pricing = pricing; } + @Override public boolean equals(Object o) { if (this == o) { @@ -447,5 +435,140 @@ private String toIndentedString(Object o) { return o.toString().replace("\n", "\n "); } + + public static HashSet openapiFields; + public static HashSet openapiRequiredFields; + + static { + // a set of all properties/fields (JSON key names) + openapiFields = new HashSet(Arrays.asList("adId", "advertiserId", "creativeId", "flightId", "campaignId", "priorityId", "clickUrl", "contents", "impressionUrl", "events", "matchedPoints", "pricing")); + + // a set of required properties/fields (JSON key names) + openapiRequiredFields = new HashSet(0); + } + + /** + * Validates the JSON Element and throws an exception if issues found + * + * @param jsonElement JSON Element + * @throws IOException if the JSON Element is invalid with respect to Decision + */ + public static void validateJsonElement(JsonElement jsonElement) throws IOException { + if (jsonElement == null) { + if (!Decision.openapiRequiredFields.isEmpty()) { // has required fields but JSON element is null + throw new IllegalArgumentException(String.format("The required field(s) %s in Decision is not found in the empty JSON string", Decision.openapiRequiredFields.toString())); + } + } + + Set> entries = jsonElement.getAsJsonObject().entrySet(); + // check to see if the JSON string contains additional fields + for (Map.Entry entry : entries) { + if (!Decision.openapiFields.contains(entry.getKey())) { + throw new IllegalArgumentException(String.format("The field `%s` in the JSON string is not defined in the `Decision` properties. JSON: %s", entry.getKey(), jsonElement.toString())); + } + } + JsonObject jsonObj = jsonElement.getAsJsonObject(); + if ((jsonObj.get("clickUrl") != null && !jsonObj.get("clickUrl").isJsonNull()) && !jsonObj.get("clickUrl").isJsonPrimitive()) { + throw new IllegalArgumentException(String.format("Expected the field `clickUrl` to be a primitive type in the JSON string but got `%s`", jsonObj.get("clickUrl").toString())); + } + if (jsonObj.get("contents") != null && !jsonObj.get("contents").isJsonNull()) { + JsonArray jsonArraycontents = jsonObj.getAsJsonArray("contents"); + if (jsonArraycontents != null) { + // ensure the json data is an array + if (!jsonObj.get("contents").isJsonArray()) { + throw new IllegalArgumentException(String.format("Expected the field `contents` to be an array in the JSON string but got `%s`", jsonObj.get("contents").toString())); + } + + // validate the optional field `contents` (array) + for (int i = 0; i < jsonArraycontents.size(); i++) { + Content.validateJsonElement(jsonArraycontents.get(i)); + }; + } + } + if ((jsonObj.get("impressionUrl") != null && !jsonObj.get("impressionUrl").isJsonNull()) && !jsonObj.get("impressionUrl").isJsonPrimitive()) { + throw new IllegalArgumentException(String.format("Expected the field `impressionUrl` to be a primitive type in the JSON string but got `%s`", jsonObj.get("impressionUrl").toString())); + } + if (jsonObj.get("events") != null && !jsonObj.get("events").isJsonNull()) { + JsonArray jsonArrayevents = jsonObj.getAsJsonArray("events"); + if (jsonArrayevents != null) { + // ensure the json data is an array + if (!jsonObj.get("events").isJsonArray()) { + throw new IllegalArgumentException(String.format("Expected the field `events` to be an array in the JSON string but got `%s`", jsonObj.get("events").toString())); + } + + // validate the optional field `events` (array) + for (int i = 0; i < jsonArrayevents.size(); i++) { + Event.validateJsonElement(jsonArrayevents.get(i)); + }; + } + } + if (jsonObj.get("matchedPoints") != null && !jsonObj.get("matchedPoints").isJsonNull()) { + JsonArray jsonArraymatchedPoints = jsonObj.getAsJsonArray("matchedPoints"); + if (jsonArraymatchedPoints != null) { + // ensure the json data is an array + if (!jsonObj.get("matchedPoints").isJsonArray()) { + throw new IllegalArgumentException(String.format("Expected the field `matchedPoints` to be an array in the JSON string but got `%s`", jsonObj.get("matchedPoints").toString())); + } + + // validate the optional field `matchedPoints` (array) + for (int i = 0; i < jsonArraymatchedPoints.size(); i++) { + MatchedPoint.validateJsonElement(jsonArraymatchedPoints.get(i)); + }; + } + } + // validate the optional field `pricing` + if (jsonObj.get("pricing") != null && !jsonObj.get("pricing").isJsonNull()) { + PricingData.validateJsonElement(jsonObj.get("pricing")); + } + } + + public static class CustomTypeAdapterFactory implements TypeAdapterFactory { + @SuppressWarnings("unchecked") + @Override + public TypeAdapter create(Gson gson, TypeToken type) { + if (!Decision.class.isAssignableFrom(type.getRawType())) { + return null; // this class only serializes 'Decision' and its subtypes + } + final TypeAdapter elementAdapter = gson.getAdapter(JsonElement.class); + final TypeAdapter thisAdapter + = gson.getDelegateAdapter(this, TypeToken.get(Decision.class)); + + return (TypeAdapter) new TypeAdapter() { + @Override + public void write(JsonWriter out, Decision value) throws IOException { + JsonObject obj = thisAdapter.toJsonTree(value).getAsJsonObject(); + elementAdapter.write(out, obj); + } + + @Override + public Decision read(JsonReader in) throws IOException { + JsonElement jsonElement = elementAdapter.read(in); + validateJsonElement(jsonElement); + return thisAdapter.fromJsonTree(jsonElement); + } + + }.nullSafe(); + } + } + + /** + * Create an instance of Decision given an JSON string + * + * @param jsonString JSON string + * @return An instance of Decision + * @throws IOException if the JSON string is invalid with respect to Decision + */ + public static Decision fromJson(String jsonString) throws IOException { + return JSON.getGson().fromJson(jsonString, Decision.class); + } + + /** + * Convert an instance of Decision to an JSON string + * + * @return JSON string + */ + public String toJson() { + return JSON.getGson().toJson(this); + } } diff --git a/src/main/java/com/adzerk/sdk/generated/model/DecisionRequest.java b/src/main/java/com/adzerk/sdk/generated/model/DecisionRequest.java index cbd0b5c..e8060e4 100644 --- a/src/main/java/com/adzerk/sdk/generated/model/DecisionRequest.java +++ b/src/main/java/com/adzerk/sdk/generated/model/DecisionRequest.java @@ -14,7 +14,6 @@ package com.adzerk.sdk.generated.model; import java.util.Objects; -import java.util.Arrays; import com.adzerk.sdk.generated.model.Placement; import com.adzerk.sdk.generated.model.User; import com.google.gson.TypeAdapter; @@ -22,554 +21,532 @@ import com.google.gson.annotations.SerializedName; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import org.openapitools.jackson.nullable.JsonNullable; import java.io.Serializable; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.google.gson.TypeAdapterFactory; +import com.google.gson.reflect.TypeToken; +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; +import java.io.IOException; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import com.adzerk.sdk.generated.JSON; + /** * DecisionRequest */ -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-07-16T01:15:27.717Z[Etc/UTC]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-08-11T14:42:50.054336-03:00[America/Argentina/Cordoba]", comments = "Generator version: 7.14.0") public class DecisionRequest implements Serializable { private static final long serialVersionUID = 1L; public static final String SERIALIZED_NAME_PLACEMENTS = "placements"; @SerializedName(SERIALIZED_NAME_PLACEMENTS) - private List placements = new ArrayList(); + @javax.annotation.Nonnull + private List placements = new ArrayList<>(); public static final String SERIALIZED_NAME_USER = "user"; @SerializedName(SERIALIZED_NAME_USER) + @javax.annotation.Nullable private User user; public static final String SERIALIZED_NAME_KEYWORDS = "keywords"; @SerializedName(SERIALIZED_NAME_KEYWORDS) - private List keywords = null; + @javax.annotation.Nullable + private List keywords; public static final String SERIALIZED_NAME_URL = "url"; @SerializedName(SERIALIZED_NAME_URL) + @javax.annotation.Nullable private String url; public static final String SERIALIZED_NAME_REFERRER = "referrer"; @SerializedName(SERIALIZED_NAME_REFERRER) + @javax.annotation.Nullable private String referrer; public static final String SERIALIZED_NAME_IP = "ip"; @SerializedName(SERIALIZED_NAME_IP) + @javax.annotation.Nullable private String ip; public static final String SERIALIZED_NAME_BLOCKED_CREATIVES = "blockedCreatives"; @SerializedName(SERIALIZED_NAME_BLOCKED_CREATIVES) - private List blockedCreatives = null; + @javax.annotation.Nullable + private List blockedCreatives; public static final String SERIALIZED_NAME_IS_MOBILE = "isMobile"; + @Deprecated @SerializedName(SERIALIZED_NAME_IS_MOBILE) + @javax.annotation.Nullable private Boolean isMobile; public static final String SERIALIZED_NAME_INCLUDE_PRICING_DATA = "includePricingData"; @SerializedName(SERIALIZED_NAME_INCLUDE_PRICING_DATA) + @javax.annotation.Nullable private Boolean includePricingData; public static final String SERIALIZED_NAME_NOTRACK = "notrack"; @SerializedName(SERIALIZED_NAME_NOTRACK) + @javax.annotation.Nullable private Boolean notrack; public static final String SERIALIZED_NAME_ENABLE_BOT_FILTERING = "enableBotFiltering"; @SerializedName(SERIALIZED_NAME_ENABLE_BOT_FILTERING) + @javax.annotation.Nullable private Boolean enableBotFiltering; public static final String SERIALIZED_NAME_ENABLE_USER_D_B_I_P = "enableUserDBIP"; @SerializedName(SERIALIZED_NAME_ENABLE_USER_D_B_I_P) + @javax.annotation.Nullable private Boolean enableUserDBIP; public static final String SERIALIZED_NAME_CONSENT = "consent"; @SerializedName(SERIALIZED_NAME_CONSENT) + @javax.annotation.Nullable private Object consent; public static final String SERIALIZED_NAME_DEVICE_I_D = "deviceID"; @SerializedName(SERIALIZED_NAME_DEVICE_I_D) + @javax.annotation.Nullable private String deviceID; public static final String SERIALIZED_NAME_PARALLEL = "parallel"; @SerializedName(SERIALIZED_NAME_PARALLEL) + @javax.annotation.Nullable private Boolean parallel; public static final String SERIALIZED_NAME_INTENDED_LATITUDE = "intendedLatitude"; @SerializedName(SERIALIZED_NAME_INTENDED_LATITUDE) + @javax.annotation.Nullable private Float intendedLatitude; public static final String SERIALIZED_NAME_INTENDED_LONGITUDE = "intendedLongitude"; @SerializedName(SERIALIZED_NAME_INTENDED_LONGITUDE) + @javax.annotation.Nullable private Float intendedLongitude; public static final String SERIALIZED_NAME_RADIUS = "radius"; @SerializedName(SERIALIZED_NAME_RADIUS) + @javax.annotation.Nullable private Float radius; public static final String SERIALIZED_NAME_INCLUDE_MATCHED_POINTS = "includeMatchedPoints"; @SerializedName(SERIALIZED_NAME_INCLUDE_MATCHED_POINTS) + @javax.annotation.Nullable private Boolean includeMatchedPoints; + public DecisionRequest() { + } - public DecisionRequest placements(List placements) { - + public DecisionRequest placements(@javax.annotation.Nonnull List placements) { this.placements = placements; return this; } public DecisionRequest addPlacementsItem(Placement placementsItem) { + if (this.placements == null) { + this.placements = new ArrayList<>(); + } this.placements.add(placementsItem); return this; } - /** + /** * One or more Placement objects * @return placements - **/ - @ApiModelProperty(required = true, value = "One or more Placement objects") - + */ + @javax.annotation.Nonnull public List getPlacements() { return placements; } - - public void setPlacements(List placements) { + public void setPlacements(@javax.annotation.Nonnull List placements) { this.placements = placements; } - public DecisionRequest user(User user) { - + public DecisionRequest user(@javax.annotation.Nullable User user) { this.user = user; return this; } - /** + /** * Get user * @return user - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public User getUser() { return user; } - - public void setUser(User user) { + public void setUser(@javax.annotation.Nullable User user) { this.user = user; } - public DecisionRequest keywords(List keywords) { - + public DecisionRequest keywords(@javax.annotation.Nullable List keywords) { this.keywords = keywords; return this; } public DecisionRequest addKeywordsItem(String keywordsItem) { if (this.keywords == null) { - this.keywords = new ArrayList(); + this.keywords = new ArrayList<>(); } this.keywords.add(keywordsItem); return this; } - /** + /** * Keywords for keyword Targeting. Such as `\"keywords\": [\"foo\", \"bar\", \"baz\"]`. * @return keywords - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "Keywords for keyword Targeting. Such as `\"keywords\": [\"foo\", \"bar\", \"baz\"]`.") - public List getKeywords() { return keywords; } - - public void setKeywords(List keywords) { + public void setKeywords(@javax.annotation.Nullable List keywords) { this.keywords = keywords; } - public DecisionRequest url(String url) { - + public DecisionRequest url(@javax.annotation.Nullable String url) { this.url = url; return this; } - /** + /** * The current page URL * @return url - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "The current page URL") - public String getUrl() { return url; } - - public void setUrl(String url) { + public void setUrl(@javax.annotation.Nullable String url) { this.url = url; } - public DecisionRequest referrer(String referrer) { - + public DecisionRequest referrer(@javax.annotation.Nullable String referrer) { this.referrer = referrer; return this; } - /** + /** * The referrer URL * @return referrer - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "The referrer URL") - public String getReferrer() { return referrer; } - - public void setReferrer(String referrer) { + public void setReferrer(@javax.annotation.Nullable String referrer) { this.referrer = referrer; } - public DecisionRequest ip(String ip) { - + public DecisionRequest ip(@javax.annotation.Nullable String ip) { this.ip = ip; return this; } - /** + /** * The IP address. Required for [Geo-Targeting](https://dev.adzerk.com/docs/geo-location) * @return ip - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "The IP address. Required for [Geo-Targeting](https://dev.adzerk.com/docs/geo-location)") - public String getIp() { return ip; } - - public void setIp(String ip) { + public void setIp(@javax.annotation.Nullable String ip) { this.ip = ip; } - public DecisionRequest blockedCreatives(List blockedCreatives) { - + public DecisionRequest blockedCreatives(@javax.annotation.Nullable List blockedCreatives) { this.blockedCreatives = blockedCreatives; return this; } public DecisionRequest addBlockedCreativesItem(Integer blockedCreativesItem) { if (this.blockedCreatives == null) { - this.blockedCreatives = new ArrayList(); + this.blockedCreatives = new ArrayList<>(); } this.blockedCreatives.add(blockedCreativesItem); return this; } - /** + /** * Numeric creative ids to disregard for ad selection * @return blockedCreatives - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "Numeric creative ids to disregard for ad selection") - public List getBlockedCreatives() { return blockedCreatives; } - - public void setBlockedCreatives(List blockedCreatives) { + public void setBlockedCreatives(@javax.annotation.Nullable List blockedCreatives) { this.blockedCreatives = blockedCreatives; } - public DecisionRequest isMobile(Boolean isMobile) { - + @Deprecated + public DecisionRequest isMobile(@javax.annotation.Nullable Boolean isMobile) { this.isMobile = isMobile; return this; } - /** + /** * If true, only ads containing a single image will be returned * @return isMobile - **/ + * @deprecated + */ + @Deprecated @javax.annotation.Nullable - @ApiModelProperty(value = "If true, only ads containing a single image will be returned") - public Boolean getIsMobile() { return isMobile; } - - public void setIsMobile(Boolean isMobile) { + @Deprecated + public void setIsMobile(@javax.annotation.Nullable Boolean isMobile) { this.isMobile = isMobile; } - public DecisionRequest includePricingData(Boolean includePricingData) { - + public DecisionRequest includePricingData(@javax.annotation.Nullable Boolean includePricingData) { this.includePricingData = includePricingData; return this; } - /** + /** * If true, return pricing data for the decision in the response * @return includePricingData - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "If true, return pricing data for the decision in the response") - public Boolean getIncludePricingData() { return includePricingData; } - - public void setIncludePricingData(Boolean includePricingData) { + public void setIncludePricingData(@javax.annotation.Nullable Boolean includePricingData) { this.includePricingData = includePricingData; } - public DecisionRequest notrack(Boolean notrack) { - + public DecisionRequest notrack(@javax.annotation.Nullable Boolean notrack) { this.notrack = notrack; return this; } - /** + /** * If true, only return ads that are set to honor Do Not Track * @return notrack - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "If true, only return ads that are set to honor Do Not Track") - public Boolean getNotrack() { return notrack; } - - public void setNotrack(Boolean notrack) { + public void setNotrack(@javax.annotation.Nullable Boolean notrack) { this.notrack = notrack; } - public DecisionRequest enableBotFiltering(Boolean enableBotFiltering) { - + public DecisionRequest enableBotFiltering(@javax.annotation.Nullable Boolean enableBotFiltering) { this.enableBotFiltering = enableBotFiltering; return this; } - /** + /** * If making a client-side request, set to true. Defaults to false to ensure a server isn't seen as a bot. See [here](https://dev.adzerk.com/docs/tracking-overview#section-bot-filtering) for more info * @return enableBotFiltering - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "If making a client-side request, set to true. Defaults to false to ensure a server isn't seen as a bot. See [here](https://dev.adzerk.com/docs/tracking-overview#section-bot-filtering) for more info") - public Boolean getEnableBotFiltering() { return enableBotFiltering; } - - public void setEnableBotFiltering(Boolean enableBotFiltering) { + public void setEnableBotFiltering(@javax.annotation.Nullable Boolean enableBotFiltering) { this.enableBotFiltering = enableBotFiltering; } - public DecisionRequest enableUserDBIP(Boolean enableUserDBIP) { - + public DecisionRequest enableUserDBIP(@javax.annotation.Nullable Boolean enableUserDBIP) { this.enableUserDBIP = enableUserDBIP; return this; } - /** + /** * If true, override the IP address of the request with the IP address supplied on the UserKey. If no IP address is found on the UserKey, this will fall back to the IP address on the request. Requires UserDB * @return enableUserDBIP - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "If true, override the IP address of the request with the IP address supplied on the UserKey. If no IP address is found on the UserKey, this will fall back to the IP address on the request. Requires UserDB") - public Boolean getEnableUserDBIP() { return enableUserDBIP; } - - public void setEnableUserDBIP(Boolean enableUserDBIP) { + public void setEnableUserDBIP(@javax.annotation.Nullable Boolean enableUserDBIP) { this.enableUserDBIP = enableUserDBIP; } - public DecisionRequest consent(Object consent) { - + public DecisionRequest consent(@javax.annotation.Nullable Object consent) { this.consent = consent; return this; } - /** + /** * Object that sets the data consent preferences. Other consent settings are available in the GDPR settings documentation. * @return consent - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "Object that sets the data consent preferences. Other consent settings are available in the GDPR settings documentation.") - public Object getConsent() { return consent; } - - public void setConsent(Object consent) { + public void setConsent(@javax.annotation.Nullable Object consent) { this.consent = consent; } - public DecisionRequest deviceID(String deviceID) { - + public DecisionRequest deviceID(@javax.annotation.Nullable String deviceID) { this.deviceID = deviceID; return this; } - /** + /** * RTB requests only - sets an Identifier for Advertisers (IFA or IDFA) * @return deviceID - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "RTB requests only - sets an Identifier for Advertisers (IFA or IDFA)") - public String getDeviceID() { return deviceID; } - - public void setDeviceID(String deviceID) { + public void setDeviceID(@javax.annotation.Nullable String deviceID) { this.deviceID = deviceID; } - public DecisionRequest parallel(Boolean parallel) { - + public DecisionRequest parallel(@javax.annotation.Nullable Boolean parallel) { this.parallel = parallel; return this; } - /** + /** * Get parallel * @return parallel - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public Boolean getParallel() { return parallel; } - - public void setParallel(Boolean parallel) { + public void setParallel(@javax.annotation.Nullable Boolean parallel) { this.parallel = parallel; } - public DecisionRequest intendedLatitude(Float intendedLatitude) { - + public DecisionRequest intendedLatitude(@javax.annotation.Nullable Float intendedLatitude) { this.intendedLatitude = intendedLatitude; return this; } - /** + /** * Get intendedLatitude * @return intendedLatitude - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public Float getIntendedLatitude() { return intendedLatitude; } - - public void setIntendedLatitude(Float intendedLatitude) { + public void setIntendedLatitude(@javax.annotation.Nullable Float intendedLatitude) { this.intendedLatitude = intendedLatitude; } - public DecisionRequest intendedLongitude(Float intendedLongitude) { - + public DecisionRequest intendedLongitude(@javax.annotation.Nullable Float intendedLongitude) { this.intendedLongitude = intendedLongitude; return this; } - /** + /** * Get intendedLongitude * @return intendedLongitude - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public Float getIntendedLongitude() { return intendedLongitude; } - - public void setIntendedLongitude(Float intendedLongitude) { + public void setIntendedLongitude(@javax.annotation.Nullable Float intendedLongitude) { this.intendedLongitude = intendedLongitude; } - public DecisionRequest radius(Float radius) { - + public DecisionRequest radius(@javax.annotation.Nullable Float radius) { this.radius = radius; return this; } - /** + /** * Get radius * @return radius - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public Float getRadius() { return radius; } - - public void setRadius(Float radius) { + public void setRadius(@javax.annotation.Nullable Float radius) { this.radius = radius; } - public DecisionRequest includeMatchedPoints(Boolean includeMatchedPoints) { - + public DecisionRequest includeMatchedPoints(@javax.annotation.Nullable Boolean includeMatchedPoints) { this.includeMatchedPoints = includeMatchedPoints; return this; } - /** + /** * Get includeMatchedPoints * @return includeMatchedPoints - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public Boolean getIncludeMatchedPoints() { return includeMatchedPoints; } - - public void setIncludeMatchedPoints(Boolean includeMatchedPoints) { + public void setIncludeMatchedPoints(@javax.annotation.Nullable Boolean includeMatchedPoints) { this.includeMatchedPoints = includeMatchedPoints; } + @Override public boolean equals(Object o) { if (this == o) { @@ -600,11 +577,22 @@ public boolean equals(Object o) { Objects.equals(this.includeMatchedPoints, decisionRequest.includeMatchedPoints); } + private static boolean equalsNullable(JsonNullable a, JsonNullable b) { + return a == b || (a != null && b != null && a.isPresent() && b.isPresent() && Objects.deepEquals(a.get(), b.get())); + } + @Override public int hashCode() { return Objects.hash(placements, user, keywords, url, referrer, ip, blockedCreatives, isMobile, includePricingData, notrack, enableBotFiltering, enableUserDBIP, consent, deviceID, parallel, intendedLatitude, intendedLongitude, radius, includeMatchedPoints); } + private static int hashCodeNullable(JsonNullable a) { + if (a == null) { + return 1; + } + return a.isPresent() ? Arrays.deepHashCode(new Object[]{a.get()}) : 31; + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); @@ -643,5 +631,129 @@ private String toIndentedString(Object o) { return o.toString().replace("\n", "\n "); } + + public static HashSet openapiFields; + public static HashSet openapiRequiredFields; + + static { + // a set of all properties/fields (JSON key names) + openapiFields = new HashSet(Arrays.asList("placements", "user", "keywords", "url", "referrer", "ip", "blockedCreatives", "isMobile", "includePricingData", "notrack", "enableBotFiltering", "enableUserDBIP", "consent", "deviceID", "parallel", "intendedLatitude", "intendedLongitude", "radius", "includeMatchedPoints")); + + // a set of required properties/fields (JSON key names) + openapiRequiredFields = new HashSet(Arrays.asList("placements")); + } + + /** + * Validates the JSON Element and throws an exception if issues found + * + * @param jsonElement JSON Element + * @throws IOException if the JSON Element is invalid with respect to DecisionRequest + */ + public static void validateJsonElement(JsonElement jsonElement) throws IOException { + if (jsonElement == null) { + if (!DecisionRequest.openapiRequiredFields.isEmpty()) { // has required fields but JSON element is null + throw new IllegalArgumentException(String.format("The required field(s) %s in DecisionRequest is not found in the empty JSON string", DecisionRequest.openapiRequiredFields.toString())); + } + } + + Set> entries = jsonElement.getAsJsonObject().entrySet(); + // check to see if the JSON string contains additional fields + for (Map.Entry entry : entries) { + if (!DecisionRequest.openapiFields.contains(entry.getKey())) { + throw new IllegalArgumentException(String.format("The field `%s` in the JSON string is not defined in the `DecisionRequest` properties. JSON: %s", entry.getKey(), jsonElement.toString())); + } + } + + // check to make sure all required properties/fields are present in the JSON string + for (String requiredField : DecisionRequest.openapiRequiredFields) { + if (jsonElement.getAsJsonObject().get(requiredField) == null) { + throw new IllegalArgumentException(String.format("The required field `%s` is not found in the JSON string: %s", requiredField, jsonElement.toString())); + } + } + JsonObject jsonObj = jsonElement.getAsJsonObject(); + // ensure the json data is an array + if (!jsonObj.get("placements").isJsonArray()) { + throw new IllegalArgumentException(String.format("Expected the field `placements` to be an array in the JSON string but got `%s`", jsonObj.get("placements").toString())); + } + + JsonArray jsonArrayplacements = jsonObj.getAsJsonArray("placements"); + // validate the required field `placements` (array) + for (int i = 0; i < jsonArrayplacements.size(); i++) { + Placement.validateJsonElement(jsonArrayplacements.get(i)); + }; + // validate the optional field `user` + if (jsonObj.get("user") != null && !jsonObj.get("user").isJsonNull()) { + User.validateJsonElement(jsonObj.get("user")); + } + // ensure the optional json data is an array if present + if (jsonObj.get("keywords") != null && !jsonObj.get("keywords").isJsonNull() && !jsonObj.get("keywords").isJsonArray()) { + throw new IllegalArgumentException(String.format("Expected the field `keywords` to be an array in the JSON string but got `%s`", jsonObj.get("keywords").toString())); + } + if ((jsonObj.get("url") != null && !jsonObj.get("url").isJsonNull()) && !jsonObj.get("url").isJsonPrimitive()) { + throw new IllegalArgumentException(String.format("Expected the field `url` to be a primitive type in the JSON string but got `%s`", jsonObj.get("url").toString())); + } + if ((jsonObj.get("referrer") != null && !jsonObj.get("referrer").isJsonNull()) && !jsonObj.get("referrer").isJsonPrimitive()) { + throw new IllegalArgumentException(String.format("Expected the field `referrer` to be a primitive type in the JSON string but got `%s`", jsonObj.get("referrer").toString())); + } + if ((jsonObj.get("ip") != null && !jsonObj.get("ip").isJsonNull()) && !jsonObj.get("ip").isJsonPrimitive()) { + throw new IllegalArgumentException(String.format("Expected the field `ip` to be a primitive type in the JSON string but got `%s`", jsonObj.get("ip").toString())); + } + // ensure the optional json data is an array if present + if (jsonObj.get("blockedCreatives") != null && !jsonObj.get("blockedCreatives").isJsonNull() && !jsonObj.get("blockedCreatives").isJsonArray()) { + throw new IllegalArgumentException(String.format("Expected the field `blockedCreatives` to be an array in the JSON string but got `%s`", jsonObj.get("blockedCreatives").toString())); + } + if ((jsonObj.get("deviceID") != null && !jsonObj.get("deviceID").isJsonNull()) && !jsonObj.get("deviceID").isJsonPrimitive()) { + throw new IllegalArgumentException(String.format("Expected the field `deviceID` to be a primitive type in the JSON string but got `%s`", jsonObj.get("deviceID").toString())); + } + } + + public static class CustomTypeAdapterFactory implements TypeAdapterFactory { + @SuppressWarnings("unchecked") + @Override + public TypeAdapter create(Gson gson, TypeToken type) { + if (!DecisionRequest.class.isAssignableFrom(type.getRawType())) { + return null; // this class only serializes 'DecisionRequest' and its subtypes + } + final TypeAdapter elementAdapter = gson.getAdapter(JsonElement.class); + final TypeAdapter thisAdapter + = gson.getDelegateAdapter(this, TypeToken.get(DecisionRequest.class)); + + return (TypeAdapter) new TypeAdapter() { + @Override + public void write(JsonWriter out, DecisionRequest value) throws IOException { + JsonObject obj = thisAdapter.toJsonTree(value).getAsJsonObject(); + elementAdapter.write(out, obj); + } + + @Override + public DecisionRequest read(JsonReader in) throws IOException { + JsonElement jsonElement = elementAdapter.read(in); + validateJsonElement(jsonElement); + return thisAdapter.fromJsonTree(jsonElement); + } + + }.nullSafe(); + } + } + + /** + * Create an instance of DecisionRequest given an JSON string + * + * @param jsonString JSON string + * @return An instance of DecisionRequest + * @throws IOException if the JSON string is invalid with respect to DecisionRequest + */ + public static DecisionRequest fromJson(String jsonString) throws IOException { + return JSON.getGson().fromJson(jsonString, DecisionRequest.class); + } + + /** + * Convert an instance of DecisionRequest to an JSON string + * + * @return JSON string + */ + public String toJson() { + return JSON.getGson().toJson(this); + } } diff --git a/src/main/java/com/adzerk/sdk/generated/model/DecisionResponse.java b/src/main/java/com/adzerk/sdk/generated/model/DecisionResponse.java index 6fbd35b..6171003 100644 --- a/src/main/java/com/adzerk/sdk/generated/model/DecisionResponse.java +++ b/src/main/java/com/adzerk/sdk/generated/model/DecisionResponse.java @@ -14,119 +14,133 @@ package com.adzerk.sdk.generated.model; import java.util.Objects; -import java.util.Arrays; -import com.adzerk.sdk.generated.model.Decision; +import com.adzerk.sdk.generated.model.DecisionResponseDecisionsValue; import com.adzerk.sdk.generated.model.User; import com.google.gson.TypeAdapter; import com.google.gson.annotations.JsonAdapter; import com.google.gson.annotations.SerializedName; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; import java.io.IOException; +import java.util.Arrays; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.io.Serializable; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.google.gson.TypeAdapterFactory; +import com.google.gson.reflect.TypeToken; +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; +import java.io.IOException; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import com.adzerk.sdk.generated.JSON; + /** * DecisionResponse */ -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-07-16T01:15:27.717Z[Etc/UTC]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-08-11T14:42:50.054336-03:00[America/Argentina/Cordoba]", comments = "Generator version: 7.14.0") public class DecisionResponse implements Serializable { private static final long serialVersionUID = 1L; public static final String SERIALIZED_NAME_USER = "user"; @SerializedName(SERIALIZED_NAME_USER) + @javax.annotation.Nullable private User user; public static final String SERIALIZED_NAME_DECISIONS = "decisions"; @SerializedName(SERIALIZED_NAME_DECISIONS) - private Map decisions = null; + @javax.annotation.Nullable + private Map decisions = new HashMap<>(); public static final String SERIALIZED_NAME_EXPLAIN = "explain"; @SerializedName(SERIALIZED_NAME_EXPLAIN) + @javax.annotation.Nullable private Object explain; + public DecisionResponse() { + } - public DecisionResponse user(User user) { - + public DecisionResponse user(@javax.annotation.Nullable User user) { this.user = user; return this; } - /** + /** * Get user * @return user - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public User getUser() { return user; } - - public void setUser(User user) { + public void setUser(@javax.annotation.Nullable User user) { this.user = user; } - public DecisionResponse decisions(Map decisions) { - + public DecisionResponse decisions(@javax.annotation.Nullable Map decisions) { this.decisions = decisions; return this; } - public DecisionResponse putDecisionsItem(String key, Decision decisionsItem) { + public DecisionResponse putDecisionsItem(String key, DecisionResponseDecisionsValue decisionsItem) { if (this.decisions == null) { - this.decisions = new HashMap(); + this.decisions = new HashMap<>(); } this.decisions.put(key, decisionsItem); return this; } - /** - * Get decisions + /** + * Single decision format with dynamic string key * @return decisions - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - - public Map getDecisions() { + public Map getDecisions() { return decisions; } - - public void setDecisions(Map decisions) { + public void setDecisions(@javax.annotation.Nullable Map decisions) { this.decisions = decisions; } - public DecisionResponse explain(Object explain) { - + public DecisionResponse explain(@javax.annotation.Nullable Object explain) { this.explain = explain; return this; } - /** + /** * Get explain * @return explain - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public Object getExplain() { return explain; } - - public void setExplain(Object explain) { + public void setExplain(@javax.annotation.Nullable Object explain) { this.explain = explain; } + @Override public boolean equals(Object o) { if (this == o) { @@ -168,5 +182,92 @@ private String toIndentedString(Object o) { return o.toString().replace("\n", "\n "); } + + public static HashSet openapiFields; + public static HashSet openapiRequiredFields; + + static { + // a set of all properties/fields (JSON key names) + openapiFields = new HashSet(Arrays.asList("user", "decisions", "explain")); + + // a set of required properties/fields (JSON key names) + openapiRequiredFields = new HashSet(0); + } + + /** + * Validates the JSON Element and throws an exception if issues found + * + * @param jsonElement JSON Element + * @throws IOException if the JSON Element is invalid with respect to DecisionResponse + */ + public static void validateJsonElement(JsonElement jsonElement) throws IOException { + if (jsonElement == null) { + if (!DecisionResponse.openapiRequiredFields.isEmpty()) { // has required fields but JSON element is null + throw new IllegalArgumentException(String.format("The required field(s) %s in DecisionResponse is not found in the empty JSON string", DecisionResponse.openapiRequiredFields.toString())); + } + } + + Set> entries = jsonElement.getAsJsonObject().entrySet(); + // check to see if the JSON string contains additional fields + for (Map.Entry entry : entries) { + if (!DecisionResponse.openapiFields.contains(entry.getKey())) { + throw new IllegalArgumentException(String.format("The field `%s` in the JSON string is not defined in the `DecisionResponse` properties. JSON: %s", entry.getKey(), jsonElement.toString())); + } + } + JsonObject jsonObj = jsonElement.getAsJsonObject(); + // validate the optional field `user` + if (jsonObj.get("user") != null && !jsonObj.get("user").isJsonNull()) { + User.validateJsonElement(jsonObj.get("user")); + } + } + + public static class CustomTypeAdapterFactory implements TypeAdapterFactory { + @SuppressWarnings("unchecked") + @Override + public TypeAdapter create(Gson gson, TypeToken type) { + if (!DecisionResponse.class.isAssignableFrom(type.getRawType())) { + return null; // this class only serializes 'DecisionResponse' and its subtypes + } + final TypeAdapter elementAdapter = gson.getAdapter(JsonElement.class); + final TypeAdapter thisAdapter + = gson.getDelegateAdapter(this, TypeToken.get(DecisionResponse.class)); + + return (TypeAdapter) new TypeAdapter() { + @Override + public void write(JsonWriter out, DecisionResponse value) throws IOException { + JsonObject obj = thisAdapter.toJsonTree(value).getAsJsonObject(); + elementAdapter.write(out, obj); + } + + @Override + public DecisionResponse read(JsonReader in) throws IOException { + JsonElement jsonElement = elementAdapter.read(in); + validateJsonElement(jsonElement); + return thisAdapter.fromJsonTree(jsonElement); + } + + }.nullSafe(); + } + } + + /** + * Create an instance of DecisionResponse given an JSON string + * + * @param jsonString JSON string + * @return An instance of DecisionResponse + * @throws IOException if the JSON string is invalid with respect to DecisionResponse + */ + public static DecisionResponse fromJson(String jsonString) throws IOException { + return JSON.getGson().fromJson(jsonString, DecisionResponse.class); + } + + /** + * Convert an instance of DecisionResponse to an JSON string + * + * @return JSON string + */ + public String toJson() { + return JSON.getGson().toJson(this); + } } diff --git a/src/main/java/com/adzerk/sdk/generated/model/DecisionResponseDecisionsValue.java b/src/main/java/com/adzerk/sdk/generated/model/DecisionResponseDecisionsValue.java new file mode 100644 index 0000000..de5be79 --- /dev/null +++ b/src/main/java/com/adzerk/sdk/generated/model/DecisionResponseDecisionsValue.java @@ -0,0 +1,297 @@ +/* + * Adzerk Decision API + * Adzerk Decision API + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package com.adzerk.sdk.generated.model; + +import java.util.Objects; +import com.adzerk.sdk.generated.model.Content; +import com.adzerk.sdk.generated.model.Decision; +import com.adzerk.sdk.generated.model.Event; +import com.adzerk.sdk.generated.model.MatchedPoint; +import com.adzerk.sdk.generated.model.PricingData; +import com.google.gson.TypeAdapter; +import com.google.gson.annotations.JsonAdapter; +import com.google.gson.annotations.SerializedName; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; +import java.io.IOException; +import java.net.URI; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.io.Serializable; + + + +import java.io.IOException; +import java.lang.reflect.Type; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonParseException; +import com.google.gson.TypeAdapter; +import com.google.gson.TypeAdapterFactory; +import com.google.gson.reflect.TypeToken; +import com.google.gson.JsonPrimitive; +import com.google.gson.annotations.JsonAdapter; +import com.google.gson.annotations.SerializedName; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonArray; +import com.google.gson.JsonParseException; + +import com.adzerk.sdk.generated.JSON; + +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-08-11T14:42:50.054336-03:00[America/Argentina/Cordoba]", comments = "Generator version: 7.14.0") +public class DecisionResponseDecisionsValue extends AbstractOpenApiSchema implements Serializable { + private static final Logger log = Logger.getLogger(DecisionResponseDecisionsValue.class.getName()); + + public static class CustomTypeAdapterFactory implements TypeAdapterFactory { + @SuppressWarnings("unchecked") + @Override + public TypeAdapter create(Gson gson, TypeToken type) { + if (!DecisionResponseDecisionsValue.class.isAssignableFrom(type.getRawType())) { + return null; // this class only serializes 'DecisionResponseDecisionsValue' and its subtypes + } + final TypeAdapter elementAdapter = gson.getAdapter(JsonElement.class); + final TypeAdapter adapterDecision = gson.getDelegateAdapter(this, TypeToken.get(Decision.class)); + + final Type typeInstanceListDecision = new TypeToken>(){}.getType(); + final TypeAdapter> adapterListDecision = (TypeAdapter>) gson.getDelegateAdapter(this, TypeToken.get(typeInstanceListDecision)); + + return (TypeAdapter) new TypeAdapter() { + @Override + public void write(JsonWriter out, DecisionResponseDecisionsValue value) throws IOException { + if (value == null || value.getActualInstance() == null) { + elementAdapter.write(out, null); + return; + } + + // check if the actual instance is of the type `Decision` + if (value.getActualInstance() instanceof Decision) { + JsonElement element = adapterDecision.toJsonTree((Decision)value.getActualInstance()); + elementAdapter.write(out, element); + return; + } + // check if the actual instance is of the type `List` + if (value.getActualInstance() instanceof List) { + List list = (List) value.getActualInstance(); + if (list.get(0) instanceof Decision) { + JsonArray array = adapterListDecision.toJsonTree((List)value.getActualInstance()).getAsJsonArray(); + elementAdapter.write(out, array); + return; + } + } + throw new IOException("Failed to serialize as the type doesn't match anyOf schemas: Decision, List"); + } + + @Override + public DecisionResponseDecisionsValue read(JsonReader in) throws IOException { + Object deserialized = null; + JsonElement jsonElement = elementAdapter.read(in); + + ArrayList errorMessages = new ArrayList<>(); + TypeAdapter actualAdapter = elementAdapter; + + // deserialize Decision + try { + // validate the JSON object to see if any exception is thrown + Decision.validateJsonElement(jsonElement); + actualAdapter = adapterDecision; + DecisionResponseDecisionsValue ret = new DecisionResponseDecisionsValue(); + ret.setActualInstance(actualAdapter.fromJsonTree(jsonElement)); + return ret; + } catch (Exception e) { + // deserialization failed, continue + errorMessages.add(String.format("Deserialization for Decision failed with `%s`.", e.getMessage())); + log.log(Level.FINER, "Input data does not match schema 'Decision'", e); + } + // deserialize List + try { + // validate the JSON object to see if any exception is thrown + if (!jsonElement.isJsonArray()) { + throw new IllegalArgumentException(String.format("Expected json element to be a array type in the JSON string but got `%s`", jsonElement.toString())); + } + + JsonArray array = jsonElement.getAsJsonArray(); + // validate array items + for(JsonElement element : array) { + Decision.validateJsonElement(element); + } + actualAdapter = adapterListDecision; + DecisionResponseDecisionsValue ret = new DecisionResponseDecisionsValue(); + ret.setActualInstance(actualAdapter.fromJsonTree(jsonElement)); + return ret; + } catch (Exception e) { + // deserialization failed, continue + errorMessages.add(String.format("Deserialization for List failed with `%s`.", e.getMessage())); + log.log(Level.FINER, "Input data does not match schema 'List'", e); + } + + throw new IOException(String.format("Failed deserialization for DecisionResponseDecisionsValue: no class matches result, expected at least 1. Detailed failure message for anyOf schemas: %s. JSON: %s", errorMessages, jsonElement.toString())); + } + }.nullSafe(); + } + } + + // store a list of schema names defined in anyOf + public static final Map> schemas = new HashMap>(); + + public DecisionResponseDecisionsValue() { + super("anyOf", Boolean.FALSE); + } + + public DecisionResponseDecisionsValue(Object o) { + super("anyOf", Boolean.FALSE); + setActualInstance(o); + } + + static { + schemas.put("Decision", Decision.class); + schemas.put("List", List.class); + } + + @Override + public Map> getSchemas() { + return DecisionResponseDecisionsValue.schemas; + } + + /** + * Set the instance that matches the anyOf child schema, check + * the instance parameter is valid against the anyOf child schemas: + * Decision, List + * + * It could be an instance of the 'anyOf' schemas. + */ + @Override + public void setActualInstance(Object instance) { + if (instance instanceof Decision) { + super.setActualInstance(instance); + return; + } + + if (instance instanceof List) { + List list = (List) instance; + if (list.get(0) instanceof Decision) { + super.setActualInstance(instance); + return; + } + } + + throw new RuntimeException("Invalid instance type. Must be Decision, List"); + } + + /** + * Get the actual instance, which can be the following: + * Decision, List + * + * @return The actual instance (Decision, List) + */ + @SuppressWarnings("unchecked") + @Override + public Object getActualInstance() { + return super.getActualInstance(); + } + + /** + * Get the actual instance of `Decision`. If the actual instance is not `Decision`, + * the ClassCastException will be thrown. + * + * @return The actual instance of `Decision` + * @throws ClassCastException if the instance is not `Decision` + */ + public Decision getDecision() throws ClassCastException { + return (Decision)super.getActualInstance(); + } + + /** + * Get the actual instance of `List`. If the actual instance is not `List`, + * the ClassCastException will be thrown. + * + * @return The actual instance of `List` + * @throws ClassCastException if the instance is not `List` + */ + public List getListDecision() throws ClassCastException { + return (List)super.getActualInstance(); + } + + /** + * Validates the JSON Element and throws an exception if issues found + * + * @param jsonElement JSON Element + * @throws IOException if the JSON Element is invalid with respect to DecisionResponseDecisionsValue + */ + public static void validateJsonElement(JsonElement jsonElement) throws IOException { + // validate anyOf schemas one by one + ArrayList errorMessages = new ArrayList<>(); + // validate the json string with Decision + try { + Decision.validateJsonElement(jsonElement); + return; + } catch (Exception e) { + errorMessages.add(String.format("Deserialization for Decision failed with `%s`.", e.getMessage())); + // continue to the next one + } + // validate the json string with List + try { + if (!jsonElement.isJsonArray()) { + throw new IllegalArgumentException(String.format("Expected json element to be a array type in the JSON string but got `%s`", jsonElement.toString())); + } + JsonArray array = jsonElement.getAsJsonArray(); + // validate array items + for(JsonElement element : array) { + Decision.validateJsonElement(element); + } + return; + } catch (Exception e) { + errorMessages.add(String.format("Deserialization for List failed with `%s`.", e.getMessage())); + // continue to the next one + } + throw new IOException(String.format("The JSON string is invalid for DecisionResponseDecisionsValue with anyOf schemas: Decision, List. no class match the result, expected at least 1. Detailed failure message for anyOf schemas: %s. JSON: %s", errorMessages, jsonElement.toString())); + } + + /** + * Create an instance of DecisionResponseDecisionsValue given an JSON string + * + * @param jsonString JSON string + * @return An instance of DecisionResponseDecisionsValue + * @throws IOException if the JSON string is invalid with respect to DecisionResponseDecisionsValue + */ + public static DecisionResponseDecisionsValue fromJson(String jsonString) throws IOException { + return JSON.getGson().fromJson(jsonString, DecisionResponseDecisionsValue.class); + } + + /** + * Convert an instance of DecisionResponseDecisionsValue to an JSON string + * + * @return JSON string + */ + public String toJson() { + return JSON.getGson().toJson(this); + } +} + diff --git a/src/main/java/com/adzerk/sdk/generated/model/Event.java b/src/main/java/com/adzerk/sdk/generated/model/Event.java index da44a28..a0c1b40 100644 --- a/src/main/java/com/adzerk/sdk/generated/model/Event.java +++ b/src/main/java/com/adzerk/sdk/generated/model/Event.java @@ -14,80 +14,98 @@ package com.adzerk.sdk.generated.model; import java.util.Objects; -import java.util.Arrays; import com.google.gson.TypeAdapter; import com.google.gson.annotations.JsonAdapter; import com.google.gson.annotations.SerializedName; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; import java.io.IOException; import java.net.URI; +import java.util.Arrays; import java.io.Serializable; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.google.gson.TypeAdapterFactory; +import com.google.gson.reflect.TypeToken; +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; +import java.io.IOException; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import com.adzerk.sdk.generated.JSON; + /** * Event */ -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-07-16T01:15:27.717Z[Etc/UTC]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-08-11T14:42:50.054336-03:00[America/Argentina/Cordoba]", comments = "Generator version: 7.14.0") public class Event implements Serializable { private static final long serialVersionUID = 1L; public static final String SERIALIZED_NAME_ID = "id"; @SerializedName(SERIALIZED_NAME_ID) + @javax.annotation.Nullable private Integer id; public static final String SERIALIZED_NAME_URL = "url"; @SerializedName(SERIALIZED_NAME_URL) + @javax.annotation.Nullable private URI url; + public Event() { + } - public Event id(Integer id) { - + public Event id(@javax.annotation.Nullable Integer id) { this.id = id; return this; } - /** + /** * Get id * @return id - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public Integer getId() { return id; } - - public void setId(Integer id) { + public void setId(@javax.annotation.Nullable Integer id) { this.id = id; } - public Event url(URI url) { - + public Event url(@javax.annotation.Nullable URI url) { this.url = url; return this; } - /** + /** * Get url * @return url - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public URI getUrl() { return url; } - - public void setUrl(URI url) { + public void setUrl(@javax.annotation.Nullable URI url) { this.url = url; } + @Override public boolean equals(Object o) { if (this == o) { @@ -127,5 +145,91 @@ private String toIndentedString(Object o) { return o.toString().replace("\n", "\n "); } + + public static HashSet openapiFields; + public static HashSet openapiRequiredFields; + + static { + // a set of all properties/fields (JSON key names) + openapiFields = new HashSet(Arrays.asList("id", "url")); + + // a set of required properties/fields (JSON key names) + openapiRequiredFields = new HashSet(0); + } + + /** + * Validates the JSON Element and throws an exception if issues found + * + * @param jsonElement JSON Element + * @throws IOException if the JSON Element is invalid with respect to Event + */ + public static void validateJsonElement(JsonElement jsonElement) throws IOException { + if (jsonElement == null) { + if (!Event.openapiRequiredFields.isEmpty()) { // has required fields but JSON element is null + throw new IllegalArgumentException(String.format("The required field(s) %s in Event is not found in the empty JSON string", Event.openapiRequiredFields.toString())); + } + } + + Set> entries = jsonElement.getAsJsonObject().entrySet(); + // check to see if the JSON string contains additional fields + for (Map.Entry entry : entries) { + if (!Event.openapiFields.contains(entry.getKey())) { + throw new IllegalArgumentException(String.format("The field `%s` in the JSON string is not defined in the `Event` properties. JSON: %s", entry.getKey(), jsonElement.toString())); + } + } + JsonObject jsonObj = jsonElement.getAsJsonObject(); + if ((jsonObj.get("url") != null && !jsonObj.get("url").isJsonNull()) && !jsonObj.get("url").isJsonPrimitive()) { + throw new IllegalArgumentException(String.format("Expected the field `url` to be a primitive type in the JSON string but got `%s`", jsonObj.get("url").toString())); + } + } + + public static class CustomTypeAdapterFactory implements TypeAdapterFactory { + @SuppressWarnings("unchecked") + @Override + public TypeAdapter create(Gson gson, TypeToken type) { + if (!Event.class.isAssignableFrom(type.getRawType())) { + return null; // this class only serializes 'Event' and its subtypes + } + final TypeAdapter elementAdapter = gson.getAdapter(JsonElement.class); + final TypeAdapter thisAdapter + = gson.getDelegateAdapter(this, TypeToken.get(Event.class)); + + return (TypeAdapter) new TypeAdapter() { + @Override + public void write(JsonWriter out, Event value) throws IOException { + JsonObject obj = thisAdapter.toJsonTree(value).getAsJsonObject(); + elementAdapter.write(out, obj); + } + + @Override + public Event read(JsonReader in) throws IOException { + JsonElement jsonElement = elementAdapter.read(in); + validateJsonElement(jsonElement); + return thisAdapter.fromJsonTree(jsonElement); + } + + }.nullSafe(); + } + } + + /** + * Create an instance of Event given an JSON string + * + * @param jsonString JSON string + * @return An instance of Event + * @throws IOException if the JSON string is invalid with respect to Event + */ + public static Event fromJson(String jsonString) throws IOException { + return JSON.getGson().fromJson(jsonString, Event.class); + } + + /** + * Convert an instance of Event to an JSON string + * + * @return JSON string + */ + public String toJson() { + return JSON.getGson().toJson(this); + } } diff --git a/src/main/java/com/adzerk/sdk/generated/model/MatchedPoint.java b/src/main/java/com/adzerk/sdk/generated/model/MatchedPoint.java index cbc29d7..cab970e 100644 --- a/src/main/java/com/adzerk/sdk/generated/model/MatchedPoint.java +++ b/src/main/java/com/adzerk/sdk/generated/model/MatchedPoint.java @@ -14,79 +14,97 @@ package com.adzerk.sdk.generated.model; import java.util.Objects; -import java.util.Arrays; import com.google.gson.TypeAdapter; import com.google.gson.annotations.JsonAdapter; import com.google.gson.annotations.SerializedName; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; import java.io.IOException; +import java.util.Arrays; import java.io.Serializable; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.google.gson.TypeAdapterFactory; +import com.google.gson.reflect.TypeToken; +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; +import java.io.IOException; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import com.adzerk.sdk.generated.JSON; + /** * MatchedPoint */ -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-07-16T01:15:27.717Z[Etc/UTC]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-08-11T14:42:50.054336-03:00[America/Argentina/Cordoba]", comments = "Generator version: 7.14.0") public class MatchedPoint implements Serializable { private static final long serialVersionUID = 1L; public static final String SERIALIZED_NAME_LAT = "lat"; @SerializedName(SERIALIZED_NAME_LAT) + @javax.annotation.Nullable private String lat; public static final String SERIALIZED_NAME_LON = "lon"; @SerializedName(SERIALIZED_NAME_LON) + @javax.annotation.Nullable private String lon; + public MatchedPoint() { + } - public MatchedPoint lat(String lat) { - + public MatchedPoint lat(@javax.annotation.Nullable String lat) { this.lat = lat; return this; } - /** + /** * Get lat * @return lat - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public String getLat() { return lat; } - - public void setLat(String lat) { + public void setLat(@javax.annotation.Nullable String lat) { this.lat = lat; } - public MatchedPoint lon(String lon) { - + public MatchedPoint lon(@javax.annotation.Nullable String lon) { this.lon = lon; return this; } - /** + /** * Get lon * @return lon - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public String getLon() { return lon; } - - public void setLon(String lon) { + public void setLon(@javax.annotation.Nullable String lon) { this.lon = lon; } + @Override public boolean equals(Object o) { if (this == o) { @@ -126,5 +144,94 @@ private String toIndentedString(Object o) { return o.toString().replace("\n", "\n "); } + + public static HashSet openapiFields; + public static HashSet openapiRequiredFields; + + static { + // a set of all properties/fields (JSON key names) + openapiFields = new HashSet(Arrays.asList("lat", "lon")); + + // a set of required properties/fields (JSON key names) + openapiRequiredFields = new HashSet(0); + } + + /** + * Validates the JSON Element and throws an exception if issues found + * + * @param jsonElement JSON Element + * @throws IOException if the JSON Element is invalid with respect to MatchedPoint + */ + public static void validateJsonElement(JsonElement jsonElement) throws IOException { + if (jsonElement == null) { + if (!MatchedPoint.openapiRequiredFields.isEmpty()) { // has required fields but JSON element is null + throw new IllegalArgumentException(String.format("The required field(s) %s in MatchedPoint is not found in the empty JSON string", MatchedPoint.openapiRequiredFields.toString())); + } + } + + Set> entries = jsonElement.getAsJsonObject().entrySet(); + // check to see if the JSON string contains additional fields + for (Map.Entry entry : entries) { + if (!MatchedPoint.openapiFields.contains(entry.getKey())) { + throw new IllegalArgumentException(String.format("The field `%s` in the JSON string is not defined in the `MatchedPoint` properties. JSON: %s", entry.getKey(), jsonElement.toString())); + } + } + JsonObject jsonObj = jsonElement.getAsJsonObject(); + if ((jsonObj.get("lat") != null && !jsonObj.get("lat").isJsonNull()) && !jsonObj.get("lat").isJsonPrimitive()) { + throw new IllegalArgumentException(String.format("Expected the field `lat` to be a primitive type in the JSON string but got `%s`", jsonObj.get("lat").toString())); + } + if ((jsonObj.get("lon") != null && !jsonObj.get("lon").isJsonNull()) && !jsonObj.get("lon").isJsonPrimitive()) { + throw new IllegalArgumentException(String.format("Expected the field `lon` to be a primitive type in the JSON string but got `%s`", jsonObj.get("lon").toString())); + } + } + + public static class CustomTypeAdapterFactory implements TypeAdapterFactory { + @SuppressWarnings("unchecked") + @Override + public TypeAdapter create(Gson gson, TypeToken type) { + if (!MatchedPoint.class.isAssignableFrom(type.getRawType())) { + return null; // this class only serializes 'MatchedPoint' and its subtypes + } + final TypeAdapter elementAdapter = gson.getAdapter(JsonElement.class); + final TypeAdapter thisAdapter + = gson.getDelegateAdapter(this, TypeToken.get(MatchedPoint.class)); + + return (TypeAdapter) new TypeAdapter() { + @Override + public void write(JsonWriter out, MatchedPoint value) throws IOException { + JsonObject obj = thisAdapter.toJsonTree(value).getAsJsonObject(); + elementAdapter.write(out, obj); + } + + @Override + public MatchedPoint read(JsonReader in) throws IOException { + JsonElement jsonElement = elementAdapter.read(in); + validateJsonElement(jsonElement); + return thisAdapter.fromJsonTree(jsonElement); + } + + }.nullSafe(); + } + } + + /** + * Create an instance of MatchedPoint given an JSON string + * + * @param jsonString JSON string + * @return An instance of MatchedPoint + * @throws IOException if the JSON string is invalid with respect to MatchedPoint + */ + public static MatchedPoint fromJson(String jsonString) throws IOException { + return JSON.getGson().fromJson(jsonString, MatchedPoint.class); + } + + /** + * Convert an instance of MatchedPoint to an JSON string + * + * @return JSON string + */ + public String toJson() { + return JSON.getGson().toJson(this); + } } diff --git a/src/main/java/com/adzerk/sdk/generated/model/Placement.java b/src/main/java/com/adzerk/sdk/generated/model/Placement.java index d0b4ff6..570fa19 100644 --- a/src/main/java/com/adzerk/sdk/generated/model/Placement.java +++ b/src/main/java/com/adzerk/sdk/generated/model/Placement.java @@ -14,693 +14,654 @@ package com.adzerk.sdk.generated.model; import java.util.Objects; -import java.util.Arrays; import com.adzerk.sdk.generated.model.SkipFilters; import com.google.gson.TypeAdapter; import com.google.gson.annotations.JsonAdapter; import com.google.gson.annotations.SerializedName; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; +import org.openapitools.jackson.nullable.JsonNullable; import java.io.Serializable; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.google.gson.TypeAdapterFactory; +import com.google.gson.reflect.TypeToken; +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; +import java.io.IOException; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import com.adzerk.sdk.generated.JSON; + /** * Placement */ -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-07-16T01:15:27.717Z[Etc/UTC]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-08-11T14:42:50.054336-03:00[America/Argentina/Cordoba]", comments = "Generator version: 7.14.0") public class Placement implements Serializable { private static final long serialVersionUID = 1L; public static final String SERIALIZED_NAME_DIV_NAME = "divName"; @SerializedName(SERIALIZED_NAME_DIV_NAME) + @javax.annotation.Nullable private String divName; public static final String SERIALIZED_NAME_NETWORK_ID = "networkId"; @SerializedName(SERIALIZED_NAME_NETWORK_ID) + @javax.annotation.Nullable private Integer networkId; public static final String SERIALIZED_NAME_SITE_ID = "siteId"; @SerializedName(SERIALIZED_NAME_SITE_ID) + @javax.annotation.Nullable private Integer siteId; public static final String SERIALIZED_NAME_AD_TYPES = "adTypes"; @SerializedName(SERIALIZED_NAME_AD_TYPES) - private List adTypes = null; + @javax.annotation.Nullable + private List adTypes = new ArrayList<>(); public static final String SERIALIZED_NAME_ZONE_IDS = "zoneIds"; @SerializedName(SERIALIZED_NAME_ZONE_IDS) - private List zoneIds = null; + @javax.annotation.Nullable + private List zoneIds; public static final String SERIALIZED_NAME_CAMPAIGN_ID = "campaignId"; @SerializedName(SERIALIZED_NAME_CAMPAIGN_ID) + @javax.annotation.Nullable private Integer campaignId; public static final String SERIALIZED_NAME_FLIGHT_ID = "flightId"; @SerializedName(SERIALIZED_NAME_FLIGHT_ID) + @javax.annotation.Nullable private Integer flightId; public static final String SERIALIZED_NAME_AD_ID = "adId"; @SerializedName(SERIALIZED_NAME_AD_ID) + @javax.annotation.Nullable private Integer adId; public static final String SERIALIZED_NAME_CLICK_URL = "clickUrl"; @SerializedName(SERIALIZED_NAME_CLICK_URL) + @javax.annotation.Nullable private String clickUrl; public static final String SERIALIZED_NAME_PROPERTIES = "properties"; @SerializedName(SERIALIZED_NAME_PROPERTIES) + @javax.annotation.Nullable private Object properties; public static final String SERIALIZED_NAME_EVENT_IDS = "eventIds"; @SerializedName(SERIALIZED_NAME_EVENT_IDS) - private List eventIds = null; + @javax.annotation.Nullable + private List eventIds; public static final String SERIALIZED_NAME_OVERRIDES = "overrides"; @SerializedName(SERIALIZED_NAME_OVERRIDES) + @javax.annotation.Nullable private Object overrides; public static final String SERIALIZED_NAME_CONTENT_KEYS = "contentKeys"; @SerializedName(SERIALIZED_NAME_CONTENT_KEYS) - private Map contentKeys = null; + @javax.annotation.Nullable + private Map contentKeys; public static final String SERIALIZED_NAME_COUNT = "count"; @SerializedName(SERIALIZED_NAME_COUNT) + @javax.annotation.Nullable private Integer count; public static final String SERIALIZED_NAME_PROPORTIONALITY = "proportionality"; @SerializedName(SERIALIZED_NAME_PROPORTIONALITY) + @javax.annotation.Nullable private Boolean proportionality; public static final String SERIALIZED_NAME_ECPM_PARTITION = "ecpmPartition"; + @Deprecated @SerializedName(SERIALIZED_NAME_ECPM_PARTITION) + @javax.annotation.Nullable private String ecpmPartition; public static final String SERIALIZED_NAME_ECPM_PARTITIONS = "ecpmPartitions"; @SerializedName(SERIALIZED_NAME_ECPM_PARTITIONS) - private List ecpmPartitions = null; + @javax.annotation.Nullable + private List ecpmPartitions; public static final String SERIALIZED_NAME_EVENT_MULTIPLIER = "eventMultiplier"; @SerializedName(SERIALIZED_NAME_EVENT_MULTIPLIER) + @javax.annotation.Nullable private Integer eventMultiplier; public static final String SERIALIZED_NAME_SKIP_SELECTION = "skipSelection"; @SerializedName(SERIALIZED_NAME_SKIP_SELECTION) + @javax.annotation.Nullable private Boolean skipSelection; public static final String SERIALIZED_NAME_AD_QUERY = "adQuery"; @SerializedName(SERIALIZED_NAME_AD_QUERY) + @javax.annotation.Nullable private Object adQuery; public static final String SERIALIZED_NAME_FLOOR_PRICE = "floorPrice"; @SerializedName(SERIALIZED_NAME_FLOOR_PRICE) + @javax.annotation.Nullable private Float floorPrice; public static final String SERIALIZED_NAME_FLOOR_CPC = "floorCpc"; @SerializedName(SERIALIZED_NAME_FLOOR_CPC) + @javax.annotation.Nullable private Float floorCpc; public static final String SERIALIZED_NAME_SKIP_FILTERS = "skipFilters"; @SerializedName(SERIALIZED_NAME_SKIP_FILTERS) + @javax.annotation.Nullable private SkipFilters skipFilters; + public Placement() { + } - public Placement divName(String divName) { - + public Placement divName(@javax.annotation.Nullable String divName) { this.divName = divName; return this; } - /** + /** * A unique name for the placement defined by you * @return divName - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "A unique name for the placement defined by you") - public String getDivName() { return divName; } - - public void setDivName(String divName) { + public void setDivName(@javax.annotation.Nullable String divName) { this.divName = divName; } - public Placement networkId(Integer networkId) { - + public Placement networkId(@javax.annotation.Nullable Integer networkId) { this.networkId = networkId; return this; } - /** + /** * The numeric network id * @return networkId - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "The numeric network id") - public Integer getNetworkId() { return networkId; } - - public void setNetworkId(Integer networkId) { + public void setNetworkId(@javax.annotation.Nullable Integer networkId) { this.networkId = networkId; } - public Placement siteId(Integer siteId) { - + public Placement siteId(@javax.annotation.Nullable Integer siteId) { this.siteId = siteId; return this; } - /** + /** * The numeric site id * @return siteId - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "The numeric site id") - public Integer getSiteId() { return siteId; } - - public void setSiteId(Integer siteId) { + public void setSiteId(@javax.annotation.Nullable Integer siteId) { this.siteId = siteId; } - public Placement adTypes(List adTypes) { - + public Placement adTypes(@javax.annotation.Nullable List adTypes) { this.adTypes = adTypes; return this; } public Placement addAdTypesItem(Integer adTypesItem) { if (this.adTypes == null) { - this.adTypes = new ArrayList(); + this.adTypes = new ArrayList<>(); } this.adTypes.add(adTypesItem); return this; } - /** + /** * One or more integer ad types. More info [here](https://dev.adzerk.com/docs/ad-sizes) * @return adTypes - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "One or more integer ad types. More info [here](https://dev.adzerk.com/docs/ad-sizes)") - public List getAdTypes() { return adTypes; } - - public void setAdTypes(List adTypes) { + public void setAdTypes(@javax.annotation.Nullable List adTypes) { this.adTypes = adTypes; } - public Placement zoneIds(List zoneIds) { - + public Placement zoneIds(@javax.annotation.Nullable List zoneIds) { this.zoneIds = zoneIds; return this; } public Placement addZoneIdsItem(Integer zoneIdsItem) { if (this.zoneIds == null) { - this.zoneIds = new ArrayList(); + this.zoneIds = new ArrayList<>(); } this.zoneIds.add(zoneIdsItem); return this; } - /** + /** * Zone IDs to use * @return zoneIds - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "Zone IDs to use") - public List getZoneIds() { return zoneIds; } - - public void setZoneIds(List zoneIds) { + public void setZoneIds(@javax.annotation.Nullable List zoneIds) { this.zoneIds = zoneIds; } - public Placement campaignId(Integer campaignId) { - + public Placement campaignId(@javax.annotation.Nullable Integer campaignId) { this.campaignId = campaignId; return this; } - /** + /** * A numeric campaign id; if specified, only consider ads in that campaign * @return campaignId - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "A numeric campaign id; if specified, only consider ads in that campaign") - public Integer getCampaignId() { return campaignId; } - - public void setCampaignId(Integer campaignId) { + public void setCampaignId(@javax.annotation.Nullable Integer campaignId) { this.campaignId = campaignId; } - public Placement flightId(Integer flightId) { - + public Placement flightId(@javax.annotation.Nullable Integer flightId) { this.flightId = flightId; return this; } - /** + /** * A numeric ad (flight-creative map) id; if specified, only serve that ad if possible * @return flightId - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "A numeric ad (flight-creative map) id; if specified, only serve that ad if possible") - public Integer getFlightId() { return flightId; } - - public void setFlightId(Integer flightId) { + public void setFlightId(@javax.annotation.Nullable Integer flightId) { this.flightId = flightId; } - public Placement adId(Integer adId) { - + public Placement adId(@javax.annotation.Nullable Integer adId) { this.adId = adId; return this; } - /** + /** * A numeric ad (flight-creative map) id; if specified, only serve that ad if possible * @return adId - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "A numeric ad (flight-creative map) id; if specified, only serve that ad if possible") - public Integer getAdId() { return adId; } - - public void setAdId(Integer adId) { + public void setAdId(@javax.annotation.Nullable Integer adId) { this.adId = adId; } - public Placement clickUrl(String clickUrl) { - + public Placement clickUrl(@javax.annotation.Nullable String clickUrl) { this.clickUrl = clickUrl; return this; } - /** + /** * The ad's click-through URL * @return clickUrl - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "The ad's click-through URL") - public String getClickUrl() { return clickUrl; } - - public void setClickUrl(String clickUrl) { + public void setClickUrl(@javax.annotation.Nullable String clickUrl) { this.clickUrl = clickUrl; } - public Placement properties(Object properties) { - + public Placement properties(@javax.annotation.Nullable Object properties) { this.properties = properties; return this; } - /** + /** * A map of key/value pairs used for [Custom Targeting](https://dev.adzerk.com/docs/custom-targeting) * @return properties - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "A map of key/value pairs used for [Custom Targeting](https://dev.adzerk.com/docs/custom-targeting)") - public Object getProperties() { return properties; } - - public void setProperties(Object properties) { + public void setProperties(@javax.annotation.Nullable Object properties) { this.properties = properties; } - public Placement eventIds(List eventIds) { - + public Placement eventIds(@javax.annotation.Nullable List eventIds) { this.eventIds = eventIds; return this; } public Placement addEventIdsItem(Integer eventIdsItem) { if (this.eventIds == null) { - this.eventIds = new ArrayList(); + this.eventIds = new ArrayList<>(); } this.eventIds.add(eventIdsItem); return this; } - /** + /** * An array of numeric event types. Requests tracking URLs for custom events. See here for [Event Tracking IDs](https://dev.adzerk.com/v1.0/docs/custom-event-tracking) * @return eventIds - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "An array of numeric event types. Requests tracking URLs for custom events. See here for [Event Tracking IDs](https://dev.adzerk.com/v1.0/docs/custom-event-tracking)") - public List getEventIds() { return eventIds; } - - public void setEventIds(List eventIds) { + public void setEventIds(@javax.annotation.Nullable List eventIds) { this.eventIds = eventIds; } - public Placement overrides(Object overrides) { - + public Placement overrides(@javax.annotation.Nullable Object overrides) { this.overrides = overrides; return this; } - /** + /** * An object that overrides values for an advertiser, campaign, flight or ad. Used especially for header bidding * @return overrides - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "An object that overrides values for an advertiser, campaign, flight or ad. Used especially for header bidding") - public Object getOverrides() { return overrides; } - - public void setOverrides(Object overrides) { + public void setOverrides(@javax.annotation.Nullable Object overrides) { this.overrides = overrides; } - public Placement contentKeys(Map contentKeys) { - + public Placement contentKeys(@javax.annotation.Nullable Map contentKeys) { this.contentKeys = contentKeys; return this; } public Placement putContentKeysItem(String key, String contentKeysItem) { if (this.contentKeys == null) { - this.contentKeys = new HashMap(); + this.contentKeys = new HashMap<>(); } this.contentKeys.put(key, contentKeysItem); return this; } - /** + /** * A map of key/value pairs used with [ContentDB](https://dev.adzerk.com/docs/contentdb-1). The format is `\"contentKeys\": {\"schema\": \"contentKey\"}` * @return contentKeys - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "A map of key/value pairs used with [ContentDB](https://dev.adzerk.com/docs/contentdb-1). The format is `\"contentKeys\": {\"schema\": \"contentKey\"}`") - public Map getContentKeys() { return contentKeys; } - - public void setContentKeys(Map contentKeys) { + public void setContentKeys(@javax.annotation.Nullable Map contentKeys) { this.contentKeys = contentKeys; } - public Placement count(Integer count) { - + public Placement count(@javax.annotation.Nullable Integer count) { this.count = count; return this; } - /** + /** * (BETA) The number of ads to return per placement. Integer between 1 and 20 * @return count - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "(BETA) The number of ads to return per placement. Integer between 1 and 20") - public Integer getCount() { return count; } - - public void setCount(Integer count) { + public void setCount(@javax.annotation.Nullable Integer count) { this.count = count; } - public Placement proportionality(Boolean proportionality) { - + public Placement proportionality(@javax.annotation.Nullable Boolean proportionality) { this.proportionality = proportionality; return this; } - /** + /** * (BETA) If true, fills ads in a multi-winner placement in proportion to the flight's goals * @return proportionality - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "(BETA) If true, fills ads in a multi-winner placement in proportion to the flight's goals") - public Boolean getProportionality() { return proportionality; } - - public void setProportionality(Boolean proportionality) { + public void setProportionality(@javax.annotation.Nullable Boolean proportionality) { this.proportionality = proportionality; } - public Placement ecpmPartition(String ecpmPartition) { - + @Deprecated + public Placement ecpmPartition(@javax.annotation.Nullable String ecpmPartition) { this.ecpmPartition = ecpmPartition; return this; } - /** + /** * (BETA) The name of the eCPM Partition that should be used to source eCPM data for auctions * @return ecpmPartition - **/ + * @deprecated + */ + @Deprecated @javax.annotation.Nullable - @ApiModelProperty(value = "(BETA) The name of the eCPM Partition that should be used to source eCPM data for auctions") - public String getEcpmPartition() { return ecpmPartition; } - - public void setEcpmPartition(String ecpmPartition) { + @Deprecated + public void setEcpmPartition(@javax.annotation.Nullable String ecpmPartition) { this.ecpmPartition = ecpmPartition; } - public Placement ecpmPartitions(List ecpmPartitions) { - + public Placement ecpmPartitions(@javax.annotation.Nullable List ecpmPartitions) { this.ecpmPartitions = ecpmPartitions; return this; } public Placement addEcpmPartitionsItem(String ecpmPartitionsItem) { if (this.ecpmPartitions == null) { - this.ecpmPartitions = new ArrayList(); + this.ecpmPartitions = new ArrayList<>(); } this.ecpmPartitions.add(ecpmPartitionsItem); return this; } - /** + /** * (BETA) The names of the eCPM Partitions that should be used to source eCPM data for auctions * @return ecpmPartitions - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "(BETA) The names of the eCPM Partitions that should be used to source eCPM data for auctions") - public List getEcpmPartitions() { return ecpmPartitions; } - - public void setEcpmPartitions(List ecpmPartitions) { + public void setEcpmPartitions(@javax.annotation.Nullable List ecpmPartitions) { this.ecpmPartitions = ecpmPartitions; } - public Placement eventMultiplier(Integer eventMultiplier) { - + public Placement eventMultiplier(@javax.annotation.Nullable Integer eventMultiplier) { this.eventMultiplier = eventMultiplier; return this; } - /** + /** * Get eventMultiplier * minimum: -100000000 * maximum: 100000000 * @return eventMultiplier - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public Integer getEventMultiplier() { return eventMultiplier; } - - public void setEventMultiplier(Integer eventMultiplier) { + public void setEventMultiplier(@javax.annotation.Nullable Integer eventMultiplier) { this.eventMultiplier = eventMultiplier; } - public Placement skipSelection(Boolean skipSelection) { - + public Placement skipSelection(@javax.annotation.Nullable Boolean skipSelection) { this.skipSelection = skipSelection; return this; } - /** + /** * Get skipSelection * @return skipSelection - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public Boolean getSkipSelection() { return skipSelection; } - - public void setSkipSelection(Boolean skipSelection) { + public void setSkipSelection(@javax.annotation.Nullable Boolean skipSelection) { this.skipSelection = skipSelection; } - public Placement adQuery(Object adQuery) { - + public Placement adQuery(@javax.annotation.Nullable Object adQuery) { this.adQuery = adQuery; return this; } - /** + /** * Get adQuery * @return adQuery - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public Object getAdQuery() { return adQuery; } - - public void setAdQuery(Object adQuery) { + public void setAdQuery(@javax.annotation.Nullable Object adQuery) { this.adQuery = adQuery; } - public Placement floorPrice(Float floorPrice) { - + public Placement floorPrice(@javax.annotation.Nullable Float floorPrice) { this.floorPrice = floorPrice; return this; } - /** + /** * Get floorPrice * @return floorPrice - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public Float getFloorPrice() { return floorPrice; } - - public void setFloorPrice(Float floorPrice) { + public void setFloorPrice(@javax.annotation.Nullable Float floorPrice) { this.floorPrice = floorPrice; } - public Placement floorCpc(Float floorCpc) { - + public Placement floorCpc(@javax.annotation.Nullable Float floorCpc) { this.floorCpc = floorCpc; return this; } - /** + /** * Get floorCpc * @return floorCpc - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public Float getFloorCpc() { return floorCpc; } - - public void setFloorCpc(Float floorCpc) { + public void setFloorCpc(@javax.annotation.Nullable Float floorCpc) { this.floorCpc = floorCpc; } - public Placement skipFilters(SkipFilters skipFilters) { - + public Placement skipFilters(@javax.annotation.Nullable SkipFilters skipFilters) { this.skipFilters = skipFilters; return this; } - /** + /** * Get skipFilters * @return skipFilters - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public SkipFilters getSkipFilters() { return skipFilters; } - - public void setSkipFilters(SkipFilters skipFilters) { + public void setSkipFilters(@javax.annotation.Nullable SkipFilters skipFilters) { this.skipFilters = skipFilters; } + @Override public boolean equals(Object o) { if (this == o) { @@ -735,11 +696,22 @@ public boolean equals(Object o) { Objects.equals(this.skipFilters, placement.skipFilters); } + private static boolean equalsNullable(JsonNullable a, JsonNullable b) { + return a == b || (a != null && b != null && a.isPresent() && b.isPresent() && Objects.deepEquals(a.get(), b.get())); + } + @Override public int hashCode() { return Objects.hash(divName, networkId, siteId, adTypes, zoneIds, campaignId, flightId, adId, clickUrl, properties, eventIds, overrides, contentKeys, count, proportionality, ecpmPartition, ecpmPartitions, eventMultiplier, skipSelection, adQuery, floorPrice, floorCpc, skipFilters); } + private static int hashCodeNullable(JsonNullable a) { + if (a == null) { + return 1; + } + return a.isPresent() ? Arrays.deepHashCode(new Object[]{a.get()}) : 31; + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); @@ -782,5 +754,117 @@ private String toIndentedString(Object o) { return o.toString().replace("\n", "\n "); } + + public static HashSet openapiFields; + public static HashSet openapiRequiredFields; + + static { + // a set of all properties/fields (JSON key names) + openapiFields = new HashSet(Arrays.asList("divName", "networkId", "siteId", "adTypes", "zoneIds", "campaignId", "flightId", "adId", "clickUrl", "properties", "eventIds", "overrides", "contentKeys", "count", "proportionality", "ecpmPartition", "ecpmPartitions", "eventMultiplier", "skipSelection", "adQuery", "floorPrice", "floorCpc", "skipFilters")); + + // a set of required properties/fields (JSON key names) + openapiRequiredFields = new HashSet(0); + } + + /** + * Validates the JSON Element and throws an exception if issues found + * + * @param jsonElement JSON Element + * @throws IOException if the JSON Element is invalid with respect to Placement + */ + public static void validateJsonElement(JsonElement jsonElement) throws IOException { + if (jsonElement == null) { + if (!Placement.openapiRequiredFields.isEmpty()) { // has required fields but JSON element is null + throw new IllegalArgumentException(String.format("The required field(s) %s in Placement is not found in the empty JSON string", Placement.openapiRequiredFields.toString())); + } + } + + Set> entries = jsonElement.getAsJsonObject().entrySet(); + // check to see if the JSON string contains additional fields + for (Map.Entry entry : entries) { + if (!Placement.openapiFields.contains(entry.getKey())) { + throw new IllegalArgumentException(String.format("The field `%s` in the JSON string is not defined in the `Placement` properties. JSON: %s", entry.getKey(), jsonElement.toString())); + } + } + JsonObject jsonObj = jsonElement.getAsJsonObject(); + if ((jsonObj.get("divName") != null && !jsonObj.get("divName").isJsonNull()) && !jsonObj.get("divName").isJsonPrimitive()) { + throw new IllegalArgumentException(String.format("Expected the field `divName` to be a primitive type in the JSON string but got `%s`", jsonObj.get("divName").toString())); + } + // ensure the optional json data is an array if present + if (jsonObj.get("adTypes") != null && !jsonObj.get("adTypes").isJsonNull() && !jsonObj.get("adTypes").isJsonArray()) { + throw new IllegalArgumentException(String.format("Expected the field `adTypes` to be an array in the JSON string but got `%s`", jsonObj.get("adTypes").toString())); + } + // ensure the optional json data is an array if present + if (jsonObj.get("zoneIds") != null && !jsonObj.get("zoneIds").isJsonNull() && !jsonObj.get("zoneIds").isJsonArray()) { + throw new IllegalArgumentException(String.format("Expected the field `zoneIds` to be an array in the JSON string but got `%s`", jsonObj.get("zoneIds").toString())); + } + if ((jsonObj.get("clickUrl") != null && !jsonObj.get("clickUrl").isJsonNull()) && !jsonObj.get("clickUrl").isJsonPrimitive()) { + throw new IllegalArgumentException(String.format("Expected the field `clickUrl` to be a primitive type in the JSON string but got `%s`", jsonObj.get("clickUrl").toString())); + } + // ensure the optional json data is an array if present + if (jsonObj.get("eventIds") != null && !jsonObj.get("eventIds").isJsonNull() && !jsonObj.get("eventIds").isJsonArray()) { + throw new IllegalArgumentException(String.format("Expected the field `eventIds` to be an array in the JSON string but got `%s`", jsonObj.get("eventIds").toString())); + } + if ((jsonObj.get("ecpmPartition") != null && !jsonObj.get("ecpmPartition").isJsonNull()) && !jsonObj.get("ecpmPartition").isJsonPrimitive()) { + throw new IllegalArgumentException(String.format("Expected the field `ecpmPartition` to be a primitive type in the JSON string but got `%s`", jsonObj.get("ecpmPartition").toString())); + } + // ensure the optional json data is an array if present + if (jsonObj.get("ecpmPartitions") != null && !jsonObj.get("ecpmPartitions").isJsonNull() && !jsonObj.get("ecpmPartitions").isJsonArray()) { + throw new IllegalArgumentException(String.format("Expected the field `ecpmPartitions` to be an array in the JSON string but got `%s`", jsonObj.get("ecpmPartitions").toString())); + } + // validate the optional field `skipFilters` + if (jsonObj.get("skipFilters") != null && !jsonObj.get("skipFilters").isJsonNull()) { + SkipFilters.validateJsonElement(jsonObj.get("skipFilters")); + } + } + + public static class CustomTypeAdapterFactory implements TypeAdapterFactory { + @SuppressWarnings("unchecked") + @Override + public TypeAdapter create(Gson gson, TypeToken type) { + if (!Placement.class.isAssignableFrom(type.getRawType())) { + return null; // this class only serializes 'Placement' and its subtypes + } + final TypeAdapter elementAdapter = gson.getAdapter(JsonElement.class); + final TypeAdapter thisAdapter + = gson.getDelegateAdapter(this, TypeToken.get(Placement.class)); + + return (TypeAdapter) new TypeAdapter() { + @Override + public void write(JsonWriter out, Placement value) throws IOException { + JsonObject obj = thisAdapter.toJsonTree(value).getAsJsonObject(); + elementAdapter.write(out, obj); + } + + @Override + public Placement read(JsonReader in) throws IOException { + JsonElement jsonElement = elementAdapter.read(in); + validateJsonElement(jsonElement); + return thisAdapter.fromJsonTree(jsonElement); + } + + }.nullSafe(); + } + } + + /** + * Create an instance of Placement given an JSON string + * + * @param jsonString JSON string + * @return An instance of Placement + * @throws IOException if the JSON string is invalid with respect to Placement + */ + public static Placement fromJson(String jsonString) throws IOException { + return JSON.getGson().fromJson(jsonString, Placement.class); + } + + /** + * Convert an instance of Placement to an JSON string + * + * @return JSON string + */ + public String toJson() { + return JSON.getGson().toJson(this); + } } diff --git a/src/main/java/com/adzerk/sdk/generated/model/PricingData.java b/src/main/java/com/adzerk/sdk/generated/model/PricingData.java index d5e9add..9624d65 100644 --- a/src/main/java/com/adzerk/sdk/generated/model/PricingData.java +++ b/src/main/java/com/adzerk/sdk/generated/model/PricingData.java @@ -14,160 +14,169 @@ package com.adzerk.sdk.generated.model; import java.util.Objects; -import java.util.Arrays; import com.google.gson.TypeAdapter; import com.google.gson.annotations.JsonAdapter; import com.google.gson.annotations.SerializedName; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; import java.io.IOException; +import java.util.Arrays; import java.io.Serializable; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.google.gson.TypeAdapterFactory; +import com.google.gson.reflect.TypeToken; +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; +import java.io.IOException; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import com.adzerk.sdk.generated.JSON; + /** * PricingData */ -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-07-16T01:15:27.717Z[Etc/UTC]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-08-11T14:42:50.054336-03:00[America/Argentina/Cordoba]", comments = "Generator version: 7.14.0") public class PricingData implements Serializable { private static final long serialVersionUID = 1L; public static final String SERIALIZED_NAME_PRICE = "price"; @SerializedName(SERIALIZED_NAME_PRICE) + @javax.annotation.Nullable private Float price; public static final String SERIALIZED_NAME_CLEAR_PRICE = "clearPrice"; @SerializedName(SERIALIZED_NAME_CLEAR_PRICE) + @javax.annotation.Nullable private Float clearPrice; public static final String SERIALIZED_NAME_REVENUE = "revenue"; @SerializedName(SERIALIZED_NAME_REVENUE) + @javax.annotation.Nullable private Float revenue; public static final String SERIALIZED_NAME_RATE_TYPE = "rateType"; @SerializedName(SERIALIZED_NAME_RATE_TYPE) + @javax.annotation.Nullable private Integer rateType; public static final String SERIALIZED_NAME_E_C_P_M = "eCPM"; @SerializedName(SERIALIZED_NAME_E_C_P_M) + @javax.annotation.Nullable private Float eCPM; + public PricingData() { + } - public PricingData price(Float price) { - + public PricingData price(@javax.annotation.Nullable Float price) { this.price = price; return this; } - /** + /** * Get price * @return price - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public Float getPrice() { return price; } - - public void setPrice(Float price) { + public void setPrice(@javax.annotation.Nullable Float price) { this.price = price; } - public PricingData clearPrice(Float clearPrice) { - + public PricingData clearPrice(@javax.annotation.Nullable Float clearPrice) { this.clearPrice = clearPrice; return this; } - /** + /** * Get clearPrice * @return clearPrice - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public Float getClearPrice() { return clearPrice; } - - public void setClearPrice(Float clearPrice) { + public void setClearPrice(@javax.annotation.Nullable Float clearPrice) { this.clearPrice = clearPrice; } - public PricingData revenue(Float revenue) { - + public PricingData revenue(@javax.annotation.Nullable Float revenue) { this.revenue = revenue; return this; } - /** + /** * Get revenue * @return revenue - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public Float getRevenue() { return revenue; } - - public void setRevenue(Float revenue) { + public void setRevenue(@javax.annotation.Nullable Float revenue) { this.revenue = revenue; } - public PricingData rateType(Integer rateType) { - + public PricingData rateType(@javax.annotation.Nullable Integer rateType) { this.rateType = rateType; return this; } - /** + /** * Get rateType * @return rateType - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public Integer getRateType() { return rateType; } - - public void setRateType(Integer rateType) { + public void setRateType(@javax.annotation.Nullable Integer rateType) { this.rateType = rateType; } - public PricingData eCPM(Float eCPM) { - + public PricingData eCPM(@javax.annotation.Nullable Float eCPM) { this.eCPM = eCPM; return this; } - /** + /** * Get eCPM * @return eCPM - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "") - public Float geteCPM() { return eCPM; } - - public void seteCPM(Float eCPM) { + public void seteCPM(@javax.annotation.Nullable Float eCPM) { this.eCPM = eCPM; } + @Override public boolean equals(Object o) { if (this == o) { @@ -213,5 +222,88 @@ private String toIndentedString(Object o) { return o.toString().replace("\n", "\n "); } + + public static HashSet openapiFields; + public static HashSet openapiRequiredFields; + + static { + // a set of all properties/fields (JSON key names) + openapiFields = new HashSet(Arrays.asList("price", "clearPrice", "revenue", "rateType", "eCPM")); + + // a set of required properties/fields (JSON key names) + openapiRequiredFields = new HashSet(0); + } + + /** + * Validates the JSON Element and throws an exception if issues found + * + * @param jsonElement JSON Element + * @throws IOException if the JSON Element is invalid with respect to PricingData + */ + public static void validateJsonElement(JsonElement jsonElement) throws IOException { + if (jsonElement == null) { + if (!PricingData.openapiRequiredFields.isEmpty()) { // has required fields but JSON element is null + throw new IllegalArgumentException(String.format("The required field(s) %s in PricingData is not found in the empty JSON string", PricingData.openapiRequiredFields.toString())); + } + } + + Set> entries = jsonElement.getAsJsonObject().entrySet(); + // check to see if the JSON string contains additional fields + for (Map.Entry entry : entries) { + if (!PricingData.openapiFields.contains(entry.getKey())) { + throw new IllegalArgumentException(String.format("The field `%s` in the JSON string is not defined in the `PricingData` properties. JSON: %s", entry.getKey(), jsonElement.toString())); + } + } + JsonObject jsonObj = jsonElement.getAsJsonObject(); + } + + public static class CustomTypeAdapterFactory implements TypeAdapterFactory { + @SuppressWarnings("unchecked") + @Override + public TypeAdapter create(Gson gson, TypeToken type) { + if (!PricingData.class.isAssignableFrom(type.getRawType())) { + return null; // this class only serializes 'PricingData' and its subtypes + } + final TypeAdapter elementAdapter = gson.getAdapter(JsonElement.class); + final TypeAdapter thisAdapter + = gson.getDelegateAdapter(this, TypeToken.get(PricingData.class)); + + return (TypeAdapter) new TypeAdapter() { + @Override + public void write(JsonWriter out, PricingData value) throws IOException { + JsonObject obj = thisAdapter.toJsonTree(value).getAsJsonObject(); + elementAdapter.write(out, obj); + } + + @Override + public PricingData read(JsonReader in) throws IOException { + JsonElement jsonElement = elementAdapter.read(in); + validateJsonElement(jsonElement); + return thisAdapter.fromJsonTree(jsonElement); + } + + }.nullSafe(); + } + } + + /** + * Create an instance of PricingData given an JSON string + * + * @param jsonString JSON string + * @return An instance of PricingData + * @throws IOException if the JSON string is invalid with respect to PricingData + */ + public static PricingData fromJson(String jsonString) throws IOException { + return JSON.getGson().fromJson(jsonString, PricingData.class); + } + + /** + * Convert an instance of PricingData to an JSON string + * + * @return JSON string + */ + public String toJson() { + return JSON.getGson().toJson(this); + } } diff --git a/src/main/java/com/adzerk/sdk/generated/model/SkipFilters.java b/src/main/java/com/adzerk/sdk/generated/model/SkipFilters.java index 4164a3d..59f2d3b 100644 --- a/src/main/java/com/adzerk/sdk/generated/model/SkipFilters.java +++ b/src/main/java/com/adzerk/sdk/generated/model/SkipFilters.java @@ -14,241 +14,241 @@ package com.adzerk.sdk.generated.model; import java.util.Objects; -import java.util.Arrays; import com.google.gson.TypeAdapter; import com.google.gson.annotations.JsonAdapter; import com.google.gson.annotations.SerializedName; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; import java.io.IOException; +import java.util.Arrays; import java.io.Serializable; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.google.gson.TypeAdapterFactory; +import com.google.gson.reflect.TypeToken; +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; +import java.io.IOException; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import com.adzerk.sdk.generated.JSON; + /** * SkipFilters */ -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-07-16T01:15:27.717Z[Etc/UTC]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-08-11T14:42:50.054336-03:00[America/Argentina/Cordoba]", comments = "Generator version: 7.14.0") public class SkipFilters implements Serializable { private static final long serialVersionUID = 1L; public static final String SERIALIZED_NAME_DISTANCE = "distance"; @SerializedName(SERIALIZED_NAME_DISTANCE) + @javax.annotation.Nullable private Boolean distance; public static final String SERIALIZED_NAME_FACET = "facet"; @SerializedName(SERIALIZED_NAME_FACET) + @javax.annotation.Nullable private Boolean facet; public static final String SERIALIZED_NAME_GEODISTANCE = "geodistance"; @SerializedName(SERIALIZED_NAME_GEODISTANCE) + @javax.annotation.Nullable private Boolean geodistance; public static final String SERIALIZED_NAME_GEOLOCATION = "geolocation"; @SerializedName(SERIALIZED_NAME_GEOLOCATION) + @javax.annotation.Nullable private Boolean geolocation; public static final String SERIALIZED_NAME_KEYWORD = "keyword"; @SerializedName(SERIALIZED_NAME_KEYWORD) + @javax.annotation.Nullable private Boolean keyword; public static final String SERIALIZED_NAME_LOCATION = "location"; @SerializedName(SERIALIZED_NAME_LOCATION) + @javax.annotation.Nullable private Boolean location; public static final String SERIALIZED_NAME_PLACEMENT_LIMIT = "placementLimit"; @SerializedName(SERIALIZED_NAME_PLACEMENT_LIMIT) + @javax.annotation.Nullable private Boolean placementLimit; public static final String SERIALIZED_NAME_SITE_ZONE = "siteZone"; @SerializedName(SERIALIZED_NAME_SITE_ZONE) + @javax.annotation.Nullable private Boolean siteZone; + public SkipFilters() { + } - public SkipFilters distance(Boolean distance) { - + public SkipFilters distance(@javax.annotation.Nullable Boolean distance) { this.distance = distance; return this; } - /** + /** * Geodistance filter, which skips geodistance targeting if true. * @return distance - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "Geodistance filter, which skips geodistance targeting if true.") - public Boolean getDistance() { return distance; } - - public void setDistance(Boolean distance) { + public void setDistance(@javax.annotation.Nullable Boolean distance) { this.distance = distance; } - public SkipFilters facet(Boolean facet) { - + public SkipFilters facet(@javax.annotation.Nullable Boolean facet) { this.facet = facet; return this; } - /** + /** * Facet targeting filter, which skips facet targeting if true. * @return facet - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "Facet targeting filter, which skips facet targeting if true.") - public Boolean getFacet() { return facet; } - - public void setFacet(Boolean facet) { + public void setFacet(@javax.annotation.Nullable Boolean facet) { this.facet = facet; } - public SkipFilters geodistance(Boolean geodistance) { - + public SkipFilters geodistance(@javax.annotation.Nullable Boolean geodistance) { this.geodistance = geodistance; return this; } - /** + /** * Geodistance filter, which skips geodistance targeting if true. * @return geodistance - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "Geodistance filter, which skips geodistance targeting if true.") - public Boolean getGeodistance() { return geodistance; } - - public void setGeodistance(Boolean geodistance) { + public void setGeodistance(@javax.annotation.Nullable Boolean geodistance) { this.geodistance = geodistance; } - public SkipFilters geolocation(Boolean geolocation) { - + public SkipFilters geolocation(@javax.annotation.Nullable Boolean geolocation) { this.geolocation = geolocation; return this; } - /** + /** * Geolocation filter, which skips location targeting if true. * @return geolocation - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "Geolocation filter, which skips location targeting if true.") - public Boolean getGeolocation() { return geolocation; } - - public void setGeolocation(Boolean geolocation) { + public void setGeolocation(@javax.annotation.Nullable Boolean geolocation) { this.geolocation = geolocation; } - public SkipFilters keyword(Boolean keyword) { - + public SkipFilters keyword(@javax.annotation.Nullable Boolean keyword) { this.keyword = keyword; return this; } - /** + /** * Keyword limit filter, which skips all (ad and/or flight) keyword targeting if true. * @return keyword - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "Keyword limit filter, which skips all (ad and/or flight) keyword targeting if true.") - public Boolean getKeyword() { return keyword; } - - public void setKeyword(Boolean keyword) { + public void setKeyword(@javax.annotation.Nullable Boolean keyword) { this.keyword = keyword; } - public SkipFilters location(Boolean location) { - + public SkipFilters location(@javax.annotation.Nullable Boolean location) { this.location = location; return this; } - /** + /** * Geolocation filter, which skips location targeting if true. * @return location - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "Geolocation filter, which skips location targeting if true.") - public Boolean getLocation() { return location; } - - public void setLocation(Boolean location) { + public void setLocation(@javax.annotation.Nullable Boolean location) { this.location = location; } - public SkipFilters placementLimit(Boolean placementLimit) { - + public SkipFilters placementLimit(@javax.annotation.Nullable Boolean placementLimit) { this.placementLimit = placementLimit; return this; } - /** + /** * Placement limit filter, where no advertiser placement limit if true. * @return placementLimit - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "Placement limit filter, where no advertiser placement limit if true.") - public Boolean getPlacementLimit() { return placementLimit; } - - public void setPlacementLimit(Boolean placementLimit) { + public void setPlacementLimit(@javax.annotation.Nullable Boolean placementLimit) { this.placementLimit = placementLimit; } - public SkipFilters siteZone(Boolean siteZone) { - + public SkipFilters siteZone(@javax.annotation.Nullable Boolean siteZone) { this.siteZone = siteZone; return this; } - /** + /** * Site/zone limit filter, which skips site/zone targeting if true. * @return siteZone - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "Site/zone limit filter, which skips site/zone targeting if true.") - public Boolean getSiteZone() { return siteZone; } - - public void setSiteZone(Boolean siteZone) { + public void setSiteZone(@javax.annotation.Nullable Boolean siteZone) { this.siteZone = siteZone; } + @Override public boolean equals(Object o) { if (this == o) { @@ -300,5 +300,88 @@ private String toIndentedString(Object o) { return o.toString().replace("\n", "\n "); } + + public static HashSet openapiFields; + public static HashSet openapiRequiredFields; + + static { + // a set of all properties/fields (JSON key names) + openapiFields = new HashSet(Arrays.asList("distance", "facet", "geodistance", "geolocation", "keyword", "location", "placementLimit", "siteZone")); + + // a set of required properties/fields (JSON key names) + openapiRequiredFields = new HashSet(0); + } + + /** + * Validates the JSON Element and throws an exception if issues found + * + * @param jsonElement JSON Element + * @throws IOException if the JSON Element is invalid with respect to SkipFilters + */ + public static void validateJsonElement(JsonElement jsonElement) throws IOException { + if (jsonElement == null) { + if (!SkipFilters.openapiRequiredFields.isEmpty()) { // has required fields but JSON element is null + throw new IllegalArgumentException(String.format("The required field(s) %s in SkipFilters is not found in the empty JSON string", SkipFilters.openapiRequiredFields.toString())); + } + } + + Set> entries = jsonElement.getAsJsonObject().entrySet(); + // check to see if the JSON string contains additional fields + for (Map.Entry entry : entries) { + if (!SkipFilters.openapiFields.contains(entry.getKey())) { + throw new IllegalArgumentException(String.format("The field `%s` in the JSON string is not defined in the `SkipFilters` properties. JSON: %s", entry.getKey(), jsonElement.toString())); + } + } + JsonObject jsonObj = jsonElement.getAsJsonObject(); + } + + public static class CustomTypeAdapterFactory implements TypeAdapterFactory { + @SuppressWarnings("unchecked") + @Override + public TypeAdapter create(Gson gson, TypeToken type) { + if (!SkipFilters.class.isAssignableFrom(type.getRawType())) { + return null; // this class only serializes 'SkipFilters' and its subtypes + } + final TypeAdapter elementAdapter = gson.getAdapter(JsonElement.class); + final TypeAdapter thisAdapter + = gson.getDelegateAdapter(this, TypeToken.get(SkipFilters.class)); + + return (TypeAdapter) new TypeAdapter() { + @Override + public void write(JsonWriter out, SkipFilters value) throws IOException { + JsonObject obj = thisAdapter.toJsonTree(value).getAsJsonObject(); + elementAdapter.write(out, obj); + } + + @Override + public SkipFilters read(JsonReader in) throws IOException { + JsonElement jsonElement = elementAdapter.read(in); + validateJsonElement(jsonElement); + return thisAdapter.fromJsonTree(jsonElement); + } + + }.nullSafe(); + } + } + + /** + * Create an instance of SkipFilters given an JSON string + * + * @param jsonString JSON string + * @return An instance of SkipFilters + * @throws IOException if the JSON string is invalid with respect to SkipFilters + */ + public static SkipFilters fromJson(String jsonString) throws IOException { + return JSON.getGson().fromJson(jsonString, SkipFilters.class); + } + + /** + * Convert an instance of SkipFilters to an JSON string + * + * @return JSON string + */ + public String toJson() { + return JSON.getGson().toJson(this); + } } diff --git a/src/main/java/com/adzerk/sdk/generated/model/User.java b/src/main/java/com/adzerk/sdk/generated/model/User.java index 6b5eddd..01d30c8 100644 --- a/src/main/java/com/adzerk/sdk/generated/model/User.java +++ b/src/main/java/com/adzerk/sdk/generated/model/User.java @@ -14,53 +14,73 @@ package com.adzerk.sdk.generated.model; import java.util.Objects; -import java.util.Arrays; import com.google.gson.TypeAdapter; import com.google.gson.annotations.JsonAdapter; import com.google.gson.annotations.SerializedName; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; import java.io.IOException; +import java.util.Arrays; import java.io.Serializable; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.google.gson.TypeAdapterFactory; +import com.google.gson.reflect.TypeToken; +import com.google.gson.TypeAdapter; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; +import java.io.IOException; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import com.adzerk.sdk.generated.JSON; + /** * Object containing the UserKey used for [UserDB targeting](https://dev.adzerk.com/docs/userdb-1) */ -@ApiModel(description = "Object containing the UserKey used for [UserDB targeting](https://dev.adzerk.com/docs/userdb-1)") -@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-07-16T01:15:27.717Z[Etc/UTC]") +@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2025-08-11T14:42:50.054336-03:00[America/Argentina/Cordoba]", comments = "Generator version: 7.14.0") public class User implements Serializable { private static final long serialVersionUID = 1L; public static final String SERIALIZED_NAME_KEY = "key"; @SerializedName(SERIALIZED_NAME_KEY) + @javax.annotation.Nullable private String key; + public User() { + } - public User key(String key) { - + public User key(@javax.annotation.Nullable String key) { this.key = key; return this; } - /** + /** * The UserKey used for UserDB Targeting * @return key - **/ + */ @javax.annotation.Nullable - @ApiModelProperty(value = "The UserKey used for UserDB Targeting") - public String getKey() { return key; } - - public void setKey(String key) { + public void setKey(@javax.annotation.Nullable String key) { this.key = key; } + @Override public boolean equals(Object o) { if (this == o) { @@ -98,5 +118,91 @@ private String toIndentedString(Object o) { return o.toString().replace("\n", "\n "); } + + public static HashSet openapiFields; + public static HashSet openapiRequiredFields; + + static { + // a set of all properties/fields (JSON key names) + openapiFields = new HashSet(Arrays.asList("key")); + + // a set of required properties/fields (JSON key names) + openapiRequiredFields = new HashSet(0); + } + + /** + * Validates the JSON Element and throws an exception if issues found + * + * @param jsonElement JSON Element + * @throws IOException if the JSON Element is invalid with respect to User + */ + public static void validateJsonElement(JsonElement jsonElement) throws IOException { + if (jsonElement == null) { + if (!User.openapiRequiredFields.isEmpty()) { // has required fields but JSON element is null + throw new IllegalArgumentException(String.format("The required field(s) %s in User is not found in the empty JSON string", User.openapiRequiredFields.toString())); + } + } + + Set> entries = jsonElement.getAsJsonObject().entrySet(); + // check to see if the JSON string contains additional fields + for (Map.Entry entry : entries) { + if (!User.openapiFields.contains(entry.getKey())) { + throw new IllegalArgumentException(String.format("The field `%s` in the JSON string is not defined in the `User` properties. JSON: %s", entry.getKey(), jsonElement.toString())); + } + } + JsonObject jsonObj = jsonElement.getAsJsonObject(); + if ((jsonObj.get("key") != null && !jsonObj.get("key").isJsonNull()) && !jsonObj.get("key").isJsonPrimitive()) { + throw new IllegalArgumentException(String.format("Expected the field `key` to be a primitive type in the JSON string but got `%s`", jsonObj.get("key").toString())); + } + } + + public static class CustomTypeAdapterFactory implements TypeAdapterFactory { + @SuppressWarnings("unchecked") + @Override + public TypeAdapter create(Gson gson, TypeToken type) { + if (!User.class.isAssignableFrom(type.getRawType())) { + return null; // this class only serializes 'User' and its subtypes + } + final TypeAdapter elementAdapter = gson.getAdapter(JsonElement.class); + final TypeAdapter thisAdapter + = gson.getDelegateAdapter(this, TypeToken.get(User.class)); + + return (TypeAdapter) new TypeAdapter() { + @Override + public void write(JsonWriter out, User value) throws IOException { + JsonObject obj = thisAdapter.toJsonTree(value).getAsJsonObject(); + elementAdapter.write(out, obj); + } + + @Override + public User read(JsonReader in) throws IOException { + JsonElement jsonElement = elementAdapter.read(in); + validateJsonElement(jsonElement); + return thisAdapter.fromJsonTree(jsonElement); + } + + }.nullSafe(); + } + } + + /** + * Create an instance of User given an JSON string + * + * @param jsonString JSON string + * @return An instance of User + * @throws IOException if the JSON string is invalid with respect to User + */ + public static User fromJson(String jsonString) throws IOException { + return JSON.getGson().fromJson(jsonString, User.class); + } + + /** + * Convert an instance of User to an JSON string + * + * @return JSON string + */ + public String toJson() { + return JSON.getGson().toJson(this); + } } diff --git a/src/main/java/com/adzerk/sdk/model/DecisionResponse.java b/src/main/java/com/adzerk/sdk/model/DecisionResponse.java deleted file mode 100644 index c8ecaec..0000000 --- a/src/main/java/com/adzerk/sdk/model/DecisionResponse.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.adzerk.sdk.model; - -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import com.adzerk.sdk.generated.model.Decision; -import com.google.gson.Gson; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.internal.LinkedTreeMap; -import com.google.gson.reflect.TypeToken; - -import io.swagger.annotations.ApiModelProperty; - -public class DecisionResponse extends com.adzerk.sdk.generated.model.DecisionResponse { - private static final long serialVersionUID = 1; - - @javax.annotation.Nullable - @ApiModelProperty(value = "") - public Map getExplain() { - LinkedTreeMap explanation = (LinkedTreeMap) super.getExplain(); - - if (explanation == null) { return null; } - - return (Map) explanation; - } -} diff --git a/src/main/java/com/adzerk/sdk/model/UserRecord.java b/src/main/java/com/adzerk/sdk/model/UserRecord.java deleted file mode 100644 index b79cf41..0000000 --- a/src/main/java/com/adzerk/sdk/model/UserRecord.java +++ /dev/null @@ -1,162 +0,0 @@ -package com.adzerk.sdk.model; - -import java.io.Serializable; -import java.util.List; -import java.util.Map; - -import com.google.gson.annotations.SerializedName; - -public class UserRecord implements Serializable { - public static final String SERIALIZED_NAME_KEY = "key"; - @SerializedName(SERIALIZED_NAME_KEY) - private String key; - - public UserRecord key(String key) { - this.key = key; - return this; - } - - public String getKey() { - return key; - } - - public void setKey(String key) { - this.key = key; - } - - public static final String SERIALIZED_NAME_INTERESTS = "interests"; - @SerializedName(SERIALIZED_NAME_INTERESTS) - private List interests; - - public UserRecord interests(List interests) { - this.interests = interests; - return this; - } - - public List getInterests() { - return interests; - } - - public void setInterests(List interests) { - this.interests = interests; - } - - public static final String SERIALIZED_NAME_BLOCKED_ITEMS = "blockedItems"; - @SerializedName(SERIALIZED_NAME_BLOCKED_ITEMS) - private Map> blockedItems; - - public UserRecord blockedItems(Map> blockedItems) { - this.blockedItems = blockedItems; - return this; - } - - public Map> getBlockedItems() { - return blockedItems; - } - - public void setBlockedItems(Map> blockedItems) { - this.blockedItems = blockedItems; - } - - public static final String SERIALIZED_NAME_PARTNER_USER_IDS = "partnerUserIds"; - @SerializedName(SERIALIZED_NAME_PARTNER_USER_IDS) - private Map> partnerUserIds; - - public UserRecord partnerUserIds(Map> partnerUserIds) { - this.partnerUserIds = partnerUserIds; - return this; - } - - public Map> getPartnerUserIds() { - return partnerUserIds; - } - - public void setPartnerUserIds(Map> partnerUserIds) { - this.partnerUserIds = partnerUserIds; - } - - public static final String SERIALIZED_NAME_RETARGETING_SEGMENTS = "retargetingSegments"; - @SerializedName(SERIALIZED_NAME_RETARGETING_SEGMENTS) - private Map> retargetingSegments; - - public UserRecord retargetingSegments(Map> retargetingSegments) { - this.retargetingSegments = retargetingSegments; - return this; - } - - public Map> getRetargetingSegments() { - return retargetingSegments; - } - - public void setRetargetingSegments(Map> retargetingSegments) { - this.retargetingSegments = retargetingSegments; - } - - public static final String SERIALIZED_NAME_CUSTOM = "custom"; - @SerializedName(SERIALIZED_NAME_CUSTOM) - private Map custom; - - public UserRecord custom(Map custom) { - this.custom = custom; - return this; - } - - public Map getCustom() { - return custom; - } - - public void setCustom(Map custom) { - this.custom = custom; - } - - public static final String SERIALIZED_NAME_CONSENT = "consent"; - @SerializedName(SERIALIZED_NAME_CONSENT) - private Map consent; - - public UserRecord consent(Map consent) { - this.consent = consent; - return this; - } - - public Map getConsent() { - return consent; - } - - public void setConsent(Map consent) { - this.consent = consent; - } - - public static final String SERIALIZED_NAME_OPT_OUT = "optOut"; - @SerializedName(SERIALIZED_NAME_OPT_OUT) - private boolean optOut; - - public UserRecord optOut(boolean optOut) { - this.optOut = optOut; - return this; - } - - public boolean getOptOut() { - return optOut; - } - - public void setOptOut(boolean optOut) { - this.optOut = optOut; - } - - public static final String SERIALIZED_NAME_IP = "ip"; - @SerializedName(SERIALIZED_NAME_IP) - private String ip; - - public UserRecord ip(String ip) { - this.ip = ip; - return this; - } - - public String getIp() { - return ip; - } - - public void setIp(String ip) { - this.ip = ip; - } -} \ No newline at end of file diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml deleted file mode 100644 index e7b334d..0000000 --- a/src/main/resources/log4j2.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/src/test/java/com/adzerk/sdk/.gitkeep b/src/test/java/com/adzerk/sdk/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/test/java/com/adzerk/sdk/generated/api/DecisionApiTest.java b/src/test/java/com/adzerk/sdk/generated/api/DecisionApiTest.java new file mode 100644 index 0000000..cc813f0 --- /dev/null +++ b/src/test/java/com/adzerk/sdk/generated/api/DecisionApiTest.java @@ -0,0 +1,51 @@ +/* + * Adzerk Decision API + * Adzerk Decision API + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package com.adzerk.sdk.generated.api; + +import com.adzerk.sdk.generated.ApiException; +import com.adzerk.sdk.generated.model.DecisionRequest; +import com.adzerk.sdk.generated.model.DecisionResponse; +import org.junit.Test; +import org.junit.Ignore; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * API tests for DecisionApi + */ +@Ignore +public class DecisionApiTest { + + private final DecisionApi api = new DecisionApi(); + + + /** + * + * + * Request Decision(s) + * + * @throws ApiException + * if the Api call fails + */ + @Test + public void getDecisionsTest() throws ApiException { + DecisionRequest decisionRequest = null; + DecisionResponse response = api.getDecisions(decisionRequest); + // TODO: test validations + } + +} diff --git a/src/test/java/com/adzerk/sdk/generated/api/UserdbApiTest.java b/src/test/java/com/adzerk/sdk/generated/api/UserdbApiTest.java new file mode 100644 index 0000000..b44149d --- /dev/null +++ b/src/test/java/com/adzerk/sdk/generated/api/UserdbApiTest.java @@ -0,0 +1,187 @@ +/* + * Adzerk Decision API + * Adzerk Decision API + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package com.adzerk.sdk.generated.api; + +import com.adzerk.sdk.generated.ApiException; +import com.adzerk.sdk.generated.model.ConsentRequest; +import java.io.File; +import org.junit.Test; +import org.junit.Ignore; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * API tests for UserdbApi + */ +@Ignore +public class UserdbApiTest { + + private final UserdbApi api = new UserdbApi(); + + + /** + * + * + * Add Custom Properties to a User + * + * @throws ApiException + * if the Api call fails + */ + @Test + public void addCustomPropertiesTest() throws ApiException { + Integer networkId = null; + String userKey = null; + Object body = null; + File response = api.addCustomProperties(networkId, userKey, body); + // TODO: test validations + } + + /** + * + * + * Add Interests to a User + * + * @throws ApiException + * if the Api call fails + */ + @Test + public void addInterestsTest() throws ApiException { + Integer networkId = null; + String userKey = null; + String interest = null; + File response = api.addInterests(networkId, userKey, interest); + // TODO: test validations + } + + /** + * + * + * Add User to a Retargeting Segment + * + * @throws ApiException + * if the Api call fails + */ + @Test + public void addRetargetingSegmentTest() throws ApiException { + Integer networkId = null; + Integer advertiserId = null; + Integer retargetingSegmentId = null; + String userKey = null; + File response = api.addRetargetingSegment(networkId, advertiserId, retargetingSegmentId, userKey); + // TODO: test validations + } + + /** + * + * + * Forget User + * + * @throws ApiException + * if the Api call fails + */ + @Test + public void forgetTest() throws ApiException { + Integer networkId = null; + String userKey = null; + api.forget(networkId, userKey); + // TODO: test validations + } + + /** + * + * + * GDPR Consent + * + * @throws ApiException + * if the Api call fails + */ + @Test + public void gdprConsentTest() throws ApiException { + Integer networkId = null; + ConsentRequest consentRequest = null; + File response = api.gdprConsent(networkId, consentRequest); + // TODO: test validations + } + + /** + * + * + * IP Address Override + * + * @throws ApiException + * if the Api call fails + */ + @Test + public void ipOverrideTest() throws ApiException { + Integer networkId = null; + String userKey = null; + String ip = null; + File response = api.ipOverride(networkId, userKey, ip); + // TODO: test validations + } + + /** + * + * + * User Matching + * + * @throws ApiException + * if the Api call fails + */ + @Test + public void matchUserTest() throws ApiException { + Integer networkId = null; + String userKey = null; + Integer partnerId = null; + Integer userId = null; + File response = api.matchUser(networkId, userKey, partnerId, userId); + // TODO: test validations + } + + /** + * + * + * Opt-Out a User + * + * @throws ApiException + * if the Api call fails + */ + @Test + public void optOutTest() throws ApiException { + Integer networkId = null; + String userKey = null; + File response = api.optOut(networkId, userKey); + // TODO: test validations + } + + /** + * + * + * Read a User's UserDB Record + * + * @throws ApiException + * if the Api call fails + */ + @Test + public void readTest() throws ApiException { + Integer networkId = null; + String userKey = null; + Object response = api.read(networkId, userKey); + // TODO: test validations + } + +} diff --git a/src/test/java/com/adzerk/sdk/generated/model/ConsentRequestTest.java b/src/test/java/com/adzerk/sdk/generated/model/ConsentRequestTest.java new file mode 100644 index 0000000..1a95487 --- /dev/null +++ b/src/test/java/com/adzerk/sdk/generated/model/ConsentRequestTest.java @@ -0,0 +1,59 @@ +/* + * Adzerk Decision API + * Adzerk Decision API + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package com.adzerk.sdk.generated.model; + +import com.google.gson.TypeAdapter; +import com.google.gson.annotations.JsonAdapter; +import com.google.gson.annotations.SerializedName; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.IOException; +import org.junit.Assert; +import org.junit.Ignore; +import org.junit.Test; + + +/** + * Model tests for ConsentRequest + */ +public class ConsentRequestTest { + private final ConsentRequest model = new ConsentRequest(); + + /** + * Model tests for ConsentRequest + */ + @Test + public void testConsentRequest() { + // TODO: test ConsentRequest + } + + /** + * Test the property 'userKey' + */ + @Test + public void userKeyTest() { + // TODO: test userKey + } + + /** + * Test the property 'consent' + */ + @Test + public void consentTest() { + // TODO: test consent + } + +} diff --git a/src/test/java/com/adzerk/sdk/generated/model/ContentTest.java b/src/test/java/com/adzerk/sdk/generated/model/ContentTest.java new file mode 100644 index 0000000..871190e --- /dev/null +++ b/src/test/java/com/adzerk/sdk/generated/model/ContentTest.java @@ -0,0 +1,83 @@ +/* + * Adzerk Decision API + * Adzerk Decision API + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package com.adzerk.sdk.generated.model; + +import com.google.gson.TypeAdapter; +import com.google.gson.annotations.JsonAdapter; +import com.google.gson.annotations.SerializedName; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.IOException; +import org.junit.Assert; +import org.junit.Ignore; +import org.junit.Test; + + +/** + * Model tests for Content + */ +public class ContentTest { + private final Content model = new Content(); + + /** + * Model tests for Content + */ + @Test + public void testContent() { + // TODO: test Content + } + + /** + * Test the property 'type' + */ + @Test + public void typeTest() { + // TODO: test type + } + + /** + * Test the property 'template' + */ + @Test + public void templateTest() { + // TODO: test template + } + + /** + * Test the property 'customTemplate' + */ + @Test + public void customTemplateTest() { + // TODO: test customTemplate + } + + /** + * Test the property 'data' + */ + @Test + public void dataTest() { + // TODO: test data + } + + /** + * Test the property 'body' + */ + @Test + public void bodyTest() { + // TODO: test body + } + +} diff --git a/src/test/java/com/adzerk/sdk/generated/model/DecisionRequestTest.java b/src/test/java/com/adzerk/sdk/generated/model/DecisionRequestTest.java new file mode 100644 index 0000000..ac756a4 --- /dev/null +++ b/src/test/java/com/adzerk/sdk/generated/model/DecisionRequestTest.java @@ -0,0 +1,200 @@ +/* + * Adzerk Decision API + * Adzerk Decision API + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package com.adzerk.sdk.generated.model; + +import com.adzerk.sdk.generated.model.Placement; +import com.adzerk.sdk.generated.model.User; +import com.google.gson.TypeAdapter; +import com.google.gson.annotations.JsonAdapter; +import com.google.gson.annotations.SerializedName; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import org.openapitools.jackson.nullable.JsonNullable; +import org.junit.Assert; +import org.junit.Ignore; +import org.junit.Test; + + +/** + * Model tests for DecisionRequest + */ +public class DecisionRequestTest { + private final DecisionRequest model = new DecisionRequest(); + + /** + * Model tests for DecisionRequest + */ + @Test + public void testDecisionRequest() { + // TODO: test DecisionRequest + } + + /** + * Test the property 'placements' + */ + @Test + public void placementsTest() { + // TODO: test placements + } + + /** + * Test the property 'user' + */ + @Test + public void userTest() { + // TODO: test user + } + + /** + * Test the property 'keywords' + */ + @Test + public void keywordsTest() { + // TODO: test keywords + } + + /** + * Test the property 'url' + */ + @Test + public void urlTest() { + // TODO: test url + } + + /** + * Test the property 'referrer' + */ + @Test + public void referrerTest() { + // TODO: test referrer + } + + /** + * Test the property 'ip' + */ + @Test + public void ipTest() { + // TODO: test ip + } + + /** + * Test the property 'blockedCreatives' + */ + @Test + public void blockedCreativesTest() { + // TODO: test blockedCreatives + } + + /** + * Test the property 'isMobile' + */ + @Test + public void isMobileTest() { + // TODO: test isMobile + } + + /** + * Test the property 'includePricingData' + */ + @Test + public void includePricingDataTest() { + // TODO: test includePricingData + } + + /** + * Test the property 'notrack' + */ + @Test + public void notrackTest() { + // TODO: test notrack + } + + /** + * Test the property 'enableBotFiltering' + */ + @Test + public void enableBotFilteringTest() { + // TODO: test enableBotFiltering + } + + /** + * Test the property 'enableUserDBIP' + */ + @Test + public void enableUserDBIPTest() { + // TODO: test enableUserDBIP + } + + /** + * Test the property 'consent' + */ + @Test + public void consentTest() { + // TODO: test consent + } + + /** + * Test the property 'deviceID' + */ + @Test + public void deviceIDTest() { + // TODO: test deviceID + } + + /** + * Test the property 'parallel' + */ + @Test + public void parallelTest() { + // TODO: test parallel + } + + /** + * Test the property 'intendedLatitude' + */ + @Test + public void intendedLatitudeTest() { + // TODO: test intendedLatitude + } + + /** + * Test the property 'intendedLongitude' + */ + @Test + public void intendedLongitudeTest() { + // TODO: test intendedLongitude + } + + /** + * Test the property 'radius' + */ + @Test + public void radiusTest() { + // TODO: test radius + } + + /** + * Test the property 'includeMatchedPoints' + */ + @Test + public void includeMatchedPointsTest() { + // TODO: test includeMatchedPoints + } + +} diff --git a/src/test/java/com/adzerk/sdk/generated/model/DecisionResponseDecisionsValueTest.java b/src/test/java/com/adzerk/sdk/generated/model/DecisionResponseDecisionsValueTest.java new file mode 100644 index 0000000..207b321 --- /dev/null +++ b/src/test/java/com/adzerk/sdk/generated/model/DecisionResponseDecisionsValueTest.java @@ -0,0 +1,144 @@ +/* + * Adzerk Decision API + * Adzerk Decision API + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package com.adzerk.sdk.generated.model; + +import com.adzerk.sdk.generated.model.Content; +import com.adzerk.sdk.generated.model.Decision; +import com.adzerk.sdk.generated.model.Event; +import com.adzerk.sdk.generated.model.MatchedPoint; +import com.adzerk.sdk.generated.model.PricingData; +import com.google.gson.TypeAdapter; +import com.google.gson.annotations.JsonAdapter; +import com.google.gson.annotations.SerializedName; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; +import java.io.IOException; +import java.net.URI; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +/** + * Model tests for DecisionResponseDecisionsValue + */ +public class DecisionResponseDecisionsValueTest { + private final DecisionResponseDecisionsValue model = new DecisionResponseDecisionsValue(); + + /** + * Model tests for DecisionResponseDecisionsValue + */ + @Test + public void testDecisionResponseDecisionsValue() { + // TODO: test DecisionResponseDecisionsValue + } + + /** + * Test the property 'adId' + */ + @Test + public void adIdTest() { + // TODO: test adId + } + + /** + * Test the property 'advertiserId' + */ + @Test + public void advertiserIdTest() { + // TODO: test advertiserId + } + + /** + * Test the property 'creativeId' + */ + @Test + public void creativeIdTest() { + // TODO: test creativeId + } + + /** + * Test the property 'flightId' + */ + @Test + public void flightIdTest() { + // TODO: test flightId + } + + /** + * Test the property 'campaignId' + */ + @Test + public void campaignIdTest() { + // TODO: test campaignId + } + + /** + * Test the property 'priorityId' + */ + @Test + public void priorityIdTest() { + // TODO: test priorityId + } + + /** + * Test the property 'clickUrl' + */ + @Test + public void clickUrlTest() { + // TODO: test clickUrl + } + + /** + * Test the property 'contents' + */ + @Test + public void contentsTest() { + // TODO: test contents + } + + /** + * Test the property 'impressionUrl' + */ + @Test + public void impressionUrlTest() { + // TODO: test impressionUrl + } + + /** + * Test the property 'events' + */ + @Test + public void eventsTest() { + // TODO: test events + } + + /** + * Test the property 'matchedPoints' + */ + @Test + public void matchedPointsTest() { + // TODO: test matchedPoints + } + + /** + * Test the property 'pricing' + */ + @Test + public void pricingTest() { + // TODO: test pricing + } + +} diff --git a/src/test/java/com/adzerk/sdk/generated/model/DecisionResponseTest.java b/src/test/java/com/adzerk/sdk/generated/model/DecisionResponseTest.java new file mode 100644 index 0000000..514b7c2 --- /dev/null +++ b/src/test/java/com/adzerk/sdk/generated/model/DecisionResponseTest.java @@ -0,0 +1,72 @@ +/* + * Adzerk Decision API + * Adzerk Decision API + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package com.adzerk.sdk.generated.model; + +import com.adzerk.sdk.generated.model.AnyOfDecisionarray; +import com.adzerk.sdk.generated.model.User; +import com.google.gson.TypeAdapter; +import com.google.gson.annotations.JsonAdapter; +import com.google.gson.annotations.SerializedName; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.junit.Assert; +import org.junit.Ignore; +import org.junit.Test; + + +/** + * Model tests for DecisionResponse + */ +public class DecisionResponseTest { + private final DecisionResponse model = new DecisionResponse(); + + /** + * Model tests for DecisionResponse + */ + @Test + public void testDecisionResponse() { + // TODO: test DecisionResponse + } + + /** + * Test the property 'user' + */ + @Test + public void userTest() { + // TODO: test user + } + + /** + * Test the property 'decisions' + */ + @Test + public void decisionsTest() { + // TODO: test decisions + } + + /** + * Test the property 'explain' + */ + @Test + public void explainTest() { + // TODO: test explain + } + +} diff --git a/src/test/java/com/adzerk/sdk/generated/model/DecisionTest.java b/src/test/java/com/adzerk/sdk/generated/model/DecisionTest.java new file mode 100644 index 0000000..08aa6ed --- /dev/null +++ b/src/test/java/com/adzerk/sdk/generated/model/DecisionTest.java @@ -0,0 +1,146 @@ +/* + * Adzerk Decision API + * Adzerk Decision API + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package com.adzerk.sdk.generated.model; + +import com.adzerk.sdk.generated.model.Content; +import com.adzerk.sdk.generated.model.Event; +import com.adzerk.sdk.generated.model.MatchedPoint; +import com.adzerk.sdk.generated.model.PricingData; +import com.google.gson.TypeAdapter; +import com.google.gson.annotations.JsonAdapter; +import com.google.gson.annotations.SerializedName; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.IOException; +import java.net.URI; +import java.util.ArrayList; +import java.util.List; +import org.junit.Assert; +import org.junit.Ignore; +import org.junit.Test; + + +/** + * Model tests for Decision + */ +public class DecisionTest { + private final Decision model = new Decision(); + + /** + * Model tests for Decision + */ + @Test + public void testDecision() { + // TODO: test Decision + } + + /** + * Test the property 'adId' + */ + @Test + public void adIdTest() { + // TODO: test adId + } + + /** + * Test the property 'advertiserId' + */ + @Test + public void advertiserIdTest() { + // TODO: test advertiserId + } + + /** + * Test the property 'creativeId' + */ + @Test + public void creativeIdTest() { + // TODO: test creativeId + } + + /** + * Test the property 'flightId' + */ + @Test + public void flightIdTest() { + // TODO: test flightId + } + + /** + * Test the property 'campaignId' + */ + @Test + public void campaignIdTest() { + // TODO: test campaignId + } + + /** + * Test the property 'priorityId' + */ + @Test + public void priorityIdTest() { + // TODO: test priorityId + } + + /** + * Test the property 'clickUrl' + */ + @Test + public void clickUrlTest() { + // TODO: test clickUrl + } + + /** + * Test the property 'contents' + */ + @Test + public void contentsTest() { + // TODO: test contents + } + + /** + * Test the property 'impressionUrl' + */ + @Test + public void impressionUrlTest() { + // TODO: test impressionUrl + } + + /** + * Test the property 'events' + */ + @Test + public void eventsTest() { + // TODO: test events + } + + /** + * Test the property 'matchedPoints' + */ + @Test + public void matchedPointsTest() { + // TODO: test matchedPoints + } + + /** + * Test the property 'pricing' + */ + @Test + public void pricingTest() { + // TODO: test pricing + } + +} diff --git a/src/test/java/com/adzerk/sdk/generated/model/EventTest.java b/src/test/java/com/adzerk/sdk/generated/model/EventTest.java new file mode 100644 index 0000000..62b3a46 --- /dev/null +++ b/src/test/java/com/adzerk/sdk/generated/model/EventTest.java @@ -0,0 +1,60 @@ +/* + * Adzerk Decision API + * Adzerk Decision API + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package com.adzerk.sdk.generated.model; + +import com.google.gson.TypeAdapter; +import com.google.gson.annotations.JsonAdapter; +import com.google.gson.annotations.SerializedName; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.IOException; +import java.net.URI; +import org.junit.Assert; +import org.junit.Ignore; +import org.junit.Test; + + +/** + * Model tests for Event + */ +public class EventTest { + private final Event model = new Event(); + + /** + * Model tests for Event + */ + @Test + public void testEvent() { + // TODO: test Event + } + + /** + * Test the property 'id' + */ + @Test + public void idTest() { + // TODO: test id + } + + /** + * Test the property 'url' + */ + @Test + public void urlTest() { + // TODO: test url + } + +} diff --git a/src/test/java/com/adzerk/sdk/generated/model/MatchedPointTest.java b/src/test/java/com/adzerk/sdk/generated/model/MatchedPointTest.java new file mode 100644 index 0000000..7b94331 --- /dev/null +++ b/src/test/java/com/adzerk/sdk/generated/model/MatchedPointTest.java @@ -0,0 +1,59 @@ +/* + * Adzerk Decision API + * Adzerk Decision API + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package com.adzerk.sdk.generated.model; + +import com.google.gson.TypeAdapter; +import com.google.gson.annotations.JsonAdapter; +import com.google.gson.annotations.SerializedName; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.IOException; +import org.junit.Assert; +import org.junit.Ignore; +import org.junit.Test; + + +/** + * Model tests for MatchedPoint + */ +public class MatchedPointTest { + private final MatchedPoint model = new MatchedPoint(); + + /** + * Model tests for MatchedPoint + */ + @Test + public void testMatchedPoint() { + // TODO: test MatchedPoint + } + + /** + * Test the property 'lat' + */ + @Test + public void latTest() { + // TODO: test lat + } + + /** + * Test the property 'lon' + */ + @Test + public void lonTest() { + // TODO: test lon + } + +} diff --git a/src/test/java/com/adzerk/sdk/generated/model/PlacementTest.java b/src/test/java/com/adzerk/sdk/generated/model/PlacementTest.java new file mode 100644 index 0000000..bfe211e --- /dev/null +++ b/src/test/java/com/adzerk/sdk/generated/model/PlacementTest.java @@ -0,0 +1,233 @@ +/* + * Adzerk Decision API + * Adzerk Decision API + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package com.adzerk.sdk.generated.model; + +import com.adzerk.sdk.generated.model.SkipFilters; +import com.google.gson.TypeAdapter; +import com.google.gson.annotations.JsonAdapter; +import com.google.gson.annotations.SerializedName; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.openapitools.jackson.nullable.JsonNullable; +import org.junit.Assert; +import org.junit.Ignore; +import org.junit.Test; + + +/** + * Model tests for Placement + */ +public class PlacementTest { + private final Placement model = new Placement(); + + /** + * Model tests for Placement + */ + @Test + public void testPlacement() { + // TODO: test Placement + } + + /** + * Test the property 'divName' + */ + @Test + public void divNameTest() { + // TODO: test divName + } + + /** + * Test the property 'networkId' + */ + @Test + public void networkIdTest() { + // TODO: test networkId + } + + /** + * Test the property 'siteId' + */ + @Test + public void siteIdTest() { + // TODO: test siteId + } + + /** + * Test the property 'adTypes' + */ + @Test + public void adTypesTest() { + // TODO: test adTypes + } + + /** + * Test the property 'zoneIds' + */ + @Test + public void zoneIdsTest() { + // TODO: test zoneIds + } + + /** + * Test the property 'campaignId' + */ + @Test + public void campaignIdTest() { + // TODO: test campaignId + } + + /** + * Test the property 'flightId' + */ + @Test + public void flightIdTest() { + // TODO: test flightId + } + + /** + * Test the property 'adId' + */ + @Test + public void adIdTest() { + // TODO: test adId + } + + /** + * Test the property 'clickUrl' + */ + @Test + public void clickUrlTest() { + // TODO: test clickUrl + } + + /** + * Test the property 'properties' + */ + @Test + public void propertiesTest() { + // TODO: test properties + } + + /** + * Test the property 'eventIds' + */ + @Test + public void eventIdsTest() { + // TODO: test eventIds + } + + /** + * Test the property 'overrides' + */ + @Test + public void overridesTest() { + // TODO: test overrides + } + + /** + * Test the property 'contentKeys' + */ + @Test + public void contentKeysTest() { + // TODO: test contentKeys + } + + /** + * Test the property 'count' + */ + @Test + public void countTest() { + // TODO: test count + } + + /** + * Test the property 'proportionality' + */ + @Test + public void proportionalityTest() { + // TODO: test proportionality + } + + /** + * Test the property 'ecpmPartition' + */ + @Test + public void ecpmPartitionTest() { + // TODO: test ecpmPartition + } + + /** + * Test the property 'ecpmPartitions' + */ + @Test + public void ecpmPartitionsTest() { + // TODO: test ecpmPartitions + } + + /** + * Test the property 'eventMultiplier' + */ + @Test + public void eventMultiplierTest() { + // TODO: test eventMultiplier + } + + /** + * Test the property 'skipSelection' + */ + @Test + public void skipSelectionTest() { + // TODO: test skipSelection + } + + /** + * Test the property 'adQuery' + */ + @Test + public void adQueryTest() { + // TODO: test adQuery + } + + /** + * Test the property 'floorPrice' + */ + @Test + public void floorPriceTest() { + // TODO: test floorPrice + } + + /** + * Test the property 'floorCpc' + */ + @Test + public void floorCpcTest() { + // TODO: test floorCpc + } + + /** + * Test the property 'skipFilters' + */ + @Test + public void skipFiltersTest() { + // TODO: test skipFilters + } + +} diff --git a/src/test/java/com/adzerk/sdk/generated/model/PricingDataTest.java b/src/test/java/com/adzerk/sdk/generated/model/PricingDataTest.java new file mode 100644 index 0000000..1fd547f --- /dev/null +++ b/src/test/java/com/adzerk/sdk/generated/model/PricingDataTest.java @@ -0,0 +1,83 @@ +/* + * Adzerk Decision API + * Adzerk Decision API + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package com.adzerk.sdk.generated.model; + +import com.google.gson.TypeAdapter; +import com.google.gson.annotations.JsonAdapter; +import com.google.gson.annotations.SerializedName; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.IOException; +import org.junit.Assert; +import org.junit.Ignore; +import org.junit.Test; + + +/** + * Model tests for PricingData + */ +public class PricingDataTest { + private final PricingData model = new PricingData(); + + /** + * Model tests for PricingData + */ + @Test + public void testPricingData() { + // TODO: test PricingData + } + + /** + * Test the property 'price' + */ + @Test + public void priceTest() { + // TODO: test price + } + + /** + * Test the property 'clearPrice' + */ + @Test + public void clearPriceTest() { + // TODO: test clearPrice + } + + /** + * Test the property 'revenue' + */ + @Test + public void revenueTest() { + // TODO: test revenue + } + + /** + * Test the property 'rateType' + */ + @Test + public void rateTypeTest() { + // TODO: test rateType + } + + /** + * Test the property 'eCPM' + */ + @Test + public void eCPMTest() { + // TODO: test eCPM + } + +} diff --git a/src/test/java/com/adzerk/sdk/generated/model/SkipFiltersTest.java b/src/test/java/com/adzerk/sdk/generated/model/SkipFiltersTest.java new file mode 100644 index 0000000..01ca5da --- /dev/null +++ b/src/test/java/com/adzerk/sdk/generated/model/SkipFiltersTest.java @@ -0,0 +1,107 @@ +/* + * Adzerk Decision API + * Adzerk Decision API + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package com.adzerk.sdk.generated.model; + +import com.google.gson.TypeAdapter; +import com.google.gson.annotations.JsonAdapter; +import com.google.gson.annotations.SerializedName; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.IOException; +import org.junit.Assert; +import org.junit.Ignore; +import org.junit.Test; + + +/** + * Model tests for SkipFilters + */ +public class SkipFiltersTest { + private final SkipFilters model = new SkipFilters(); + + /** + * Model tests for SkipFilters + */ + @Test + public void testSkipFilters() { + // TODO: test SkipFilters + } + + /** + * Test the property 'distance' + */ + @Test + public void distanceTest() { + // TODO: test distance + } + + /** + * Test the property 'facet' + */ + @Test + public void facetTest() { + // TODO: test facet + } + + /** + * Test the property 'geodistance' + */ + @Test + public void geodistanceTest() { + // TODO: test geodistance + } + + /** + * Test the property 'geolocation' + */ + @Test + public void geolocationTest() { + // TODO: test geolocation + } + + /** + * Test the property 'keyword' + */ + @Test + public void keywordTest() { + // TODO: test keyword + } + + /** + * Test the property 'location' + */ + @Test + public void locationTest() { + // TODO: test location + } + + /** + * Test the property 'placementLimit' + */ + @Test + public void placementLimitTest() { + // TODO: test placementLimit + } + + /** + * Test the property 'siteZone' + */ + @Test + public void siteZoneTest() { + // TODO: test siteZone + } + +} diff --git a/src/test/java/com/adzerk/sdk/generated/model/UserTest.java b/src/test/java/com/adzerk/sdk/generated/model/UserTest.java new file mode 100644 index 0000000..266bb26 --- /dev/null +++ b/src/test/java/com/adzerk/sdk/generated/model/UserTest.java @@ -0,0 +1,51 @@ +/* + * Adzerk Decision API + * Adzerk Decision API + * + * The version of the OpenAPI document: 1.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ + + +package com.adzerk.sdk.generated.model; + +import com.google.gson.TypeAdapter; +import com.google.gson.annotations.JsonAdapter; +import com.google.gson.annotations.SerializedName; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.IOException; +import org.junit.Assert; +import org.junit.Ignore; +import org.junit.Test; + + +/** + * Model tests for User + */ +public class UserTest { + private final User model = new User(); + + /** + * Model tests for User + */ + @Test + public void testUser() { + // TODO: test User + } + + /** + * Test the property 'key' + */ + @Test + public void keyTest() { + // TODO: test key + } + +}